Buenas a todos bueno veran estoy estudiando mas sobre la estructure PE en los programas hechos con MASM32
y bueno me e fijado que siempre que uso APIs en la sección de codigo me genera unos JMPs a las APIs, y me puse a averiguar
del porque.
y por ejemplo este sencillo codigo ( lo muestro de una vez el dessensamblado):
00401000 >/$ 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
00401002 |. 68 05304000 PUSH TEST.00403005 ; |Title = "cap"
00401007 |. 68 00304000 PUSH TEST.00403000 ; |Text = "test"
0040100C |. 6A 00 PUSH 0 ; |hOwner = NULL
0040100E |. E8 0D000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA
00401013 |. 6A 00 PUSH 0 ; /ExitCode = 0
00401015 \. E8 00000000 CALL <JMP.&kernel32.ExitProcess> ; \ExitProcess
0040101A .-FF25 00204000 JMP DWORD PTR DS:[<&kernel32.ExitProcess>; kernel32.ExitProcess
00401020 $-FF25 08204000 JMP DWORD PTR DS:[<&user32.MessageBoxA>] ; user32.MessageBoxA
00401026 00 DB 00
00401027 00 DB 00
hasta ahora supongo que seria la Import table que se rellena con las direcciones pero ahora
viendo con analizador PE ( es mismo programa) la import table esta en la direccion:
Virtual Address Size
Import Table: 00402010 0000003C
se supone que estaria en la direccion tal pero... no.
no se supondria que el call saltaria a la import table? tambien quiza estoy confundiendo con la IAT pero ya me e leido algunos conceptos
creo que estoy confundido no :| o falta algo por explicar :P
tambien me e fijado que depurando algunos codigo de programas cuando hacen algun call a una API no salta a una tabla que vendria siendo la IT
sino salta de una sola vez a la API sin pasar a un JMP antes, el JMP deberia ser siempre no :|
bueno gracias y perdon y fue larga pero no encontre una forma más corta para darme a entender lo hice lo mas corto posible.
!dh modulo en WinDbg.
Ejemplo:
0:000> !dh kernel32
File Type: DLL
FILE HEADER VALUES
14C machine (i386)
4 number of sections
4E211318 time date stamp Sat Jul 16 06:27:04 2011
0 file pointer to symbol table
0 number of symbols
E0 size of optional header
2102 characteristics
Executable
32 bit word machine
DLL
OPTIONAL HEADER VALUES
10B magic #
9.00 linker version
D0000 size of code
30000 size of initialized data
0 size of uninitialized data
132A3 address of entry point
10000 base of code
----- new -----
75000000 image base
10000 section alignment
10000 file alignment
3 subsystem (Windows CUI)
6.01 operating system version
6.01 image version
6.01 subsystem version
110000 size of image
10000 size of headers
1164FD checksum
00040000 size of stack reserve
00001000 size of stack commit
00100000 size of heap reserve
00001000 size of heap commit
140 DLL characteristics
Dynamic base
NX compatible
BF9F8 [ A8FF] address [size] of Export Directory
CA2F8 [ 1F4] address [size] of Import Directory
F0000 [ 528] address [size] of Resource Directory
0 [ 0] address [size] of Exception Directory
0 [ 0] address [size] of Security Directory
100000 [ AD58] address [size] of Base Relocation Directory
D0108 [ 38] address [size] of Debug Directory
0 [ 0] address [size] of Description Directory
0 [ 0] address [size] of Special Directory
0 [ 0] address [size] of Thread Storage Directory
830F8 [ 40] address [size] of Load Configuration Directory
0 [ 0] address [size] of Bound Import Directory
10000 [ DF0] address [size] of Import Address Table Directory
0 [ 0] address [size] of Delay Import Directory
0 [ 0] address [size] of COR20 Header Directory
0 [ 0] address [size] of Reserved Directory
dps kernel32+10000
jeje ;-)
que buena informacion la que me mostro. Eternal porque no puedo cargar el exe?
primero intente con el notepad... carge el notepad luego
!dh notepad.exe
y me mostro la informacion, luego intente cargar mi exe de MASM y no me mostraba ni errores ni nada simplemente no
mostraba nada :|
PD. tambie no entiendo porque MASM genera un "pre"-JMP pudiendo hacer el call a la IAT directamente :P
comparando el compilador de VC con MASM no se porque lo hace :P
Usa lm para enumerar los modulos y fijate cual es el de tu programa ...
<http://ricardonarvaja.info/WEB/CURSO NUEVO/TEORIAS NUMERADAS/201-300>
254-IMPORT TABLES A MANO (parte 2).rar
253-IMPORT TABLES A MANO (parte 1).rar
256-IMPORT TABLES A MANO (parte 4).rar
255-IMPORT TABLES A MANO (parte 3).rar
Saludos,
Nox.
Cita de: RHL en 27 Marzo 2012, 11:57 AM
jeje ;-)
que buena informacion la que me mostro. Eternal porque no puedo cargar el exe?
primero intente con el notepad... carge el notepad luego
!dh notepad.exe
y me mostro la informacion, luego intente cargar mi exe de MASM y no me mostraba ni errores ni nada simplemente no
mostraba nada :|
PD. tambie no entiendo porque MASM genera un "pre"-JMP pudiendo hacer el call a la IAT directamente :P
comparando el compilador de VC con MASM no se porque lo hace :P
Lo del jmp puede ser para las reubicaciones, que a la hora de reubicar, no es lo mismo hacerlo en un jmp que en 20 call
Saludos
La IT y la IAT en principio son la misma tabla (en realidad, arrays). El tema es que cuando el loader carga el EXE, cambia los valores de una para que macheen con las direcciones donde estan realmente cargadas las funciones importadas (por el tema de las relocaciones de las DLLs). Por eso ves JMPs a la tabla de saltos.
Para ver el tema a fondo, te recomiendo los PE tutorials de Iczelion, en especial el de Import Table:
http://win32assembly.online.fr/pe-tut6.html
Saludos!
PD: tambien esta el tema de Bound Import, pero el tute lo explica mejor que yo... :)