Autor
|
Tema: [DUDA] Direccion Relativas (Leído 5,622 veces)
|
x64core
Desconectado
Mensajes: 1.908
|
Hola! bueno en mi libro que estudio no e llegado a esta parte ( no se si esta ) 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 mi problema creo que es sobre direcciones relativasbueno 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 no entiendo :/
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
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.htmE9 cd JMP rel32 Jump near, relative, displacement relative to next instructionA 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).
|
|
« Última modificación: 1 Enero 2012, 00:26 am por Eternal Idol »
|
En línea
|
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
Desconectado
Mensajes: 1.908
|
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 ...
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
http://faydoc.tripod.com/cpu/jmp.htmhttp://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 ...
|
|
« Última modificación: 1 Enero 2012, 12:01 pm por Eternal Idol »
|
En línea
|
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
Desconectado
Mensajes: 1.908
|
Excelente! gracias de nuevo EI perfecto!
|
|
|
En línea
|
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
De nada
|
|
|
En línea
|
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:.
|
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
|
|
« Última modificación: 2 Enero 2012, 01:54 am por .:UND3R:. »
|
En línea
|
Solicitudes de crack, keygen, serial solo a través de mensajes privados (PM)
|
|
|
Eternal Idol
Kernel coder
Moderador
Desconectado
Mensajes: 5.969
Israel nunca torturó niños, ni lo volverá a hacer.
|
|
|
|
En línea
|
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
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Posiciones relativas a la pantalla
Programación Visual Basic
|
~~
|
0
|
1,040
|
7 Octubre 2006, 21:48 pm
por ~~
|
|
|
Posiciones relativas a la pantalla
Programación Visual Basic
|
~~
|
4
|
1,854
|
7 Octubre 2006, 23:05 pm
por Hans el Topo
|
|
|
Rutas relativas
.NET (C#, VB.NET, ASP)
|
juanroma9
|
1
|
3,223
|
22 Mayo 2008, 19:03 pm
por »~^~«CkNU!»~^~«
|
|
|
Rutas Absolutas y Relativas de Windows en JAVA
Java
|
cyberserver
|
4
|
10,912
|
6 Diciembre 2009, 05:06 am
por cyberserver
|
|
|
De coordenadas absolutas a relativas.
Scripting
|
moikano→@
|
0
|
4,142
|
24 Junio 2010, 23:00 pm
por moikano→@
|
|