Vous êtes sur la page 1sur 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 Ensamblador Ensamblador optimizado

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

;---- 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 Ensamblador 1 Ensamblador 2

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

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

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 Nolan, Godfrey - Decompiling Java
http://www.cs.arizona.edu/~collberg/Research/Publications/CollbergThomborson2000a/index.html

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