Un desensamblador es un programa informático que traduce el lenguaje máquina a lenguaje ensamblador , la operación inversa a la de un ensamblador . El resultado del desensamblaje suele estar formateado para que sea legible por humanos, en lugar de para ser utilizado como entrada por un ensamblador, lo que convierte a los desensambladores principalmente en herramientas de ingeniería inversa . Entre sus usos comunes se incluyen el análisis del resultado de compiladores de lenguajes de programación de alto nivel y sus optimizaciones, la recuperación del código fuente cuando se pierde el original, el análisis de malware , la modificación de software (como la aplicación de parches binarios) y el cracking de software .
Un desensamblador se diferencia de un descompilador , que se dirige a un lenguaje de alto nivel en lugar de a un lenguaje ensamblador. El desensamblaje es un método fundamental de análisis de software. A diferencia de los descompiladores, que intentan recrear estructuras de alto nivel legibles por humanos utilizando binarios, los desensambladores tienen como objetivo generar un ensamblado simbólico, es decir, intentan reconstruir el ensamblado más cercano a su ejecución. Por lo tanto, el código desensamblado suele ser más preciso, pero también de menor nivel y menos abstracto que el código descompilado, y por consiguiente, se puede analizar con mucha más facilidad. [ 1 ]
El código fuente en lenguaje ensamblador generalmente permite el uso de constantes y comentarios del programador . Estos suelen ser eliminados del código máquina ensamblado por el ensamblador. En ese caso, un desensamblador que opere sobre el código máquina produciría un desensamblado sin estas constantes ni comentarios; la salida desensamblada resulta más difícil de interpretar para un humano que el código fuente original anotado. Algunos desensambladores ofrecen una función de comentarios de código integrada, donde la salida generada se enriquece con comentarios sobre las funciones API llamadas o los parámetros de las funciones llamadas. Algunos desensambladores utilizan la información de depuración simbólica presente en archivos objeto como ELF . Por ejemplo, IDA permite al usuario humano crear símbolos mnemotécnicos para valores o regiones de código en una sesión interactiva: la intuición humana aplicada al proceso de desensamblaje a menudo es similar a la creatividad humana en el proceso de escritura de código.
Desafíos
No siempre es posible distinguir el código ejecutable de los datos dentro de un binario. Si bien los formatos ejecutables comunes, como ELF y PE , separan el código y los datos en secciones distintas, los binarios planos no lo hacen, lo que dificulta determinar si una ubicación específica contiene instrucciones ejecutables o datos no ejecutables. Esta ambigüedad puede complicar el proceso de desensamblaje.
Además, las CPU suelen permitir saltos dinámicos calculados en tiempo de ejecución, lo que imposibilita identificar todas las posibles ubicaciones en el binario que podrían ejecutarse como instrucciones.
En arquitecturas informáticas con instrucciones de ancho variable , como en muchas arquitecturas CISC , puede existir más de un desensamblaje válido para el mismo binario.
Los desensambladores tampoco pueden manejar código que cambia durante la ejecución, ya que el análisis estático no puede tener en cuenta las modificaciones en tiempo de ejecución.
El cifrado, el empaquetado o la ofuscación se aplican con frecuencia a los programas informáticos, especialmente como parte de la gestión de derechos digitales, para disuadir la ingeniería inversa y el cracking . Estas técnicas plantean desafíos adicionales para el desensamblaje, ya que el código debe desempaquetarse o descifrarse antes de que pueda comenzar un análisis significativo.
Desmontaje estático frente a desmontaje dinámico
El desensamblaje puede realizarse de forma estática o dinámica. El desensamblaje estático analiza el binario sin ejecutarlo, lo que permite la inspección sin conexión. Sin embargo, el desensamblaje estático puede interpretar erróneamente algunas operaciones u ofuscaciones.
El desensamblaje dinámico observa las instrucciones ejecutadas en tiempo de ejecución, normalmente mediante el monitoreo de los registros y las banderas de la CPU. El análisis dinámico puede capturar las rutas de control ejecutadas y las direcciones resueltas en tiempo de ejecución, lo que, si bien representa una gran ventaja para los descompiladores, puede omitir rutas de código que no se activan durante la ejecución.
Si bien ambos son potentes, los desensambladores modernos suelen combinar ambos enfoques para mejorar la precisión en binarios más complejos. [ 2 ]
Ejemplos de desmontadores
Un desensamblador puede ser independiente o interactivo. Un desensamblador independiente genera un archivo en lenguaje ensamblador al ejecutarse, el cual puede ser examinado. En cambio, un desensamblador interactivo refleja inmediatamente cualquier cambio realizado por el usuario. Por ejemplo, si el desensamblador inicialmente trata una sección del programa como datos en lugar de código, el usuario puede especificarla como código. El código desensamblado se actualizará y mostrará al instante, lo que permite al usuario analizarlo y realizar cambios adicionales durante la misma sesión.
Cualquier depurador interactivo incluirá alguna forma de visualizar el desensamblaje del programa que se está depurando. A menudo, la misma herramienta de desensamblaje se distribuye como un desensamblador independiente junto con el depurador. Por ejemplo, objdump , que forma parte de GNU Binutils , está relacionado con el depurador interactivo gdb . [ 3 ]
- Ninja binario [ 4 ]
- DEPURACIÓN [ 5 ]
- Desensamblador interactivo (IDA)
- Ghidra
- Hola
- Desmontador de tolvas [ 3 ]
- Desmontador PE Explorer [ 6 ]
- Desensamblador de red (Ndisasm), complemento del Ensamblador de red (NASM).
- OLIVER ( prueba/depuración interactiva de CICS ) incluye desensambladores para Assembler, COBOL y PL/1.
- x64dbg , un depurador para Windows que también realiza desensamblaje dinámico.
- OllyDbg es un depurador analizador a nivel de ensamblador de 32 bits.
- Radare2
- Rizin [ 7 ] y Cutter [ 8 ] (interfaz gráfica para Rizin)
- SIMON (prueba/depuración interactiva por lotes) incluye desensambladores para Assembler, COBOL y PL/1.
- Sourcer , un desensamblador x86 de 16 bits/32 bits con comentarios vendido por V Communications en la década de 1990 [ 9 ].
Desensambladores y emuladores
Un desensamblador dinámico puede integrarse en la salida de un emulador o hipervisor para rastrear la ejecución en tiempo real de las instrucciones de máquina, mostrándolas línea por línea. En esta configuración, junto con el código máquina desensamblado, el desensamblador puede mostrar los cambios en los registros, los datos u otros elementos de estado (como los códigos de condición) causados por cada instrucción. Esto proporciona información valiosa para la depuración y la resolución de problemas. Sin embargo, el tamaño de la salida puede ser bastante grande, especialmente si el rastreo se mantiene activo durante toda la ejecución del programa. Estas características fueron introducidas por primera vez a principios de la década de 1970 por OLIVER como parte de su producto de depuración CICS y ahora están incorporadas en el producto XPEDITER de Compuware .
Desmontador de longitud
Un desensamblador de longitud , también conocido como motor de desensamblaje de longitud ( LDE ), es una herramienta que, dada una secuencia de bytes (instrucciones), produce el número de bytes que ocupa la instrucción analizada. Entre los proyectos de código abierto más destacados para la arquitectura x86 se encuentran ldisasm, [ 10 ] Tiny x86 Length Disassembler [ 11 ] y Extended Length Disassembler Engine para x86-64. [ 12 ]
Véase también
Referencias
- ^ Andriesse, Dion; Chen, Xiaofei; van der Veen, Víctor; Slowinska, Joanna; Bos, Herbert (2016). "Un análisis en profundidad del desmontaje de archivos binarios x86/x64 a gran escala" (PDF) . Actas del 25º Simposio de seguridad de USENIX . Austin, TX: Asociación USENIX.
- ↑ Pang, Chao; Yu, Rui; Chen, Yuan; Koskinen, Eric; Portokalidis, Georgios; Mao, Bo; Xu, Jian (2021). "SoK: Todo lo que siempre quiso saber sobre el desensamblaje binario x86/x64 pero tenía miedo de preguntar" (PDF) . Actas del Simposio IEEE de 2021 sobre Seguridad y Privacidad (SP) . IEEE.
- 1 2 "Hopper" . Archivado del original el 8 de enero de 2022. Consultado el 25 de enero de 2022 .
- ↑ "Binary Ninja" . Archivado del original el 24/01/2022 . Consultado el 25/01/2022 .
- ^ Pablo, Matías R. (30 de julio de 1997). "Kapitel II.5. Allgemeines: Undokumentierte Möglichkeiten von DEBUG" [ Características no documentadas de DEBUG ] . NWDOS-TIP : consejos y trucos para Novell DOS 7, con un clic para deshacer detalles, errores y soluciones . MPDOSTIP (en alemán) (3 ed.). Archivado desde el original el 10 de septiembre de 2017 . Consultado el 6 de septiembre de 2014 . (Nota: NWDOSTIP.TXT es una obra exhaustiva sobre Novell DOS 7 y OpenDOS 7.01 , que incluye la descripción de muchas características y aspectos internos no documentados. Forma parte de la colección MPDOSTIP.ZIP del autor, aún más extensa, que se mantuvo hasta 2001 y se distribuyó en numerosos sitios web en aquella época. El enlace proporcionado dirige a una versión anterior del archivo NWDOSTIP.TXT convertida a HTML).
- ↑ "PEExplorer Windows Disassembler para Win 32-bit Program EXE DLL OCX, Code Binary Analysis Tool" . Consultado el 25/04/2022 .
- ↑ "Rizin" . Archivado del original el 28-11-2023 . Consultado el 09-12-2023 .
- ↑ "Cutter" . Archivado del original el 28-11-2023 . Consultado el 09-12-2023 .
- ↑ Sourcer - Commenting Disassembler ( edición de septiembre de 1989). V Communications, Inc. 1988. Número de pieza S0989-164 . Consultado el 21 de diciembre de 2019 .
- ↑ "ldisasm" . GitHub . Archivado del original el 28-10-2020 . Consultado el 26-02-2020 .
- ↑ "Desensamblador de longitud x86 pequeño" . GitHub . Archivado del original el 31/10/2020 . Consultado el 10/12/2019 .
- ↑ "Motor desensamblador de longitud extendida para x86-64" . GitHub . Archivado del original el 8 de octubre de 2020. Consultado el 10 de diciembre de 2019 .
Lecturas adicionales
- Vinciguerra, Lori; M. Wills, Linda; Kejriwal, Nidhi; Martino, Paul; Vinciguerra, Ralph L. (2003). "Un marco de experimentación para evaluar herramientas de desensamblaje y descompilación para C++ y Java". 10.ª Conferencia de Trabajo sobre Ingeniería Inversa, 2003. WCRE 2003. Actas . págs. 14-23 . doi : 10.1109/WCRE.2003.1287233 . ISBN 0-7695-2027-8. S2CID 10398240 .
- Schwarz, Benjamin; Debray, Saumya; Andrews, Gregory (2002). "Revisión del desensamblaje de código ejecutable". Actas de la 9.ª Conferencia de Trabajo sobre Ingeniería Inversa (WCRE) . Departamento de Ciencias de la Computación, Universidad de Arizona : 45–54 . CiteSeerX 10.1.1.85.6387 .
Enlaces externos
- Lista de desensambladores x86 en Wikilibros
- Wiki de transformación sobre el desmontaje
- Boomerang: Un descompilador general, de código abierto y reconfigurable de programas de código máquina.
- Desensamblador en línea archivado el 26/04/2012 en Wayback Machine , un desensamblador en línea gratuito de código ARM, MIPS, PPC y x86.
- Desmontadores
- Depuración
- Ingeniería inversa