¿Es posible "descompilar" un archivo .exe de Windows? O al menos ver la Asamblea?


237

Un amigo mío descargó un poco de malware de Facebook, y tengo curiosidad por ver qué hace sin infectarme. Sé que realmente no se puede descompilar un archivo .exe, pero ¿puedo al menos verlo en Assembly o adjuntar un depurador?

Edite para decir que no es un ejecutable .NET, no tiene encabezado CLI.


3
malware de facebook ?? ¿podría explicar eso
Aditya Mukherji

Perdón por la respuesta súper tardía ... pero la forma en que creo que sucedió fue: ella ejecutó una pieza de malware, que en algún momento envió spam a todos sus contactos en FB (yo) con un enlace a un "video" que le solicitó descargue un "nuevo códec". Supongo que se comportó como un gusano en este sentido.
swilliams

Respuestas:


448

Con un depurador puede recorrer el ensamblaje del programa de forma interactiva.
Con un desensamblador , puede ver el ensamblaje del programa con más detalle.
Con un descompilador , puede volver a convertir un programa en código fuente parcial, suponiendo que sepa en qué estaba escrito (que puede encontrar con herramientas gratuitas como PEiD ; si el programa está empaquetado, primero deberá descomprimirlo) O Detect-it-Easy si no puede encontrar PEiD en ningún lado. DIE tiene una sólida comunidad de desarrolladores en github actualmente).

Depuradores:

  • OllyDbg , gratuito, un excelente depurador de 32 bits, para el que puede encontrar numerosos complementos y scripts creados por el usuario para que sea aún más útil.
  • WinDbg , gratis, un depurador bastante capaz de Microsoft. WinDbg es especialmente útil para mirar las partes internas de Windows, ya que sabe más sobre las estructuras de datos que otros depuradores.
  • SoftICE , SICE a amigos. El comercial y el desarrollo se detuvieron en 2006. SoftICE es una especie de herramienta hardcore que se ejecuta debajo del sistema operativo (y detiene todo el sistema cuando se invoca). SoftICE todavía es utilizado por muchos profesionales, aunque puede ser difícil de obtener y puede que no funcione en algún hardware (o software, es decir, no funcionará en tarjetas Vista o NVIDIA gfx).

Desmontadores:

  • IDA Pro (comercial): desensamblador / depurador de primera línea. Usado por la mayoría de los profesionales, como analistas de malware, etc. Sin embargo, cuesta bastante dinero (existe una versión gratuita , pero es bastante limitada)
  • W32Dasm (gratis): un poco anticuado pero hace el trabajo. Creo que W32Dasm es abandonware en estos días, y hay numerosos hacks creados por los usuarios para agregar algunas funcionalidades muy útiles. Tendrás que mirar alrededor para encontrar la mejor versión.

Descompiladores:

  • Visual Basic: VB Decompiler , comercial, produce bytecode algo identificable.
  • Delphi: DeDe , gratis, produce código fuente de buena calidad.
  • C: HexRays , comercial, un complemento para IDA Pro de la misma compañía. Produce excelentes resultados, pero cuesta mucho dinero, y no se venderá a cualquiera (o eso oigo).
  • .NET (C #): dotPeek , gratis, descompila los ensamblados .NET 1.0-4.5 a C #. Soporte para archivos .dll, .exe, .zip, .vsix, .nupkg y .winmd.

Algunas herramientas relacionadas que pueden ser útiles en lo que sea que esté haciendo son editores de recursos como ResourceHacker (gratis) y un buen editor hexadecimal como Hex Workshop (comercial).

Además, si está haciendo análisis de malware (o usa SICE) , le sugiero que ejecute todo dentro de una máquina virtual, es decir, VMware Workstation . En el caso de SICE, protegerá su sistema real de los BSOD, y en el caso de malware, protegerá su sistema real del programa de destino. Puede leer sobre el análisis de malware con VMware aquí .

Personalmente, utilizo Olly, WinDbg y W32Dasm, y algunas herramientas de utilidad más pequeñas.

Además, recuerde que desmontar o incluso depurar el software de otras personas suele ser contra el EULA en lo más mínimo :)


16
Agradezco el último párrafo en su generalidad, buenos consejos, pero es divertido en el contexto de la pregunta: ¡Dudo que un virus venga con un EULA! ;-)
PhiLho

44
En realidad, algunos malware e incluso troyanos recientes han tenido EULA en ellos (oh, esos rusos ...) Por supuesto, pueden ser (y son) ignorados por las investigaciones, porque se puede suponer que nadie se presentará a demandarlos. .. Además, generalmente están demasiado mal escritos para significar algo en la corte en cualquier caso.
anon6439

2
Tenga en cuenta que la versión anterior de IDA Pro es gratuita para uso no comercial.
Simon Buchan

66
Tenga en cuenta que la mayoría del malware en estos días (al menos el malware compilado) puede detectar fácilmente si se está ejecutando en VMWare, Virtual PC, vino, VirtualBox, etc.
Mick

Si estás corriendo en una VM, ten cuidado con el ataque de la píldora azul.
Siqi Lin

44

La excelente publicación de psoul responde a su pregunta, por lo que no replicaré su buen trabajo, pero creo que ayudaría a explicar por qué esta es una pregunta perfectamente válida pero también terriblemente tonta. Después de todo, este es un lugar para aprender, ¿verdad?

Los programas de computadora modernos se producen a través de una serie de conversiones, comenzando con la entrada de un cuerpo de instrucciones de texto legibles por humanos (llamado "código fuente") y terminando con un cuerpo de instrucciones legibles por computadora (llamado alternativamente "binario" o "máquina" código").

La forma en que una computadora ejecuta un conjunto de instrucciones de código de máquina es, en última instancia, muy simple. Cada acción que puede realizar un procesador (por ejemplo, leer de la memoria, agregar dos valores) se representa mediante un código numérico. Si te dijera que el número 1 significaba gritar y el número 2 significaba risita, y luego sostenía las tarjetas con 1 o 2 esperando que gritaras o rieras en consecuencia, estaría usando lo que es esencialmente el mismo sistema que usa una computadora para operar.

Un archivo binario es solo un conjunto de esos códigos (generalmente llamados "códigos operativos") y la información ("argumentos") sobre los que actúan los códigos operativos.

Ahora, el lenguaje ensamblador es un lenguaje de computadora donde cada palabra de comando en el idioma representa exactamente un código de operación en el procesador. Hay una traducción directa 1: 1 entre un comando de lenguaje ensamblador y un código de operación del procesador. Esta es la razón por la cual el ensamblaje de codificación para un procesador x386 es diferente del ensamblaje de codificación para un procesador ARM.

El desmontaje es simplemente esto: un programa lee el binario (el código de máquina), reemplaza los códigos de operación con sus comandos de lenguaje ensamblador equivalentes y genera el resultado como un archivo de texto. Es importante entender esto; si su computadora puede leer el binario, entonces también puede leer el binario, ya sea manualmente con una tabla de códigos de operación en su mano (ick) o mediante un desensamblador.

Los desensambladores tienen algunos trucos nuevos y todo, pero es importante entender que un desensamblador es en última instancia un mecanismo de búsqueda y reemplazo. Es por eso que cualquier EULA que lo prohíba finalmente está soplando aire caliente. No puede permitir de inmediato que la computadora lea los datos del programa y también prohibir que la computadora lea los datos del programa.

(No me malinterpreten, ha habido intentos de hacerlo. Funcionan tan bien como DRM en los archivos de canciones).

Sin embargo, hay advertencias sobre el enfoque de desmontaje. Los nombres de las variables son inexistentes; tal cosa no existe en su CPU. Las llamadas a la biblioteca son confusas como el infierno y a menudo requieren desmontar más binarios. Y el montaje es difícil de leer en las mejores condiciones.

La mayoría de los programadores profesionales no pueden sentarse y leer lenguaje ensamblador sin tener dolor de cabeza. Para un aficionado simplemente no va a suceder.

De todos modos, esta es una explicación algo pasada por alto, pero espero que ayude. Todos pueden sentirse libres de corregir cualquier error de mi parte; ha sido un tiempo. ;)


1
Esto explica el desmontaje, pero me encantaría escuchar una explicación sobre el descompilación. ¿Es probable que sea igual de infructuoso? ¿Cuáles son sus advertencias?
Prometeo

@has: Descompilar código nativo es un desafío bastante difícil, a menudo imposible. Los optimizadores son extremadamente agresivos, y con frecuencia traducen el código fuente a la nada. No puedes descompilar nada.
Insensible el


11

Cualquier depurador decente puede hacer esto. Prueba OllyDbg . (editar: ¡que tiene un gran desensamblador que incluso decodifica los parámetros para las llamadas de WinAPI!)




6

Si solo está tratando de descubrir qué hace un malware, podría ser mucho más fácil ejecutarlo bajo algo como la herramienta gratuita Process Monitor, que informará cada vez que intente acceder al sistema de archivos, registro, puertos, etc.

Además, usar una máquina virtual como el servidor VMWare gratuito es muy útil para este tipo de trabajo. Puede crear una imagen "limpia" y luego volver a eso cada vez que ejecute el malware.


4

Puede obtener información visualizándola en conjunto, pero creo que lo más fácil es encender una máquina virtual y ver qué hace. Sin embargo, asegúrese de no tener acciones abiertas ni nada por el estilo que pueda pasar;)


Sí, pensé en eso, pero prefiero no pasar por la molestia de configurar una VM solo para matarla :)
swilliams

1
Es cierto, es una molestia para este caso, pero siempre encuentro que es útil mantener una VM para probar nuevo software o cosas como esta. Entonces puedo hacer lo que quiera y simplemente elegir no guardar el estado al final y volver a la máquina virtual limpia para la próxima ejecución.
Rob Prouse, el

4

Boomerang también puede valer la pena echarle un vistazo.


Realmente no. se bloquea y se quema por algo más complicado que los ejecutables más triviales.
shoosh


3

No puedo creer que nadie haya dicho nada sobre Immunity Debugger , todavía.

Immunity Debugger es una poderosa herramienta para escribir exploits, analizar malware y realizar ingeniería inversa de archivos binarios. Inicialmente se basó en el código fuente Ollydbg 1.0, pero con el error de resolución de nombres corregido. Tiene una API Python bien compatible para una fácil extensibilidad, por lo que puede escribir sus scripts de Python para ayudarlo en el análisis.

Además, hay uno bueno que Peter del equipo de Corelan escribió llamado mona.py , excelente herramienta por cierto.


2

Si desea ejecutar el programa para ver qué hace sin infectar su computadora, úselo con una máquina virtual como VMWare o Microsoft VPC, o un programa que pueda proteger el programa como SandboxIE




2

Yo diría que en 2019, vale la pena echarle un vistazo a Ghidra ( https://ghidra-sre.org/ ). Es de código abierto (y gratuito), y tiene capacidades de análisis de código fenomenales, incluida la capacidad de descompilar todo el código C bastante legible.


Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.