Download Decompiladores - DraXus.org

Document related concepts
no text concepts found
Transcript
Decompiladores
I.T. Informática de Sistemas
Traductores
Manuel Martín Salvador
[email protected]
http://draxus.org
¿Qué es un decompilador?
Es un programa que realiza la operación
inversa de un compilador: obtener el
código 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 código
●
Para mejorar el programa
●
Por si has perdido el código
¿Es legal?
La licencia de la mayoría de los programas
propietarios prohíben explícitamente la
decompilación, pero en algunos países hay leyes
que la permiten para los siguientes casos:
✔
✔
✔
Para propósitos 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 están 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 código de un programa binario.
Si bien es cierto que no todo programa se puede decompilar,
hay casos en los que podemos obtener un código útil.
La verdad es que la mayoría de los decompiladores actuales sólo
son capaces de usarse en programas preparados y no en el
MundoReal(TM)
¿Es posible?
Código 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?
Código 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]
¿Cómo funciona?
binario
análisis sintáctico
análisis semántico
generación de código intermedio
generación del grafo del flujo de control
análisis del flujo de datos
análisis del flujo de control
generación de código
código de alto nivel
¿Cómo funciona?
1º Averiguar el compilador
2º Encontrar el main()
3º Definir las funciones
4º Agrupar el código en asignaciones,
condiciones, saltos y llamadas a
funciones.
¿Cómo funciona?
Asignación
mov ax, [bp+4]
mov bx, 20
mul bx
add ax, 4
mov [bp+4], ax
i = ( i*20 ) + 4;
¿Cómo 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;
}
¿Cómo 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
●
Código máquina
●
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)
●
Más 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 código binario, si
no bytecode, esto es, código para ser ejecutable sobre sus
máquinas virtuales. Por eso estos lenguajes son multiplataforma.
En cambio, los compiladores de C generan código optimizado en
binario para un procesador determinado (x86, AMD64, SPARC...)
De esta manera, es mucho más difícil decompilar programas en C.
La única documentación hoy día que he podido encontrar es una
tesis de Cristina Cifuentes (Universidad de Queensland) dedicada
exclusivamente a la decompilación en C en la arquitectura i386.
Los pocos decompiladores existentes para C no son automáticos, es
decir, necesitan la interacción del usuario y sólo funcionan con
programas pequeños.
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!
¿Cómo evitarlo?
●
Ofuscar el código: convertir el programa en otro equivalente por
medio de transformaciones de forma que no se consiga código útil
al decompilar. Por ejemplo:
➔
➔
➔
➔
➔
●
Que todos los nombres de funciones y
variables carezcan de sentido
Incluir ocasionalmente cálculos y bucles
sin sentido
Esconder números pequeños en
cadenas de texto
Crear métodos grandes, en vez de
utilizar subrutinas
Distribuir los métodos entre las
subclases
Tamperproofing: es una técnica para ocultar el código del
programa, añadiendo código extra de manera que sea
imposible reobtener el código original al decompilar.
Referencias
●
Program Transformation http://www.program-transformation.org
●
Wikipedia http://en.wikipedia.org/wiki/Decompiler
●
DebugMode http://www.debugmode.com/dcompile/
●
Criptonomicón 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
Imágenes
Tango Icons http://tango.freedesktop.org/ CC by-sa
Gray Cow http://openclipart.org/media/files/mairin/3076 PD
FIN
Gracias