Un desensamblador es un programa informático que traduce el lenguaje de máquina al lenguaje ensamblador (la operación inversa a la de un ensamblador ). El resultado del desensamblador suele estar formateado para que sea legible por humanos en lugar de para que se introduzca en un ensamblador, lo que convierte a los desensambladores principalmente en una herramienta de ingeniería inversa . Los usos comunes incluyen el análisis del resultado de los compiladores de lenguajes de programación de alto nivel y sus optimizaciones, la recuperación del código fuente cuando se pierde el original, la realización de análisis de malware , la modificación de software (como la aplicación de parches binarios) y el descifrado de software .
Un desensamblador se diferencia de un descompilador , que apunta a un lenguaje de alto nivel en lugar de un lenguaje ensamblador.
El código fuente del lenguaje ensamblador generalmente permite el uso de constantes y comentarios del programador . Estos son generalmente eliminados del código de máquina ensamblado por el ensamblador. Si es así, un desensamblador que opera en el código de máquina produciría un desensamblado que carece de estas constantes y comentarios; la salida desensamblada se vuelve más difícil de interpretar para un humano que el código fuente anotado original. Algunos desensambladores proporcionan una función de comentarios de código incorporada donde la salida generada se enriquece con comentarios sobre las funciones de API llamadas o los parámetros de las funciones llamadas. Algunos desensambladores hacen uso de la información de depuración simbólica presente en archivos de objetos como ELF . Por ejemplo, IDA permite al usuario humano inventar símbolos mnemotécnicos para valores o regiones de código en una sesión interactiva: la percepción humana aplicada al proceso de desensamblado a menudo es paralela 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. Mientras que 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 hace que no quede claro si una ubicación determinada contiene instrucciones ejecutables o datos no ejecutables. Esta ambigüedad podría complicar el proceso de desensamblado.
Además, las CPU a menudo permiten saltos dinámicos calculados en tiempo de ejecución, lo que hace imposible identificar todas las ubicaciones posibles en el binario que podrían ejecutarse como instrucciones.
En arquitecturas de computadora 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 a menudo a los programas informáticos, especialmente como parte de la gestión de derechos digitales para impedir la ingeniería inversa y el descifrado . Estas técnicas plantean desafíos adicionales para el desensamblaje, ya que primero se debe descomprimir o descifrar el código antes de que pueda comenzar un análisis significativo.
Ejemplos de desensambladores
Un desensamblador puede ser independiente o interactivo. Un desensamblador independiente genera un archivo en lenguaje ensamblador al ejecutarse, que luego puede examinarse. Por el contrario, un desensamblador interactivo refleja inmediatamente cualquier cambio realizado por el usuario. Por ejemplo, si el desensamblador trata inicialmente 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 se mostrará instantáneamente, lo que permitirá al usuario analizarlo y realizar más cambios durante la misma sesió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 que se distribuye junto con el depurador. Por ejemplo, objdump , parte de GNU Binutils , está relacionado con el depurador interactivo gdb . [1]
- Ninja binario [2]
- DEPURACIÓN [3]
- Desensamblador interactivo (IDA)
- Ghidra
- Vista
- Desmontador de tolva [1]
- Desensamblador de PE Explorer [4]
- Desensamblador de red (Ndisasm), complemento del ensamblador de red (NASM).
- OLIVER ( prueba/depuración interactiva de CICS ) incluye desensambladores para ensamblador, COBOL y PL/1
- x64dbg , un depurador para Windows que también realiza desensamblaje dinámico
- OllyDbg es un depurador de análisis de nivel de ensamblador de 32 bits
- Radare2
- Rizin [5] y Cutter [6] (interfaz gráfica para Rizin)
- SIMON (prueba/depuración interactiva por lotes) incluye desensambladores para ensamblador, COBOL y PL/1
- Sourcer, un desensamblador de 16 bits y 32 bits para DOS , OS/2 y Windows de V Communications en la década de 1990 [7]
Desensambladores y emuladores
Se puede integrar un desensamblador dinámico en la salida de un emulador o hipervisor para rastrear la ejecución en tiempo real de las instrucciones de la máquina, mostrándolas línea por línea. En esta configuración, junto con el código de la máquina desensamblado, el desensamblador puede mostrar cambios en los registros, datos u otros elementos de estado (como códigos de condición) causados por cada instrucción. Esto proporciona información de depuración poderosa para la resolución de problemas. Sin embargo, el tamaño de la salida puede llegar a ser bastante grande, particularmente si el rastreo está activo durante toda la ejecución de un 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 desensamblador de longitud ( LDE ), es una herramienta que, dada una secuencia de bytes (instrucciones), genera la cantidad de bytes que ocupa la instrucción analizada. Entre los proyectos de código abierto más destacados para la arquitectura x86 se incluyen ldisasm, [8] Tiny x86 Length Disassembler [9] y Extended Length Disassembler Engine para x86-64. [10]
Véase también
Referencias
- ^ ab "Hopper". Archivado desde el original el 8 de enero de 2022. Consultado el 25 de enero de 2022 .
- ^ "Ninja binario". Archivado desde el original el 24 de enero de 2022. Consultado el 25 de enero de 2022 .
- ^ Paul, 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 .(NB. NWDOSTIP.TXT es un trabajo exhaustivo sobre Novell DOS 7 y OpenDOS 7.01 , que incluye la descripción de muchas características y componentes internos no documentados. Es parte de la colección MPDOSTIP.ZIP aún más grande del autor, mantenida hasta 2001 y distribuida en muchos sitios en ese momento. El enlace provisto apunta a una versión anterior convertida a HTML del archivo NWDOSTIP.TXT).
- ^ "PEExplorer Windows Disassembler for Win 32-bit Program EXE DLL OCX, Code Binary Analysis Tool" (Desensamblador de Windows PEExplorer para programas de 32 bits de Windows, EXE, DLL, OCX, herramienta de análisis binario de código) . Consultado el 25 de abril de 2022 .
- ^ "Rizin". Archivado desde el original el 28 de noviembre de 2023. Consultado el 9 de diciembre de 2023 .
- ^ "Cortador". Archivado desde el original el 28 de noviembre de 2023. Consultado el 9 de diciembre de 2023 .
- ^ Fuente: 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 desde el original el 28 de octubre de 2020 . Consultado el 26 de febrero de 2020 .
- ^ "Desensamblador de longitud x86 diminuto". GitHub . Archivado desde el original el 2020-10-31 . Consultado el 2019-12-10 .
- ^ "Motor de desensamblador de longitud extendida para x86-64". GitHub . Archivado desde el original el 2020-10-08 . Consultado el 2019-12-10 .
Lectura adicional
- Vinciguerra, Lori; M. Wills, Linda; Kejriwal, Nidhi; Martino, Paul; Vinciguerra, Ralph L. (2003). "Un marco de experimentación para evaluar herramientas de desensamblado y descompilación para C++ y Java". 10.ª Conferencia de trabajo sobre ingeniería inversa, 2003. WCRE 2003. Actas . pp. 14– 23. doi :10.1109/WCRE.2003.1287233. ISBN . 0-7695-2027-8.S2CID10398240 .
- 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 desmontaje
- Boomerang Un descompilador general, de código abierto y redireccionable de programas de código máquina.
- Desensamblador en línea Archivado el 26 de abril de 2012 en Wayback Machine , un desensamblador en línea gratuito de código arms, mips, ppc y x86