i.t. informática de sistemas traductoresdraxus.org/upload/decompiladores.pdf · python flash c/c++...

21
Decompiladores I.T. Informática de Sistemas Traductores Manuel Martín Salvador [email protected] http://draxus.org

Upload: lamthuan

Post on 08-Oct-2018

224 views

Category:

Documents


0 download

TRANSCRIPT

Decompiladores

I.T. Informática de SistemasTraductores

Manuel Martín [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

;---- 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

Ensamblador optimizado

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

¿Es posible?

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

Código C Ensamblador 1 Ensamblador 2

cmp [bp+2], 20 jle lab1

mov [bp+4], 30 jmp lab2lab1: mov [bp+4], 40lab2: inc [bp+4]

cmp [bp+2], 20 jg lab1 jmp lab2lab1: mov [bp+4], 30 jmp lab3lab2: mov [bp+4], 40lab3: 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?

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

i = ( i*20 ) + 4;

Asignación

¿Cómo funciona?

mov ax, [bp+4] cmp ax, 10 jnz lab1

mov bx, 15 mov [bp+2], bx jmp lab2lab1: mov bx,20 mov [bp+2], bxlab2:

if (i != 10) goto lab1; j = 15; goto lab2;lab1: j = 20;lab2:

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

Saltos

¿Cómo funciona?

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

i = func(j, i);

Llamada a funciones

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)

Sothink SWF Decompiler (gratis)http://www.sothink.com/product/flashdecompiler/

Gordon Flash Decompiler (comercial)http://www.futurecandy.net/

Decompiladores Flash

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

boomeranghttp://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

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

Imágenes

FIN

Gracias