Decompiladores
I.T. Informtica de Sistemas
Traductores
Manuel Martn Salvador
[email protected]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