Pregunta

Tengo este programa que estoy intentando realizar con ingeniería inversa. No sé si fue o no el optimizador u ofuscación del compilador, pero ahora algunas partes del código que llaman a otras funciones se calculan mediante matemáticas y luego se denominan como

CALL EAX 

Funciona correctamente hasta que se carga como DLL en otro programa. Las compensaciones de la dirección base se cambiaron, por lo que ahora todo el código relativo funciona correctamente, pero todas las llamadas / jmps calculadas matemáticamente no van a las áreas adecuadas.

Así que pensé que solucionaría esto fácilmente convirtiendo todas las llamadas absolutas en llamadas relativas.

Mientras paso el código y dejo que se calculen todas las matemáticas, obtengo la compensación correcta de jmp / call.

No tengo problemas como no tener suficiente espacio para asignar el parche. Dado que la llamada absoluta generalmente usa la línea anterior, la cual también podría usar para arreglar las cosas

Llamada absoluta, aquí es donde terminan las matemáticas:

seg000:0044F7D1                 add     eax, 3B882683h
seg000:0044F7D6                 call    eax

para convertir en Me gusta

seg000:0044F7D1                 call     3B882683h

Bueno, lo anterior, por supuesto, no funcionará porque eax ya era algo, pero es solo un ejemplo de pseudocódigo

Bueno, mi pregunta no es cómo hacer esto, pero ¿hay algún complemento que lo haga automáticamente por mí en OllyDbg o IDA Pro?

¿Fue útil?

Solución

desea obtener la dirección calculada de las llamadas variables, eso es realmente difícil de averiguar porque no son iguales, como lo explicó en esta parte

seg000: 0044F7D1 agregar eax, 3B882683h seg000: 0044F7D6 llamar a eax

Sería muy fácil crear un complemento de este tipo, pero nunca es así. El EAX podría cambiar en esa parte del código, por eso la llamada es una "variable". Imagínese, una parte del código controla una puerta en un juego o lo que sea, si no se le permite pasar EAX o cualquier otro registro cambiaría para llamar a la función para no dejarle pasar, de lo contrario se le permite porque tiene una llave o algo así y el código cambiará EAX a la dirección en la que la llamada ejecuta el código para abrir la puerta. Eso fue solo un ejemplo porque hay llamadas con variables. Un complemento en el que piensa, debe escuchar todas las llamadas posibles que pueden ser una masa realmente gigantesca y causarían errores o ninguna descripción general.

Entonces, la forma más fácil para usted es interrumpir esta llamada y leer el registro. Espero que te pueda ayudar a entender o no respondí bien, tu pregunta es un poco engañosa porque dijiste cosas sobre los JMP y una inyección de dll que me irrita. Me lo puedes contar con más detalle en un mensaje privado o aquí.

Otros consejos

puedes usar LoadLibrary

use KERNEL32.LoadLibraryA

KERNEL32.GetProcAddress

llamar a eax

KERNEL32.FreeLibrary

también cuando importa un encabezado, todas las direcciones de funciones se guardan en las direcciones estables.La dirección de las funciones son cambios, pero siempre llama a estas direcciones estables, no la dirección de sus funciones.

puede ver la dirección de las funciones dll por algún programa como "pe explorer". ingrese la descripción de la imagen aquí

Siempre llama al 00402008h, pero 00402008h no es la dirección de su función. el valor de 00402008 es la dirección de su función.

  • FF25 08204000 llamará al valor 00402008
  • E8 05000000 llamará a eip + 00000005
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top