Está en la página 1de 6

Decompilador

Decompilador
Un decompilador (del ingls "decompiler", a veces castellanizado descompilador) es un programa de ordenador que realiza la operacin inversa a un compilador. Esto es, traducir cdigo o informacin de bajo nivel de abstraccin (slo diseado para ser ledo por un ordenador, ej cdigo mquina) a un lenguaje o medio de mayor nivel de abstraccin (usualmente diseado para ser ledo por un humano, ej cualquier lenguaje de programacin de alto nivel).

Introduccin
El trmino "decompilar" es ms comnmente aplicado a programas cuya funcin es la de traducir un ejecutable (la salida de un compilador) a cdigo fuente en un lenguaje de alto nivel, que, cuando compile, volver a producir un ejecutable cuyo comportamiento es el mismo que el del ejecutable original. En comparacin, un desensamblador traduce un ejecutable a lenguaje ensamblador (y este cdigo puede volver a ser ensamblado en un programa ejecutable). Decompilar es el acto de utilizar un decompilador, aunque si es usado como nombre, puede referirse a la salida de un decompilador. Puede ser usado para recuperar cdigo fuente, y es muy til en casos de seguridad del ordenador, interoperatividad y correccin de errores.[1] El xito de la decompilacin depende de la cantidad de informacin presente en el cdigo que est siendo decompilado y en la sofisticacin del anlisis realizado sobre l. Los formatos de bytecode utilizados por muchas mquinas virtuales (como la Java Virtual Machine o el lenguaje .NET (.NET Framework Common Language Runtime)) en ocasiones incluyen metadatos en el alto nivel que hacen que la decompilacin se ms flexible. Los lenguajes mquina normalmente tienen mucha menos metadata, y son por lo tanto mucho ms difciles de compilar. Algunos compiladores y herramientas de post-compilacin producen cdigo ofuscado (esto quiere decir que intentan producir una salida que es muy difcil de decompilar). Esto hace que sea ms difcil revertir el cdigo del ejecutable.

Diseo
Los decompiladores pueden ser pensados como un conjunto de fases, en las que cada una de ellas contribuye de una forma especfica en el proceso de decompilacin.

Cargador
La primera fase de decompilacin es el cargador, que recibe el cdigo mquina o el archivo binario de un lenguaje intermedio. El cargador debera ser capaz de descubrir datos bsicos sobre el programa, como por ejemplo la arquitectura (Pentium, PowerPC, etc), y el punto de entrada. En muchos casos, debera ser capaz de encontrar la funcin main de un programa en C, que es el comienzo del cdigo escrito por el usuario. Esto excluye el cdigo de inicializacin de la ejecucin, que no debera ser decompilado si es posible.

Decompilador

Desensamblado
La siguiente fase lgica es el desensamblado del cdigo mquina, ste pasa a una representacin mquina independiente (IR). Por ejemplo, la instruccin Pentium mov eax, [ebx+0x04]

debera ser traducida a IR eax := m[ebx+4];

Secuencias idiomticas
Las secuencias de cdigo mquina idiomticas es un conjunto de secuencias de cdigo cuya semntica no aparenta instrucciones semnticamente individuales. Tanto como parte de la fase de desensamblado, o como parte del anlisis posterior, estas secuencias idiomticas necesitan ser traducidas a su equivalente en cdigo IR (representacin mquina independiente). Por ejemplo, en lenguaje ensamblador x86:
cdq xor sub eax eax, edx eax, edx ; edx est almacenado en el registro de extensin de eax

podra ser traducido a eax := abs(eax);

Anlisis del programa


Se pueden aplicar varios tipos de anlisis al IR. De forma particular, la propagacin de expresiones combina la semntica de muchas instrucciones en expresiones ms complejas. Por ejemplo, mov add sub eax,[ebx+0x04] eax,[ebx+0x08] [ebx+0x0C],eax

podra resultar en el siguiente cdigo IR despus de la progagacin de expresiones: m[ebx+12] := m[ebx+12] - (m[ebx+4] + m[ebx+8]); La expresin resultante luce como lenguaje de alto nivel, y adems ha eliminado el uso de los registros eax. Anlisis siguientes podran eliminar el registro ebx.

Anlisis de tipos
Un buen decompilador debera implementar un anlisis de tipos. Aqu, la forma en que se usan los registros o las regiones de memoria dan como resultado restricciones en el tipo de localidades. Por ejemplo, una instruccin and implica que el operando es un entero; los programas no usan tales operaciones sobre valores de punto flotante (excepto en cdigo especial de libreras) o en punteros. Una instruccin and da como resultado 3 restricciones; ambos operandos pueden ser enteros, o uno entero y el otro un puntero (en este caso; la tercera restriccin surge en el orden de los dos operandos cuando los tipos son diferentes). Pueden reconocerse varias expresiones de alto nivel, al conocer las estructuras o los arreglos. De todas formas, es difcil de distinguir muchas de las posibilidades por la libertad del cdigo mquina o tambin porque algunos lenguajes de alto nivel como C permiten casting y aritmtica de punteros. La seccin anterior podra dar como resultado el siguiente ejemplo en cdigo de alto nivel:

Decompilador struct T1* ebx; struct T1 { int v0004; int v0008; int v000C; }; ebx->v000C -= ebx->v0004 + ebx->v0008;

Estructuracin
La penltima fase de la decompilacin implica la estructuracin del cdigo IR en construcciones de alto nivel como ciclos while y estructuras condicionales if/then/else. Por ejemplo, el cdigo mquina xor l0002: or jge add mov jmp l0003: mov eax, eax ebx, ebx l0003 eax,[ebx] ebx,[ebx+0x4] l0002 [0x10040000],eax

podra traducirse como: eax = 0; while (ebx < 0) { eax += ebx->v0000; ebx = ebx->v0004; } v10040000 = eax; El cdigo no estructurado es ms difcil de traducir a cdigo estructurado. Algunas soluciones replican cdigo, o agregan variables booleanas. Vase el captulo 6 de.[2]

Generacin de cdigo
La fase final es la generacin de cdigo de alto nivel. Tal como un compilador puede tener varios lenguajes destinos para generar cdigo mquina de diferentes arquitecturas, un decompilador puede tener varios destinos de generacin de cdigo en diferentes lenguajes de alto nivel. Justo antes de la generacin del cdigo, es deseable permitir la edicin interactiva del cdigo IR, tal vez haciendo uso de alguna interfaz grfica de usuario. Esto puede permitir al usuario agregar comentarios, variables no genricas y nombres de funciones. Aun as, esto tambin se puede agregar en ediciones posteriores a la decompilacin. El usuario puede cambiar algunos aspectos estructurales, como por ejemplo, convertir un ciclo while a un ciclo for. Esto se puede cambiar con un simple editor de textos, o tambin se pueden usar herramientas de refactoring sobre el cdigo fuente. El usuario tambin necesitar agregar informacin que no se pudo reconocer durante la fase de anlisis de tipos, por ejemplo, modificar una expresin de memorias a un arreglo o a una estructura. Finalmente, se necesita corregir cdigo IR incorrecto, o hacer cambios para hacer que la salida de cdigo sea ms legible.

Decompilador

Aspectos legales
La mayora de los programas de ordenador estn cubiertos por las leyes del copyright. Aunque determinar con precisin qu cubre el copyright y qu no, difiere entre pases; la ley de copyright generalmente provee al autor (el/los programador/es o empleado/s) de una coleccin exclusiva de derechos sobre el programa. Estos derechos incluyen la posibilidad de realizar copias, incluyendo copias realizadas sobre la memoria RAM del ordenador. Como el proceso de decompilacin implica la realizacin de mltiples copias, ha sido prohibido generalmente sin autorizacin del propietario de los derechos. Sin embargo, la decompilacin es en ocasiones necesaria a la hora de buscar interoperatividad; las leyes de copyright en Europa y Estados Unidos que permiten en este caso la decompilacin hasta un cierto lmite. En Estados Unidos, las leyes del buen uso del copyright han sido utilizadas satisfactoriamente en casos de decompilacin. Por ejemplo, existi un caso entre Sega y Accolade, en el que finalmente se permita a Accolade la decompilacin de ciertas partes de cdigo siempre que no copiasen el mecanismo de juego utilizado por las consolas de Sega.[3] En Europa, la Directiva del Software de 1991 provee explcitamente derechos de decompilacin siempre y cuando se busque la interoperatividad entre programas. El resultado de un acalorado debate entre proteccionistas de software y desarrolladores independientes de cdigo, fue el Artculo 6, que permite la decompilacin slo si un nmero de condiciones se cumplen: Primero, el decompilador (en este caso referido al usuario que realiza la operacin de decompilar) debe tener licencia para usar el programa que se desea decompilar. Segundo, la decompilacin debe ser necesaria en los casos en los que se desee aadir interoperatividad ya sea al programa que se decompila o a programas que se van a comunicar con ste. La informacin sobre la interoperatividad de un programa no tiene porque estar disponible, pero s que se debe proporcionar informacin sobre su funcionamiento mediante manuales y documentacin de la API. Esta es una limitacin importante. El propsito de esta importante limitacin es principalmente incentivar a los desarrolladores a que documenten bien sus productos en el mbito de la interoperatividad. Ver.[4] Tercero, el proceso de decompilacin debe, si es posible, estar confinado a partes del programa que son relevantes para la interoperatividad. Como uno de los propsitos de la decompilacin es adquirir el conocimiento sobre la estructura de un programa, esta tercera limitacin es difcil de aplicar. Una vez ms, la responsabilidad recae sobre el decompilador. Adems, el Artculo 6 prescribe que la informacin obtenida a travs de la decompilacin no debe ser utilizada para otros propsitos y no puede ser dada a un tercero. Por encima de todo esto, el derecho provedo en el artculo 6 es interesante, puesto que especifica hasta donde se puede llegar en la industria del software con los decompiladores. Pocos casos sobre estos derechos de decompilacin se han visto en Europa. Esto puede ser interpretado de dos formas: 1. El derecho de compilacin no se usa frecuentemente y por lo tanto estas leyes son innecesarias. 2. Estos derechos funcionan tan bien y son tan claros que no dan lugar a dudas que planteen disputas entre empresas de software. En un reciente informe de la Directiva Europea del Software, la Comisin Europea apoyaba la segunda interpretacin.

Decompilador

Referencias
[1] (en ingls) "Porqu Decompilacin" (http:/ / www. program-transformation. org/ Transform/ WhyDecompilation) [2] C. Cifuentes. Tcnicas de Compilacin Inversa. Tesis PhD, Universidad de Tecnologa de Queensland, 1994. (disponible como postscript comprimido (http:/ / www. itee. uq. edu. au/ ~cristina/ dcc/ decompilation_thesis. ps. gz)) [3] (en ingls) La legalidad de la decompilacin (http:/ / www. program-transformation. org/ Transform/ LegalityOfDecompilation) [4] (en ingls) B. Czarnota y R.J. Hart, Proteccin legal de programas de ordenador en Europa: una gua para la directiva. 1991, Londres: Butterworths.

Enlaces externos
Este artculo fue creado a partir de la traduccin del artculo Decompiler de la Wikipedia en ingls, bajo licencia Creative Commons Atribucin Compartir Igual 3.0 y GFDL. (en ingls) Legalidad de la descompilacin (http://www.program-transformation.org/Transform/ LegalityOfDecompilation) (en ingls) Artculo de descompilacin (http://www.debugmode.com/dcompile)

Fuentes y contribuyentes del artculo

Fuentes y contribuyentes del artculo


Decompilador Fuente: http://es.wikipedia.org/w/index.php?oldid=49606135 Contribuyentes: Elabra sanchez, GermanX, Ignacio Marcoux, Jugones55, Muro de Aguas, 3 ediciones annimas

Licencia
Creative Commons Attribution-Share Alike 3.0 Unported //creativecommons.org/licenses/by-sa/3.0/