Confundiendo IAT, IT y la localizacion?

Iniciado por x64core, 27 Marzo 2012, 10:09 AM

0 Miembros y 1 Visitante están viendo este tema.

x64core

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.

Eternal Idol

!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
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

x64core

#2
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

Eternal Idol

Usa lm para enumerar los modulos y fijate cual es el de tu programa ...
La economía nunca ha sido libre: o la controla el Estado en beneficio del Pueblo o lo hacen los grandes consorcios en perjuicio de éste.
Juan Domingo Perón

Иōҳ

<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.
Eres adicto a la Ing. Inversa? -> www.noxsoft.net

Arkangel_0x7C5

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

MCKSys Argentina

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... :)
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."