Saludos, estoy trabajando en un programa de Ensamblador/Desensamblador pero no consigo entender como trabajan las llamadas CALL a DLL. En un EXE generado por MASM que solo tiene el siguiente código:
.data
Titulo db "Mensaje",0
Texto db "Hola Mundo",0
.code
start:
invoke MessageBox,0 , offset Texto, offset Titulo,1
invoke ExitProcess,eax
end start
Utilizo PEExplorer para Desensamblar el código Generado y las 2 llamadas a dll aparecen como:
Direccion Bytes(Hex)
0040100E E807000000 call jmp_user32.dll!MessageBoxA
00401013 50 push eax
00401014 E807000000 call jmp_kernel32.dll!ExitProcess
----------------
0040101A FF2508204000 jmp [user32.dll!MessageBoxA]
00401020 FF2500204000 jmp [kernel32.dll!ExitProcess]
Obteniendo las direcciones 402000h y 402008h de la sección .rdata. Mirando en dicha sección obtengo la siguiente Import Table/Import Address Table:
Direccion Bytes(Hex)
00402000 76200000 dd ??
00402004 00000000 dd 00000000
00402008 5C200000 dd ??
0040200C 00000000 dd 00000000
00402010 54200000 dd 00002054h
00402014 00000000 dd 00000000h
00402018 00000000 dd 00000000h
0040201C 6A200000 dd 0000206Ah
00402020 08200000 dd 00002008h
00402024 4C200000 dd 0000204Ch
00402028 00000000 dd 00000000h
0040202C 00000000 dd 00000000h
00402030 84200000 dd 00002084h
00402034 00200000 dd 00002000h
00402038 00000000 dd 00000000h
0040203C 00000000 dd 00000000h
00402040 00000000 dd 00000000h
00402044 00000000 dd 00000000h
00402048 00000000 dd 00000000h
0040204C 76200000 dd 00002076h
00402050 00000000 dd 00000000h
00402054 5C200000 dd 0000205Ch
00402058 00000000 dd 00000000h
0040205C B101 dw 01B1h
0040205E 4D657373616765426F784100 db 'MessageBoxA',0
0040206A 7573657233322E646C6C00 db 'user32.dll',0
00402075 00 db 00h
00402076 9B00 dw 009Bh
00402078 4578697450726F6365737300 db 'ExitProcess',0
00402084 6B65726E656C33322E646C6C00 db 'kernel32.dll',0
00402091 00 db 00h
Lo que yo entiendo es que en la dirección 402000h esta el desplazamiento 2076h que me lleva a un Word que no se para que sirve (seguro que no esta ahí por casualidad) y al Texto del nombre de la función "ExitProcess" pero desconozco como llego a obtener "Kernel32.dll" aunque deduzco que hay que llegar a la dirección 402030h donde obtengo el desplazamiento 2084h que es donde está el Texto de la DLL. Si alguien puede explicarme como se estructura estas Tablas. Entiendo que Windows cuando carga un ejecutable en memoria Traduce todo esto a posiciones de memoria donde está cargada la DLL y que habrá muchas cosas más que desconozco, pero de momento me basta con poder generar a mano con un programa C++ un Ejecutable con su sección .rdata y sus llamadas a DLL tal y como lo hace MASM. Muchas gracias.