[DUDA] Direccion Relativas

Iniciado por x64core, 31 Diciembre 2011, 23:58 PM

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

x64core

Hola!
bueno en mi libro que estudio no e llegado a esta parte ( no se si esta :P )
y el problema viene porque estuve programando unos opcodes en otro lenguaje y tuve problemas, y creo que por eso lo puse en asm porque tiene que ver con asm :P mi problema creo que es sobre direcciones relativas
bueno mi problema que no entiendo es sobre 'obtener direccion relativa'

el codigo de alto nivel hacia lo siguiente obtenia la direccion de un opcode que se hiba a ejecutar un jmp
una direccion de una funcion y hacia esta operacion:

resultado = Direccion funcion - direccion del opcode - 5

luego con la direccion resultado hacia: jmp resultado

y mi pregunta es porque hace eso? y todo es correcto la direccion esa salta a la direccion de la funcion :P no entiendo :/

Eternal Idol

#1
Al ser el salto RELATIVO a la direccion de la siguiente instruccion se usa el tamaño del propio jump (5) para el calculo.

http://faydoc.tripod.com/cpu/jmp.htm

E9 cd    JMP rel32    Jump near, relative, displacement relative to next instruction


A relative offset (rel8, rel 16, or rel32) is generally specified as a label in assembly code, but at the machine code level, it is encoded as a signed 8-, 16-, or 32-bit immediate value. This value is added to the value in the EIP register. (Here, the EIP register contains the address of the instruction following the JMP instruction). When using relative offsets, the opcode (for short vs. near jumps) and the operand-size attribute (for near relative jumps) determines the size of the target operand (8, 16, or 32 bits).
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

EI gracias ya empiezo a razonar respecto al tema!
por eso mismo ya veo que estaba codeando un opcode hacia una llamada a una API, le escribia el opcode call
y la direccion de la API y a la hora de ejecutar el codigo no me saltaba a la api :/ es por eso?
necesito obtener la direccion relativa de la api primero y saltar a la direccion relativa ?

y entonces siempre, siempre hay una direccion relativa en donde todos los calls, y jump saltan primero?
o es solo para funciones? o solamente para jumps?
porque tengo esto:


00401000 >/$ B8 50000000    MOV EAX,50
00401005  |. 33C0           XOR EAX,EAX
00401007  |. 33D2           XOR EDX,EDX
00401009  |. 6A 00          PUSH 0                                   ; /ExitCode = 0
0040100B  \. E8 0A000000    CALL <JMP.&kernel32.ExitProcess>         ; \ExitProcess
00401010   . B8 80000000    MOV EAX,80
00401015   . BA 50000000    MOV EDX,50
0040101A   .-FF25 00204000  JMP DWORD PTR DS:[<&kernel32.ExitProcess>;  kernel32.ExitProcess




y la direccion de la exitprocess es diferente :/

7554378E ExitProcess        8BC0             MOV EAX,EAX
75543790                    55               PUSH EBP
...




Eternal Idol

#3
http://faydoc.tripod.com/cpu/jmp.htm
http://faydoc.tripod.com/cpu/call.htm

¿De donde sacaste eso? Las llamadas a la API se suelen hacer mediante la IAT:
01351016 ff157c013601    call    dword ptr [exitproc!_imp__ExitProcess (0136017c)]

Igual hay diferentes tipos de saltos y llamadas, algunos son relativos y otros no. Por ejemplo ahi mismo en el codigo que dejaste tenes un salto que no es relativo, salta a la direccion que haya en el DWORD apuntado (0x402000). Depuralo y vas a ver con mas claridad como llega hasta ExitProcess ...
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

Excelente! gracias de nuevo EI  ;-)
perfecto!

Eternal Idol

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

.:UND3R:.

#6
Recordar que IAT es Import Addres Table que es una tabla encargada de contener las direcciones de las APIS para darnos de alguna u otra manera "portabilidad" en nuestras aplicaciones, esto funciona a través de IID (Image import descriptor) localizada en la tabla IT Import tables, que se inicializa antes de llegar al Entry point. Esta tabla contiene el nombre de las APIS y sus librerías y para determinar las direcciones que serán escribidas en la IAT se utiliza GetProcAddress

Para ver la IT debemos tener un visualizador de la cabecera PE como lo es por ejemplo el depurador OllyDBG (en la ventana DUMP, clic derecho->especial->header)
nos localizamos en en el address de la cabezera (por lo general 400000, si no sabemos nos vamos a memory, ahí OllyDBG nos mostrará desde que dirección comienza la cabecera) buscamos el address de IT en mi caso:

00400160    14420000    DD 00004214          ;  Import Table address = 4214

le sumamos la ImageBase que para mi es 400000 y nos da 404214 si nos dirigimos ahí encontraremos las IID que son 6 DWORD en donde las más importantes son la el penúltimo DWORD(5) y el último DWORD (6)

en mi caso el quinto es: 00404224  2C 40 00 00                                      ,@..
por lo que si le sumo la ImagenBase y nos dirigimos ahí (40402C), obtendremos la dirección ya resuelta (esto se debe a que detenido en el EP ya se han resuelto la dirección) pero si hacemos clic derecho y colocamos view executable file, veremos los datos que tiene en el disco rígido (sin inicializar el ejecutable) en mi caso es:

0000402C  08 44 00 00                                      D..

por lo que si le sumamos nuevamente la ImageBase nos dará 404408 y esto nos lleva a la string MessageBoxA por lo que el 5 valor (DWORD) de la IID ubicada en la IT corresponde a un puntero a la string de la API MessageBoxA y este obtiene su valor a través de GetProcAddress, una vez obtenida lo sobre escribe, por eso el por qué de que cuando ya estamos detenidos en el EP la IID está ya completa.

en cuanto al quinto valor apunta indirectamente a la string con el nombre de la .dll de la API a la cual se quiere obtener la dirección.

En resumen tenemos

IT esta se subdivide en IID que son conjuntos de 6 DWORD en donde el último y penúltimo subconjunto son importantes:
5-> apunta a la string de la API
6-> apunta a la librería (.dll)

esta se encarga de obtener las direcciones de las APIS de las máquinas y las sobre escribe en la IAT esta es en donde el programa por lo general solicita las direcciones de las APIS, digo general por que existe la posibilidad de que el programa sea alterado y utilice otras direcciones o que la IAT sea un intermediario (packers), pero en resumen la idea es la misma.

Espero que se te haya aclarado un poco todo, saludos


Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)

Eternal Idol

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