2009-04-16 30 views
11

No estoy familiarizado con la magia del compilador. El acto de transformar el código legible para el ser humano (o las instrucciones de ensamblado realmente legibles) en código máquina es, para mí, ciencia de cohetes combinada con hechicería.¿Cómo leer/escribir el código de máquina .exe manualmente?

Voy a limitar el tema de esta pregunta a los ejecutables de Win32 (.exe). Cuando abro estos archivos en un visor especializado, puedo encontrar cadenas (generalmente 16b por carácter) diseminadas en varios lugares, pero el resto es basura. Supongo que la parte ilegible (mayoría) es el código de máquina (o tal vez recursos, como imágenes, etc.).

¿Hay alguna forma directa de leer el código de máquina? Al abrir el exe como una secuencia de archivos y leerlo byte por byte, ¿cómo podría uno convertir estos bytes individuales en Assembly? ¿Existe un mapeo directo entre estos bytes de instrucción y las instrucciones de montaje?

¿Cómo se escribe .exe? Cuatro bytes por instrucción? ¿Más? ¿Menos? Me he dado cuenta de que algunas aplicaciones pueden crear archivos ejecutables así: por ejemplo, en ACD Vea que puede exportar una serie de imágenes a una presentación de diapositivas. Pero esto no necesariamente tiene que ser una presentación de diapositivas SWF, ACD See también es capaz de producir presentaciones ejecutables EXE. ¿Cómo se hace eso?

¿Cómo puedo entender qué ocurre dentro de un archivo EXE?

+1

El truco de ACDSee utilizará un programa precompilado y editará sus recursos. Consulte http://www.silurian.com/win32/peformat.htm y juegue con Process Explorer (http://live.sysinternals.com/procexp.exe) – Mark

+0

Gracias, eso se ve bien. Y Process Explorer impresionante. Comencé a usarlo hace un par de meses, y es simplemente increíble. Cada vez que lo ejecuto, no puedo dejar de preguntarme ¿CÓMO PUEDEN ...? –

+0

Sólo un comentario retrasado aquí; ¿cómo te las arreglas para seguir adelante con eso al final? ¿Lograste llegar muy lejos? – dreamlax

Respuesta

15

OllyDbg es una herramienta increíble que desensambla un EXE en instrucciones legibles y le permite ejecutar las instrucciones una a una. También le dice qué funciones API utiliza el programa y, si es posible, los argumentos que proporciona (siempre que los argumentos se encuentren en la pila).

En general, las instrucciones de la CPU son de longitud variable, algunas son de un byte, otras dos, unas tres, cuatro, etc. En general, depende del tipo de datos que la instrucción espera. Algunas instrucciones son generalizadas, como "mov", que le dice a la CPU que mueva los datos de un registro de la CPU a un lugar en la memoria, o viceversa. En realidad, hay muchas instrucciones "mov" diferentes, una para el manejo de datos de 8 bits, 16 bits y 32 bits, para mover datos de diferentes registros, etc.

Puede recoger el PC Assembly Language Tutorial del Dr. Paul Carter que es un libro de nivel de entrada gratuito que habla sobre el ensamblaje y cómo funciona la CPU Intel 386. La mayor parte es aplicable incluso a las CPU Intel de consumo actuales.

El formato EXE es específico de Windows. El punto de entrada (es decir, la primera instrucción ejecutable) se encuentra generalmente en el mismo lugar dentro del archivo EXE. Es todo muy difícil de explicar todo de una vez, ¡pero los recursos que he proporcionado deberían ayudar a curar al menos parte de tu curiosidad! :)

+1

esta es una respuesta muy buena. tienes razón sobre mi curiosidad. No es que NECESITO desarmar ejecutables, solo estoy muy interesado, y me gustaría jugar un poco con los ejecutables. Obtener esa sensación de wooow cuando entiendo algo más allá de mi horizonte actual :) –

+1

Algunas personas prefieren IDA Pro a OllyDbg: http://www.hex-rays.com/idapro/ –

4

Puede utilizar la depuración desde la línea de comandos, pero eso es difícil.

C:\WINDOWS>debug taskman.exe 
-u 
0D69:0000 0E   PUSH CS 
0D69:0001 1F   POP  DS 
0D69:0002 BA0E00  MOV  DX,000E 
0D69:0005 B409   MOV  AH,09 
0D69:0007 CD21   INT  21 
0D69:0009 B8014C  MOV  AX,4C01 
0D69:000C CD21   INT  21 
0D69:000E 54   PUSH SP 
0D69:000F 68   DB  68 
0D69:0010 69   DB  69 
0D69:0011 7320   JNB  0033 
0D69:0013 7072   JO  0087 
0D69:0015 6F   DB  6F 
0D69:0016 67   DB  67 
0D69:0017 7261   JB  007A 
0D69:0019 6D   DB  6D 
0D69:001A 206361  AND  [BP+DI+61],AH 
0D69:001D 6E   DB  6E 
0D69:001E 6E   DB  6E 
0D69:001F 6F   DB  6F 
+0

aprendió algo nuevo hoy. Espero no romper mi sistema operativo pronto. Sucedió una vez cuando me entusiasmé por ajustar entradas de registro ... Nunca volví a ver mi escritorio. –

+0

También puede escribir un código nuevo y guardarlo nuevamente en el archivo. Solo un loco [o hacker] usaría Debug –

+0

Cuentame entre los pocos que todavía usan depuración. FYI: DEBUG de Microsoft solo ensambla el modo real de 16 bits. Si desea una depuración con capacidad DPMI de 32 bits, pruebe la versión de japheth: http://www.japheth.de/debxxf.html –

6

Necesita un desensamblador que convierta el código de máquina en lenguaje ensamblador. Este Wikipedia link describe el proceso y proporciona enlaces a desensambladores gratuitos. Por supuesto, como dices que no entiendes el lenguaje ensamblador, esto puede no ser muy informativo, ¿qué estás tratando de hacer exactamente aquí?

+0

No enlaza con Windbg http://www.microsoft.com/whdc/devtools/ depuración/installx86.mspx – Mark

1

Win32 exe format en MSDN

yo sugeriría tomar un poco de código fuente de Windows C y la construcción y puesta depuración en Visual Studio. Cambia a la vista de desmontaje y pasa por encima de los comandos.Puede ver cómo se compiló el código C en el código máquina y ver cómo se ejecuta paso a paso.

5

El archivo ejecutable que ve es el formato Microsofts PE (Portable Executable). Es esencialmente un contenedor, que contiene algunos datos específicos del sistema operativo sobre un programa y los datos del programa se dividen en varias secciones. Por ejemplo, código, recursos, datos estáticos se almacenan en secciones separadas.

El formato de la sección depende de lo que contenga. La sección de código contiene el código de máquina según la arquitectura de destino ejecutable. En los casos más comunes, esto es Intel x86 o AMD-64 (lo mismo que EM64T) para los binarios de Microsoft PE. El formato del código de máquina es CISC y se origina en el 8086 y anteriores. El aspecto importante de CISC es que su tamaño de instrucción no es constante, debe comenzar a leer en el lugar correcto para obtener algo valioso de él. Intel publica buenos manuales en el conjunto de instrucciones x86/x64.

Puede usar un desensamblador para ver el código de la máquina directamente. En combinación con los manuales, puede adivinar el código fuente la mayor parte del tiempo.

Y luego está MSIL EXE: los ejecutables de .NET que contienen el lenguaje intermedio de Microsofts, estos no contienen el código específico de la máquina, pero el código .NET CIL. Las especificaciones para eso están disponibles en línea en ECMA.

Se pueden ver con una herramienta como Reflector.

5

El contenido del archivo EXE se describe en Portable Executable. Contiene código, datos e instrucciones para el sistema operativo sobre cómo cargar el archivo.

Hay una correspondencia 1: 1 entre el código de la máquina y el conjunto. Un programa de desensamblador llevará a cabo la operación inversa.

No hay un número fijo de bytes por instrucción en i386. Algunos son de un solo byte, algunos son mucho más largos.

2

Si le parece tan extraño como parece, no creo que un depurador o desensamblador vaya a ayudar, primero debe aprender la programación del ensamblador; estudie la arquitectura del procesador (mucha documentación descargable de Intel). Y como la mayoría de los códigos de máquina son generados por los compiladores, deberá comprender cómo los compiladores generan código, la forma más sencilla de escribir muchos pequeños programas y luego desmontarlos para ver en qué se convierte su C/C++.

Un par de libros que te ayudarán a comprender: -

1

Sólo en relación con esta pregunta, alguien todavía leer cosas como CD 21?

Recordé a Sandra Bullock en un espectáculo, de hecho, leí una pantalla con números hexadecimales y descubrí qué hace el programa. Algo así como la versión actual de leer el código de Matrix.

si lee cosas como CD 21, ¿cómo recuerda las diferentes combinaciones?

+0

De la misma manera los programadores que no entienden inglés aprende a codificar en idiomas con sintaxis en inglés. Creo que cualquiera que haya codificado el nivel bajo en DOS recordaría CD 21, sin embargo. –

1

Tanto su curiosidad como su nivel de comprensión es exactamente donde estaba en un punto. I altamente recomendar Code: The Hidden Language of Computer Hardware and Software.Esto no responderá a todas las preguntas que haga aquí, pero arrojará luz sobre algunos de los aspectos de magia completamente negro de las computadoras. Es un libro grueso pero altamente legible.

1

ACD See probablemente esté aprovechando el hecho de que los archivos .EXE no verifican errores en la longitud del archivo o algo más allá de la longitud de la parte esperada del archivo. Debido a esto, puede crear un archivo .EXE que se abrirá automáticamente y cargará todo lo que esté más allá de un punto determinado como datos. Esto es útil porque puede hacer un .EXE que funcione en un conjunto de datos dado al tachar esos datos al final de un .EXE

adecuadamente escrito (no tengo idea de qué es exactamente ACD See así que tome eso con un gran grano de sal, pero yo hago saben que algunos programa se generan de esta manera.)

+0

ACD See es un software de edición de fotografías en general.http://www.acdsee.com/ –

2

para tener una idea, establezca un punto de interrupción en algún código interesante, y luego ir a la ventana de la CPU.

Si está interesado en más, es más fácil compilar fragmentos cortos con Free Pascal usando el parámetro --al.

FPC permite generar el ensamblador generado en una multitud de formatos de ensamblador (TASM, MASM, GAS) usando el parámetro -A, y puede tener el código pascal original entrelazado en comentarios (y más) para facilitar la referencia cruzada.

Como es ensamblador generado por el compilador, a diferencia del ensamblador del .exe desmontado, es más simbólico y más fácil de seguir.

+0

+1, estoy usando Delphi en 'base casual' y me han intrigado las CPU, FPU, etc ... ventanas donde se puede pasar de una instrucción a otra y ver que esta pasando. Me preguntaba cómo estas instrucciones se convierten en un archivo EXE. Y cómo se pueden generar los archivos EXE (ver ACD Ver ejemplo). Me gusta especialmente la idea introducida por BCS :) –

+0

http://www.stack.nl/~marcov/compiler.pdf es una versión en PDF de la casi imposible de perderse el tutorial de Crenshaw. Desafortunadamente para una CPU diferente (m68k), pero ilustra bastante bien los fundamentos de un compilador. –

1

La familiaridad con el ensamblaje de bajo nivel (y me refiero al ensamblaje de bajo nivel, no "macros" y ese toro) es probablemente una necesidad. Si realmente quieres leer el código de la máquina en bruto directamente, normalmente usarías un editor hexadecimal para eso. Sin embargo, para entender lo que hacen las instrucciones, la mayoría de las personas usaría un desensamblador para convertirlo en las instrucciones de ensamblaje apropiadas. Si usted es uno de la minoría que quiere entender el lenguaje de la máquina en sí, creo que le gustaría el Intel® 64 and IA-32 Architectures Software Developer's Manuals. Volumen 2 cubre específicamente el conjunto de instrucciones, que se relaciona con su consulta acerca de cómo leer el código de la máquina en sí y cómo se relaciona con el conjunto.

Cuestiones relacionadas