• Domingo 15 de Diciembre de 2024, 14:19

Autor Tema:  Codigo Asm Generado Por Un Compilador De C  (Leído 3263 veces)

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Codigo Asm Generado Por Un Compilador De C
« en: Jueves 22 de Marzo de 2007, 16:25 »
0
Hola, queria saber como es posible ver el codigo en ASM que genera un compilador de C del codigo.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #1 en: Jueves 22 de Marzo de 2007, 16:48 »
0
Con cualquier desensamblador lo podes hacer. Si usas VC++ hay un programa llamado dumpbin al cual le podes pasar el objeto (.obj) o ejecutable (.exe,.dll,.sys,etc) y con el modificador /disasm te dara el codigo. Tambien podes usar un depurador para no solo ver el codigo estaticamente sino en ejecucion (instruccion por instruccion).

Para empezar a ver cosas simples te recomiendo trabajar con dumpbin /disasm archivo.obj ya que el obj no cuenta con la Run Time Library es un archivo de un tamaño mucho mejor y por donde te podes manejar con mayor soltura.


Un ejemplito que yo haria (TODO PARA 32 BITS), suma.cpp:
Código: Text
  1.  
  2. #include <stdio.h>
  3.  
  4. void main()
  5. {
  6.   printf("%d\r\n", 2 + 2);
  7. }
  8.  
  9.  

cl /c suma.cpp (solo compilamos, genera el obj pero no el exe).

¿Crees que vas a ver alguna suma realmente? La respuesta es que no hay ningun add en el codigo generado en este caso ya que es posible obtener el resultado en tiempo de compilacion.

Si hacemos dumpbin /disasm suma.obj > suma.txt

Tendremos este output el archivo:
Código: Text
  1.  
  2. Microsoft (R) COFF/PE Dumper Version 7.10.6030
  3. Copyright (C) Microsoft Corporation.  All rights reserved.
  4.  
  5.  
  6. Dump of file ej.obj
  7.  
  8. File Type: COFF OBJECT
  9.  
  10. _main:
  11.   00000000: 55                 push        ebp
  12.   00000001: 8B EC              mov         ebp,esp
  13.   00000003: 6A 04              push        4
  14.   00000005: 68 00 00 00 00     push        offset $SG608
  15.   0000000A: E8 00 00 00 00     call        _printf
  16.   0000000F: 83 C4 08           add         esp,8
  17.   00000012: 33 C0              xor         eax,eax
  18.   00000014: 5D                 pop         ebp
  19.   00000015: C3                 ret
  20.  
  21.   Summary
  22.  
  23.           54 .debug$S
  24.           2A .drectve
  25.            5 .rdata
  26.           16 .text
  27.  
  28.  

Podemos ver como se crea el frame para la pila (trabajo hecho con ebp y esp). Como se le pasa el parametro de la suma (4) y despues el del texto (un offset a la seccion de datos) y como se hace la llamada a printf (el guion bajo es tipico de la convencion de llamada C) al igual que el arreglar la pila despues de una llamada (add esp, 8 en este caso ya que pasamos 2 parametros y la pila es de DWORDs que ocupan 4 bytes). Finalmente vemos que pese a declarar como void el main el compilador devuelve como codigo de retorno al sistema un cero (xor eax, eax) en el registro eax. Finalmente restaura la pila al estado en que fue llamada (pop ebp) y retorna a quien sea que lo haya llamado (ret).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #2 en: Jueves 22 de Marzo de 2007, 17:15 »
0
Muchas Gracias por la explicacion, pero no uso el VC++. :(

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #3 en: Jueves 22 de Marzo de 2007, 17:23 »
0
Cita de: "AnioN"
Muchas Gracias por la explicacion, pero no uso el VC++. :(
Esa no es una respuesta valida cuando podes descargarlo gratuitamente eh  :P

Podes usar el WinDbg o el OllyDbg para depurarlo (tambien son gratis).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #4 en: Jueves 22 de Marzo de 2007, 19:04 »
0
Muchas Gracias. El MASM lo trae al dumpbin, pero en una version un poco mas vieja.

Citar
Microsoft ® COFF Binary File Dumper Version 5.12.8078
Copyright © Microsoft Corp 1992-1998. All rights reserved.

Para el fin sirve, muchas Gracias. :D Fue muy pero muy explicita tu explicacion.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #5 en: Jueves 22 de Marzo de 2007, 19:59 »
0
Cita de: "AnioN"
Para el fin sirve, muchas Gracias. :D Fue muy pero muy explicita tu explicacion.
De nadas, no son cosas sencillas si uno parte de -1 asi que trate de darte un empujoncito  ;)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #6 en: Jueves 22 de Marzo de 2007, 20:47 »
0
Citar
printf (el guion bajo es tipico de la convencion de llamada C)
Si no tiene el guión bajo ¿Es stdcall?
Aprovecho para sacarme dudas:

¿Cual es la utilidad de tener el programa dentro de una funcion (main)?
¿Sale del programa con tan solo RET? ¿No falta ExitProces?
Lo vengo haciendo así, es decir sin tener el codigo en una funcion:
Código: Text
  1.  
  2.                 call     [AllocConsole]
  3.                 push     STD_OUTPUT_HANDLE
  4.                 call     [GetStdHandle]
  5.                 mov     [out_handle], eax; handle de salida de la consola
  6.                 push     0                      
  7.                 push     NumerosEscritos; cantidad de numeros escritos
  8.                 push     1              &#59; cantidad de numeros para escribir
  9.                 push    szCadena
  10.                 push     [out_handle]
  11.                 call     [WriteConsole]
  12.                 call     [ExitProcces]
  13.  
  14.  

PD: por sierto, cual es la dll en donde está _printf ¿msvcrt?
¿Hay que tener el VC++ instalado para tenerla? o viene con windows? Yo la tengo pero tambien tengo VC#

bob esponja

  • Miembro MUY activo
  • ***
  • Mensajes: 411
    • Ver Perfil
    • http://marianoguerra.blogspot.com
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #7 en: Jueves 22 de Marzo de 2007, 21:24 »
0
Gcc tiene una opcion que en vez de generar un binario genera assembly,
es muy util cuando uno esta escribiendo un compilador y quiere saber como se
imlementa el paso de parametros :D

para eso lo use yo.

Use the -S (note: capital S) switch to GCC, and it will emit the assembly code to a file with a .s extension. For example, the following command:

  gcc -O2 -S -c foo.c

will leave the generated assembly code on the file foo.s.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #8 en: Jueves 22 de Marzo de 2007, 21:30 »
0
Cita de: "Enko"
Si no tiene el guión bajo ¿Es stdcall?

Generalmente si, stdcall es tipo Funcion@NumeroDeParametros*4.

Cita de: "Enko"
¿Cual es la utilidad de tener el programa dentro de una funcion (main)?

Es standard y la pueden llamar desde cualquier lado.

Cita de: "Enko"
¿Sale del programa con tan solo RET? ¿No falta ExitProces?

Si. main es en realidad llamada por la Run Time Library (donde esta _printf si la usas estaticamente) y puede o no usar ExitProcess pero es ya un tema de implementacion, cuando haces un ejecutable para Windows este te llama a tu punto de entrada desde la Kernel32 y la direccion que te deja en la pila es la de un codigo que hace push eax (lo que devuelva tu entry point) y call ExitThread (que desencadena al final ExitProcess) B)

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #9 en: Jueves 22 de Marzo de 2007, 21:33 »
0
Cita de: "bob esponja"
Gcc tiene una opcion que en vez de generar un binario genera assembly,
es muy util cuando uno esta escribiendo un compilador y quiere saber como se
imlementa el paso de parametros :D
Obviamente VC++ tambien lo soporta pero dumpbin sirve para objetos/binarios ya hechos y lo tengo mas incorporado.

En VC++ estan:
/FA
 Assembly code; .asm
 
/FAc
 Machine and assembly code; .cod
 
/FAs
 Source and assembly code; .asm

If /FAcs is specified, the file extension will be .cod

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

Enko

  • Miembro de PLATA
  • *****
  • Mensajes: 1562
  • Nacionalidad: 00
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #10 en: Jueves 22 de Marzo de 2007, 21:37 »
0
Gracias por las aclaraciones. :)


Para desensamblar está tambien el Win32Dasm, jajajajaj, que  cosa más vieja pero comenta el codigo y permite seguir los saltos.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #11 en: Jueves 22 de Marzo de 2007, 21:45 »
0
Cita de: "Enko"
Para desensamblar está tambien el Win32Dasm, jajajajaj, que  cosa más vieja pero comenta el codigo y permite seguir los saltos.
En desensamblador el IDA no tiene competencia pero no creo que sea el adecuado cuando apenas arrancas  :P

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

su -

  • Moderador
  • ******
  • Mensajes: 2349
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #12 en: Viernes 23 de Marzo de 2007, 01:00 »
0
*******PELIGRO LEE ESTO!!*******

There is no place like 127.0.0.1

Conecto luego existo, no conecto luego insisto.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #13 en: Viernes 23 de Marzo de 2007, 02:10 »
0
Cita de: "Eternal Idol"
Cita de: "AnioN"
Para el fin sirve, muchas Gracias. :D Fue muy pero muy explicita tu explicacion.
De nadas, no son cosas sencillas si uno parte de -1 asi que trate de darte un empujoncito  ;)
necesitaria un empujoncito con ASM, porque la verdad lei de todo y no tengo forma de encaminarme. Es tan distinto de todo lo que vi, o sea, no se ni como empezar.

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #14 en: Viernes 23 de Marzo de 2007, 09:50 »
0
Cita de: "AnioN"
necesitaria un empujoncito con ASM, porque la verdad lei de todo y no tengo forma de encaminarme. Es tan distinto de todo lo que vi, o sea, no se ni como empezar.
Si leiste los enlaces que estan en el foro de ensamblador y no entendes yo te recomiendo comprar un libro. Por ejemplo este:

http://www.casadelibro.com/fichas/fichabib...INCLUYE+CD-ROM)

Empieza desde -1, con varios capitulos de explicaciones en general de la arquitectura pero a la vez desde el comienzo ya vas a viendo unos hello world's para MS-DOS, Windows y Linux. Despues tiene mucho sobre MS-DOS y bastante sobre la BIOS en lo que yo no me concentraria demasiado (con leer los ejemplos y entender muy por encima como funciona sobra), despues seguiria con el capitulo que prefiera de Linux o Windows.

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.

AnioN

  • Miembro MUY activo
  • ***
  • Mensajes: 339
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #15 en: Viernes 23 de Marzo de 2007, 11:21 »
0
Gracias por la recomendacion, pero por lo que busque aca en argentina no existe el libro. No habra una version digital como para que pueda ojear un poco y ver si vale la pena que lo pida para importar?

Eternal Idol

  • Moderador
  • ******
  • Mensajes: 4696
  • Nacionalidad: ar
    • Ver Perfil
Re: Codigo Asm Generado Por Un Compilador De C
« Respuesta #16 en: Viernes 23 de Marzo de 2007, 11:38 »
0
Cita de: "AnioN"
Gracias por la recomendacion, pero por lo que busque aca en argentina no existe el libro. No habra una version digital como para que pueda ojear un poco y ver si vale la pena que lo pida para importar?
Que yo sepa no hay, al menos no viene con el libro ni la vi jamas por ahi. Lo que si viene es el codigo de los ejemplos y las herramientas necesarias (MASM/32, NASM, FASM, etc).

Nacional y Popular En mi país la bandera de Eva es inmortal.


Queremos una Argentina socialmente justa, económicamente libre y  políticamente soberana.
¡Perón cumple, Evita dignifica!


La mano invisible del mercado me robo la billetera.