Desensamblador
Un desensamblador es un programa informático que traduce el lenguaje de máquina a lenguaje ensamblador, la operación inversa a la de un ensamblador. Un desensamblador se diferencia de un descompilador, que apunta a un lenguaje de alto nivel en lugar de un lenguaje ensamblador. El desmontaje, la salida de un desensamblador, a menudo se formatea para que sea legible por humanos en lugar de ser adecuado para la entrada a un ensamblador, lo que lo convierte principalmente en una herramienta de ingeniería inversa.
Los usos comunes de los desensambladores incluyen la recuperación del código fuente de un programa cuya fuente original se perdió, la comprensión del funcionamiento interno del malware, la modificación de software (como la piratería de ROM) y el descifrado de software.
El código fuente del lenguaje ensamblador generalmente permite el uso de constantes y comentarios del programador. Por lo general, el ensamblador los elimina del código de máquina ensamblado. Si es así, un desensamblador que opera en el código de máquina produciría un desensamblador que carece de estas constantes y comentarios; la salida desensamblada se vuelve más difícil de interpretar para un ser humano que el código fuente anotado original. Algunos desensambladores proporcionan una función de comentario de código incorporada en la que la salida generada se enriquece con comentarios sobre las funciones de API llamadas o los parámetros de las funciones llamadas. Algunos desensambladores utilizan la información de depuración simbólica presente en archivos de objetos como ELF. Por ejemplo, IDA permite que el usuario humano invente símbolos mnemotécnicos para valores o regiones de código en una sesión interactiva: la percepción humana aplicada al proceso de desensamblaje a menudo es paralela a la creatividad humana en el proceso de escritura de código.
En plataformas CISC con instrucciones de ancho variable, puede ser válido más de un desmontaje. Los desensambladores no manejan código que varía durante la ejecución.
Problemas de desmontaje
Es posible escribir un desensamblador que produzca código que, cuando se ensamble, produzca exactamente el binario original; sin embargo, a menudo hay diferencias. Esto plantea exigencias a la expresividad del ensamblador. Por ejemplo, un ensamblador x86 elige arbitrariamente entre dos códigos binarios para algo tan simple como MOV AX,BX. Si el código original usa la otra opción, el código original simplemente no se puede reproducir en ningún momento dado. Sin embargo, incluso cuando se produce un desmontaje totalmente correcto, persisten los problemas si el programa requiere modificaciones. Por ejemplo, el código ensamblador puede generar la misma instrucción de salto en lenguaje de máquina para saltar a una ubicación específica (por ejemplo, para ejecutar un código específico) o para saltar una cantidad específica de bytes (por ejemplo, para saltar una rama no deseada). Un desensamblador no puede saber lo que se pretende y puede usar cualquier sintaxis para generar un desensamblador que reproduzca el binario original. Sin embargo, si un programador desea agregar instrucciones entre la instrucción de salto y su destino, es necesario comprender la operación del programa para determinar si el salto debe ser absoluto o relativo, es decir, si su destino debe permanecer en un valor fijo. ubicación, o moverse para omitir tanto las instrucciones originales como las añadidas.
Otro desafío es que no siempre es posible identificar qué partes del binario corresponden al código ejecutable y cuáles corresponden a los datos. Mientras que los formatos ejecutables comunes como ELF y PE dividen el binario en secciones ejecutables y de datos, otros formatos como los binarios planos no lo hacen, por lo que cualquier ubicación dada en el binario puede contener instrucciones ejecutables o datos no ejecutables, lo que dificulta decidir si debe desmontarse como instrucciones o dejarse como datos. Dado que las CPU generalmente permiten saltos dinámicos calculados en tiempo de ejecución, no siempre es posible identificar todas las ubicaciones posibles en el binario a las que se puede saltar y, por lo tanto, contienen instrucciones.
El cifrado se puede utilizar en algunos programas informáticos, especialmente como parte de la gestión de derechos digitales para impedir la ingeniería inversa y el cracking. Esto plantea un desafío adicional para el desmontaje, ya que el código debe descifrarse antes de desmontarse.
Ejemplos de desensambladores
Un desensamblador puede ser independiente o interactivo. Un desensamblador independiente, cuando se ejecuta, genera un archivo en lenguaje ensamblador que se puede examinar; uno interactivo muestra el efecto de cualquier cambio que el usuario haga inmediatamente. Por ejemplo, es posible que el desensamblador inicialmente no sepa que una sección del programa es realmente código y lo trate como datos; si el usuario especifica que se trata de un código, el código desensamblado resultante se muestra inmediatamente, lo que permite al usuario examinarlo y realizar más acciones durante la misma ejecución.
Cualquier depurador interactivo incluirá alguna forma de ver el desensamblado del programa que se está depurando. A menudo, la misma herramienta de desensamblado se empaquetará como un desensamblador independiente distribuido junto con el depurador. Por ejemplo, objdump, parte de GNU Binutils, está relacionado con el depurador interactivo gdb.
- Binary Ninja
- DEBUG
- Disassembler Interactivo (IDA)
- Ghidra
- Hiew.
- Hopper Disassembler
- PE Explorer Disassembler
- Disassembler Netwide (Ndisasm), compañero del Assembler Netwide (NASM).
- OLIVER (CICS interactivo test/debug) incluye desmontadores para Assembler, COBOL y PL/1
- OllyDbg es un nivel de montaje de 32 bits que analiza depurador
- Radare2
- SIMON (batch interactive test/debug) incluye desmontadores para Assembler, COBOL y PL/1
- Sourcer, a commenting 16-bit/32-bit disassembler for DOS, OS/2 and Windows by V Communications in the 1990s
Desensambladores y emuladores
Se puede incorporar un desensamblador dinámico en la salida de un emulador o hipervisor para "rastrear", línea por línea, la ejecución en tiempo real de cualquier instrucción de máquina ejecutada. En este caso, además de las líneas que contienen el código de máquina desensamblado, el(los) registro(s) y/o cambio(s) de datos (o cualquier otro cambio de "estado", como códigos de condición) que cada individuo Las causas de las instrucciones se pueden mostrar junto o debajo de las instrucciones desmontadas. Esto proporciona información de depuración extremadamente poderosa para la resolución final de problemas, aunque el tamaño de la salida resultante a veces puede ser bastante grande, especialmente si está activo durante la ejecución de un programa completo. OLIVER proporcionó estas funciones desde principios de la década de 1970 como parte de su oferta de productos de depuración de CICS y ahora se encuentran incorporadas en el producto XPEDITER de Compuware.
Desmontador de longitud
Un desensamblador de longitudes, también conocido como motor desensamblador de longitudes (LDE), es una herramienta que, dada una secuencia de bytes (instrucciones), genera el número de bytes tomados por la instrucción analizada. Los proyectos notables de código abierto para la arquitectura x86 incluyen ldisasm, Tiny x86 Length Disassembler y Extended Length Disassembler Engine para x86-64.
Contenido relacionado
Supercomputadora
Jerarquía de Chomsky
Semiótica computacional