Está en la página 1de 21

Decompiladores

I.T. Informtica de Sistemas


Traductores
Manuel Martn Salvador
draxus@correo.ugr.es
http://draxus.org

Qu es un decompilador?

Es un programa que realiza la operacin


inversa de un compilador: obtener el
cdigo fuente de un programa compilado

Por qu decompilar?

Para arreglar bugs (errores)

Para encontrar vulnerabilidades

Para buscar malware

Para aprender

Por interoperabilidad

Para optimizar el cdigo

Para mejorar el programa

Por si has perdido el cdigo

Es legal?
La licencia de la mayora de los programas
propietarios prohben explcitamente la
decompilacin, pero en algunos pases hay leyes
que la permiten para los siguientes casos:

Para propsitos de interoperabilidad con otro


software o hardware
Para corregir errores en aquellos casos en el que
el propietario no pueda hacerlos
Para saber si se estn usando algoritmos
protegidos por patentes

Es posible?

Muchos creemos que de la misma forma que no se puede


obtener una vaca de una hamburguesa, tampoco se puede
obtener el cdigo de un programa binario.
Si bien es cierto que no todo programa se puede decompilar,
hay casos en los que podemos obtener un cdigo til.
La verdad es que la mayora de los decompiladores actuales slo
son capaces de usarse en programas preparados y no en el
MundoReal(TM)

Es posible?
Cdigo C

void main()
{
int i, j, k;
i = 10;
j = 20;
k = i*j + 5;
}

Ensamblador

Ensamblador
optimizado

;---- i = 10;
mov si, 10
;---- j = 20;
mov di, 20
;---- k = i*j + 5;
mov ax, si
mov bx, di
mul bx
add ax, 5
mov [bp+6], ax

;---- k = i*j + 5;
mov ax, 10
mov bx, 20
mul bx
add ax, 5
mov [bp+6], ax

Es posible?
Cdigo C

if (i>20){
j=30;
}
else{
j=40;
}
j++;

Ensamblador 1

cmp [bp+2], 20
jle lab1
mov [bp+4], 30
jmp lab2
lab1:
mov [bp+4], 40
lab2:
inc [bp+4]

Ensamblador 2

cmp [bp+2], 20
jg lab1
jmp lab2
lab1:
mov [bp+4], 30
jmp lab3
lab2:
mov [bp+4], 40
lab3:
inc [bp+4]

Cmo funciona?
binario
anlisis sintctico
anlisis semntico
generacin de cdigo intermedio
generacin del grafo del flujo de control
anlisis del flujo de datos
anlisis del flujo de control
generacin de cdigo

cdigo de alto nivel

Cmo funciona?
1 Averiguar el compilador
2 Encontrar el main()
3 Definir las funciones
4 Agrupar el cdigo en asignaciones,
condiciones, saltos y llamadas a
funciones.

Cmo funciona?
Asignacin

mov ax, [bp+4]


mov bx, 20
mul bx
add ax, 4
mov [bp+4], ax

i = ( i*20 ) + 4;

Cmo funciona?
Saltos
mov ax, [bp+4]
cmp ax, 10
jnz lab1
mov bx, 15
mov [bp+2], bx
jmp lab2
lab1:
mov bx,20
mov [bp+2], bx
lab2:

if (i != 10) goto lab1;


j = 15;
goto lab2;
lab1:
j = 20;
lab2:

if (i!= 10){
j = 20;
}
else{
j = 15;
}

Cmo funciona?
Llamada a funciones

mov ax, [bp+4];


push ax
mov ax, [bp+2];
push ax
call _func
mov [bp+4], ax

i = func(j, i);

Tipos de decompiladores

Cdigo mquina

Ensamblador

Delphi

Visual Basic

Java

.NET

Python

Flash

C/C++

Decompiladores Java

Jdec (libre)

JODE (libre)

Jad (gratis)

Mocha (gratis, obsoleto)

JreversePro (libre)

ClassCracker 3 (comercial)

DJ Java Decompiler (gratis)

Ms en http://java-decompiler.com

DEMO!

Decompiladores .NET

Salamander (.NET 2.0 comercial)

Anakrino (.NET 1.1)

LSW DotNet-Lab (decompilador, ofuscador y otros)

Lutz Roeder's Programming.NET (comercial)

Dis# (.NET 2.0 comercial)

Spices.net (.NET 2.0 decompilador, ofuscador y otros;


comercial)
Decompiler.NET (.NET 2.0 comercial)

Decompiladores Flash

Sothink SWF Decompiler (gratis)


http://www.sothink.com/product/flashdecompiler/
Gordon Flash Decompiler (comercial)
http://www.futurecandy.net/
DEMO!

Qu pasa con C/C++?


Los compiladores de Java, .NET y Flash no generan cdigo binario, si
no bytecode, esto es, cdigo para ser ejecutable sobre sus
mquinas virtuales. Por eso estos lenguajes son multiplataforma.
En cambio, los compiladores de C generan cdigo optimizado en
binario para un procesador determinado (x86, AMD64, SPARC...)
De esta manera, es mucho ms difcil decompilar programas en C.
La nica documentacin hoy da que he podido encontrar es una
tesis de Cristina Cifuentes (Universidad de Queensland) dedicada
exclusivamente a la decompilacin en C en la arquitectura i386.
Los pocos decompiladores existentes para C no son automticos, es
decir, necesitan la interaccin del usuario y slo funcionan con
programas pequeos.

Decompiladores C

dcc (i386,DOS)
http://www.itee.uq.edu.au/~cristina/dcc.html#example

boomerang
http://boomerang.sourceforge.net/cando.php?hidemenu

DisC (TurboC)
http://www.debugmode.com/dcompile/disc.htm

DEMO!

Cmo evitarlo?

Ofuscar el cdigo: convertir el programa en otro equivalente por


medio de transformaciones de forma que no se consiga cdigo til
al decompilar. Por ejemplo:

Que todos los nombres de funciones y


variables carezcan de sentido
Incluir ocasionalmente clculos y bucles
sin sentido
Esconder nmeros pequeos en
cadenas de texto
Crear mtodos grandes, en vez de
utilizar subrutinas
Distribuir los mtodos entre las
subclases

Tamperproofing: es una tcnica para ocultar el cdigo del


programa, aadiendo cdigo extra de manera que sea
imposible reobtener el cdigo original al decompilar.

Referencias

Program Transformation http://www.program-transformation.org

Wikipedia http://en.wikipedia.org/wiki/Decompiler

DebugMode http://www.debugmode.com/dcompile/

Criptonomicn http://www.iec.csic.es/CRIPTONOMICON/java/ofuscacion.html

Watermarking, Tamper-Proofing, and Obfuscation - Tools for Software Protection

http://www.cs.arizona.edu/~collberg/Research/Publications/CollbergThomborson2000a/index.html

Nolan, Godfrey - Decompiling Java

http://adrastea.ugr.es/search*spi/?searchtype=t&searcharg=Decompiling+Java

Imgenes
Tango Icons http://tango.freedesktop.org/ CC by-sa
Gray Cow http://openclipart.org/media/files/mairin/3076 PD

FIN

Gracias

También podría gustarte