You are on page 1of 18

Desmontaje, descompilacin y modificar los ejecutables

07 de marzo, 2013Leave un commentGo a los comentarios

Email
La motivacin para escribir
Como desarrolladores profesionales, creamos productos. Ponemos en prctica
ideas, que por lo general son impulsados desde algn antojo de negocios para
su aceptacin en el mercado mundial, de su grupo objetivo. Tratamos de
ofrecer soluciones elegantes, rpidos y fiables y, sinceramente, no nos gusta
cuando alguien utilice nuestro trabajo sin por lo menos decir "gracias, has
realmente hizo una gran cosa". Es por eso que tenemos que proteger nuestro
trabajo. Y para hacer eso, debemos ser conscientes de los vectores comunes
usados por los crackers para hackear nuestro software.

En este artculo, voy a mostrar cmo desmontar y descompilar ejecutable pura


escrito en C ++, entre otras cosas interesantes relacionadas con entornos
gestionados y no gestionados.

En primer lugar, vamos a necesitar un poco de una teora as que realmente


podemos entender lo que estamos haciendo y por qu.

Diferencia entre las bibliotecas estticas y dinmicas

Histricamente, las bibliotecas estticas son el primer tipo de bibliotecas en


aparecer. En Windows puedes encontrarlos por las extensiones .lib y .dll. La

principal diferencia entre la esttica y las libreras dinmicas es que la


biblioteca esttica est incrustado directamente en el ejecutable, aumentando
as su tamao. La biblioteca dinmica, por otro lado, es un archivo separado
que carga una imagen diferente de s mismo en la memoria cada vez que se
llama a partir de un programa. La dll es uno, pero la imagen es diferente y de
esta manera se evitan los problemas concurrentes entre procesos. Esto
tambin permite actualizaciones ms manejables, pero implica una
degradacin del rendimiento ligero, que no se considera un gran problema.

En general, las bibliotecas dinmicas son el enfoque preferido para


aplicaciones de construccin. Incluso en las ltimas versiones de Visual Studio
no hay ninguna opcin para crear una biblioteca esttica; por defecto todas las
bibliotecas se consideran dinmico. Sin embargo, todava es posible crear
bibliotecas estticamente enlazados a travs del entorno de consola.

Los registros de la CPU


Los registros de la CPU son la memoria ms rpida ubicado en la propia CPU.
Bsicamente, se utilizan por cada baja - Nivel de operacin, son el
almacenamiento de datos sper rpida del procesador. Para arquitecturas x86
por lo general hay 8 registros largos de 32 bits, 2 de los cuales tienen el
puntero base y el puntero de pila que se utilizan para la navegacin entre las
instrucciones. Los registros son incluso ms rpido que la RAM esttica (SRAM,
conocida como la cach) y, por supuesto, la RAM dinmica.

registros diagrama

Rpida visin general de la lengua Asamblea


Para este artculo tenemos que saber algunas cosas bsicas sobre el lenguaje
ensamblador para que podamos comprender realmente lo que estamos
haciendo. El lenguaje ensamblador es estructurado y se basa en instrucciones
muy primitivos, que se dividen en los siguientes tipos generales (voy a
describir slo las operaciones bsicas):

Instrucciones de movimiento de datos


mov - se usa para copiar datos desde una clula a otra, entre los registros, o
entre un registro y una celda de la memoria
push / pop - funciona en la pila de memoria compatible

Instrucciones aritmticas
aadir / sub / inc - operaciones aritmticas. Puede funcionar con constantes,
registros o clulas de memoria

Instrucciones de flujo de control

jmp - salto a la etiqueta o una clula en la memoria


jb - salto si se cumple la condicin
je - salto al igual
JNE - salto cuando no igual
jz - saltar al ltimo resultado fue cero
jg - salto cuando mayor que
JGE - salto cuando es mayor o igual que
jl - salto cuando menos de
JLE - saltar al menor o igual a
cmp - comparar los valores de los dos operandos especificados
llamar / ret - estos dos implementar la llamada de rutina y la de regreso

Las instrucciones de flujo de control son lo que ms nos interesa aqu. Para ver
un tutorial completo sobre el lenguaje ensamblador x86, consulte este artculo.

Desmontaje y modificacin de un C ++ ejecutable


Para nuestro ejemplo he creado una sencilla aplicacin C ++ con E / S bsica.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21

22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include "stdafx.h"
#include <iostream>
#include <sstream>

using namespace std;

void execute ()
{
nmeros de cuerda;
int bodega;

para (;;)
{
cout << "Introduzca el cdigo: \ n";
getline (cin, nmeros);

si (nmeros! = "82634")
{
cout << ". \ nIntente nuevo \ n";
}
ms
{
cout << "Cdigo aceptadas";

descanso;
}
}

cin >> sostener;


}

int tmain (int argc, _TCHAR * argv [])


{
execute ();

return 0;

}
Vamos a tener que desmontar, depuracin y, opcionalmente, descompilar
nuestro ejemplo. Descargar las siguientes herramientas que nos ayudarn a
hacer eso:

OllyDbg
IDA
He compilado este ejemplo que se puede descargar desde aqu. Cuando
empezamos a ella vemos la siguiente aplicacin de consola simple:

descompilacin-consola de aplicacin

Se pide un poco de entrada predefinido. Si se introduce un cdigo incorrecto, la


siguiente salida se presenta:

"Intntalo de nuevo"

Vamos a pretender que no tenemos el cdigo fuente y no sabemos el cdigo.


Entonces, qu podemos hacer? Obviamente, tenemos un bucle aqu con algn
tipo de control dentro de la cual determina si el programa debe romper con el
bucle o no.

Tambin nos dieron algunas cadenas:

"Por favor introduzca el cdigo:"


"Intntalo de nuevo"

Depurar el ejecutable
Inicie el depurador OllyDbg (con privilegios de administrador) y abra el exe.
(Click para agrandar)

OllyDbg-tutorial-01

Lo que vemos en la ventana superior izquierda es el cdigo de la mquina


desmontada. En otras palabras, usted ve las instrucciones escritas en el
lenguaje ensamblador. Debajo de eso vemos la ventana con el cdigo binario
se expresan en valores hexademical, ya la derecha vemos la ventana con los
registros de la CPU.

Localice las condiciones de bucle


As que ahora que se ha cargado nuestro exe, comenz, y el depurador se
adjunta, tenemos que encontrar el lugar exacto en el cdigo ensamblador
cuando el control se hace. Para ello podemos utilizar las cadenas que la
interfaz de usuario nos muestra. Haga clic derecho en la vista cdigo
ensamblador> Buscar> Todos Cuerdas referenciados. Encuentra la cadena
"Intntalo de nuevo" y haga doble clic en l. La vista de conjunto localizar la
instruccin exacta que imprime esa cadena en la consola. Tambin podemos
ver el "Cdigo aceptadas" Instrucciones relacionadas unas filas ms adelante.
Est claro donde reside el bucle.

Modificar las instrucciones de montaje


El siguiente paso es modificar algunas instrucciones de montaje. Vemos una
gran cantidad de instrucciones, pero estamos ms interesados en los
relacionados con jmp-que controlan la posicin del puntero de pila. Si nos
desplazamos un poco arriba podemos ver "Por favor escriba el siguiente cdigo
..." instruccin. Para escapar del bucle, tenemos que cambiar la direccin de
destino de una de las instrucciones jmp que se ejecutan a travs.

Tomemos el jb en "00D613A4", haga clic dos veces y cambiar la direccin de


memoria de destino a "00D613C7" - el que justo antes del "Cdigo aceptadas"
de texto ASCII, lo que obviamente se abre un arroyo.

Para guardarlo, haga clic derecho en la ventana de reunin y de prensa "Copiar


al ejecutable" -> "Seleccin" mientras ests en la fila modificada.

Una alternativa a OllyDbg. Qu es la AIF?


La AIF es un depurador y un desensamblador como OllyDbg. Pero ofrece una
visin ms fcil de usar del cdigo ensamblador, y tambin puede actuar como
un descompilador. Por ejemplo, compruebe la siguiente captura de pantalla de
su vista de conjunto:

IDA-grfica

Como se puede ver, es ms estructurado, los diversos saltos se visualizan


como nodos del grfico que facilita la navegacin.

Leer ms: El proceso de compilacin en C ++, Java y .Net

Descompilar un C ++ ejecutable usando la AIF


Lo que nos lleva a la pregunta "Es posible descompilar imagen nativa de una
manera que un cdigo fuente comprensible puede generar?". La respuesta
corta es no.

Lo que genera es pseudo cdigo C. Te voy a ensear la salida del programa de


ejemplo pequeo:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49

50
51
52
53
54
55
56
57
58
59
60
61
62
63
{
std__operator ___ std__char_traits_char_ (std__cout, "Por favor introduzca el
cdigo: \ n");
v1 = std__basic_ios_char_std__char_traits_char ____ ampliar ((_ DWORD)
std__cin + (_DWORD) * (y std__cin + 1), 10);
std__getline_char_std__char_traits_char__std__allocator_char_ (v1);
v0 = (int *) y v13;
si (v15> = 0x10)
v0 = v13;
v2 = 5;
si (v14 <5)
v2 = v14;
if (! v2)

Goto LABEL_21;
v3 = (int) "82634";
v5 = (unsigned int) v2 <4;
v4 = v2 - 4;
si (v5)
{
LABEL_10:
si (v4 == -4)
Goto LABEL_19;
}
ms
{
while (* v0 == * (* _ DWORD) v3)
{
++ V0;
v3 + = 4;
v6 = (unsigned int) v4 <4;
v4 - = 4;
si (v6)
Goto LABEL_10;
}
}
v7 = * (_ BYTE *) v0 <* (_ BYTE *) v3;
si (* (_ BYTE *) v0! = * (_ BYTE *) v3
|| V4! = -3
&& ((V8 = * ((_ BYTE *) v0 + 1), v7 = v8 <* (_ BYTE *) (v3 + 1), v8! = * (_
BYTE *) (v3 + 1))

|| V4! = -2
&& ((V9 = * ((_ BYTE *) v0 + 2), v7 = v9 <* (_ BYTE *) (v3 + 2), v9! = * (_
BYTE *) (v3 + 2))
|| V4! = -1 && (V10 = * ((_ BYTE *) v0 + 3), v7 = v10 <* (_ BYTE *) (v3 +
3),
v10! = * (_ BYTE *) (v3 + 3)))))
{
v11 = -v7 | 1;
Goto LABEL_20;
}
LABEL_19:
v11 = 0;
LABEL_20:
si (v11)
Goto LABEL_23;
LABEL_21:
si (v14> = 5 && v14 == 5)
descanso;
LABEL_23:
std__operator ___ std__char_traits_char_ (std__cout, "\ nIntente de nuevo. \
n");
}
std__operator ___ std__char_traits_char_ (std__cout, "Cdigo aceptado");
resultado = std__basic_istream_char_std__char_traits_char ____ __ operador
(std__cin, y v16);
si (v15> = 0x10)
resultado = operador delete (v13);
resultado regresar;

}
As, podemos descomponer una imagen nativa en un cdigo fuente
comprensible? Depende de su idea de "comprensible". Usted tiene que dedicar
mucho tiempo y hay que poseer un conocimiento serio de la API para el uso por
el sistema de operacin, junto con la comprensin de la sintaxis de C y de la
Asamblea.

Aplicaciones Decompiling escritas en entornos administrados


Aplicaciones .Net Decompiling tambin se hace con depuradores y
descompiladores para .Net como reflector, por ejemplo (que es en realidad
pagados por algn tiempo en).

Pero el exe o dll que se ve en el escritorio es, no cdigo binario intermedio


(suponiendo que no utiliza NGen). Aplicaciones descompilacin C ++ es difcil
porque el compilador produce primer cdigo de lenguaje ensamblador
orientado a la arquitectura especfica del procesador, y al lado del ensamblador
obtiene ese cdigo y produce la imagen nativa real. Y como hemos visto,
cdigo ensamblador descompilacin es difcil.

El MSIL, en el otro lado, est muy cerca de el cdigo fuente real de su


aplicacin, por ejemplo, escrita con C #. Puede utilizar programas como
Reflector descompilar ellos, junto con algunos plugins para modificar
realmente.

As que en realidad no es tan duro de roer una aplicacin

S, no lo es. Con la diferencia de que este proceso en una aplicacin real ser
ms tiempo. Sabes una nica aplicacin independiente popular que no se ha

roto? Es por eso que usted necesita para pensar en mejores formas de proteger
su software. Entender una cosa simple:

Cada aplicacin puede ser roto, si usted tiene acceso a su imagen materna, al
igual que cualquier contrasea de equipo puede romperse, si tiene acceso
fsico a la mquina.

Por supuesto, hay tcnicas que nos permite reducir la velocidad por un
atacante, que podra o no ser suficiente. Pero "desaceleracin" no significa "la
prevencin", y eso es un tema de otro artculo.

Eso es de mi relacin con el tema de la descompilacin, espero que hayan


aprendido algo nuevo hoy y, con suerte, este conocimiento le ayudar a
proteger mejor su software. Conoce a tu enemigo antes de ir a la batalla.
Debido a que es la batalla por su propio tiempo.

Sobre el autor: Kosta Hristov (34 mensajes)


Hola! Mi nombre es Kosta Hristov y actualmente vivo en Londres, Inglaterra. He
estado trabajando como ingeniero de software durante los ltimos 6 aos en
diferentes proyectos mviles, de escritorio y de TI web. Empec este blog hace
casi un ao con la idea de ayudar a los desarrolladores de todo el mundo en su
da a da las tareas de programacin, el intercambio de conocimientos sobre
diversos temas. Si usted encuentra mis artculos interesantes y quieres saber
ms acerca de m, no dude en ponerse en contacto conmigo a travs de los
vnculos sociales de abajo. ;)

Autor Info

Artculos Relacionados:

El proceso de compilacin en C ++, Java y .Net

Al igual que el artculo? Comprtelo! ;)

Tutorial: Creacin de un sitio web esttico Edicin del archivo hosts en Windows
7

Comentarios (48) Dejar un comentario

Dimitar
07 de marzo 2013 a las 20:42 | # 1 Responder | Citar
Gran artculo, muy til para todos los desarrolladores de software. Gracias por
la publicacion.

Kosta Hristov
31 de mayo 2013 a las 19:16 | # 2 Responder | Citar
Hola Dimitar,
Me alegro de que te guste. ;) Si usted tiene algunas notas o recomendaciones,
no dude en escribirlos.

Volodymyr
17 de junio 2013 a las 19:32 | # 3 Responder | Citar
Esto es exactamente lo que estaba buscando. Cul es el mejor software /
prctica por ah descompilar / desmontar un ejecutable? Cul usas?

Kosta Hristov
22 de junio 2013 a las 18:31 | # 4 Responder | Citar

Hola Volodymyr,
Depende de la unidad de compilacin. Si se trata de Java / .Net que muy
probablemente ser de cdigo de bytes / MSIL por lo que ser muy fcil de
descomponer, a menos ofuscado. Puede utilizar herramientas como reflector
para .Net. Si se trata de C / C ++, OllyDbg y la AIF son uno de los mejores, sin
embargo, usted no tiene un montn de opciones aqu.
Saludos,
Kosta

Alireza
11 de julio 2013 a las 09:36 | # 5 Responder | Citar
Hola querido
Tengo un archivo ejecutable con foto y tengo que salvar a esta foto en la PC por
favor me ayude
Nota: exe crear por foto deluxe

Kosta Hristov
11 de julio 2013 a las 12:52 | # 6 Responder | Citar
Hola Alireza,
Los mtodos que he descrito en este tutorial son un poco bajo nivel de bits
para su tarea. Supongo que ests hablando PicturesToExe lujo?
En ese caso, usted probablemente ha intentado utilizar el mismo programa
para extraer las fotos. Tienes dos opciones:
1. Descargar esta herramienta y probarlo en el ejecutable con las imgenes
http://www.picturestoexe.com/forums/index.php?
app=core&module=attach&section=attach&attach_id=3655
2. Basta con abrir la presentacin en pantalla completa y hacer una captura de
pantalla de la pantalla. A continuacin, utilice pintura para pegarlo. Es posible
que tenga alguna cualidad perdi, pero depende de la propia imagen.
Buena suerte

You might also like