Inyeccion DLL para extender una funcion

Iniciado por GonzaFz, 28 Octubre 2015, 00:34 AM

0 Miembros y 2 Visitantes están viendo este tema.

GonzaFz

Estoy intentando capturar un mensaje que posteriormente sera un packet antes de que se encripte.
Tengo la direccion estatica de la funcion que quiero modificar, entonces mediante el siguiente algoritmo modifico el codigo para que cuando ingrese a esa funcion salte a mi codigo.
Código (cpp) [Seleccionar]
void JmpPatch(void *pDest, void *pSrc, int nNops = 0) {

DWORD OldProt;
VirtualProtect(pSrc, 5 + nNops, PAGE_EXECUTE_READWRITE, &OldProt);
PointTo = (DWORD)pSrc + 8;
*(char*)pSrc = (char)0xE9;
*(DWORD*)((DWORD)pSrc + 1) = (DWORD)pDest - (DWORD)pSrc - 5;

for (int i = 0; i < nNops; ++i) { *(BYTE*)((DWORD)pSrc + 5 + i) = 0x90; }

VirtualProtect(pSrc, 5 + nNops, OldProt, &OldProt);
}


El codigo funciona bien, salta a mi funcion, entonces lo que hago es ejecutar las instrucciones que habia reemplazado y despues volver a donde estaba (estoy haciendo pruebas solamente).

Esta es la funcion original en Assembler (yo coloco el jmp en 0x626324 y hago nop de dos bytes mas) y mas abajo estas la funcion mia a la que salto.

Código (cpp) [Seleccionar]
DWORD dir = 0x62632B;
void ImprimirLog()
{
__asm {
mov edi, [esp + 4 + DWORD PTR 0Ch]
shr edi, 2
push dir
ret
}
}


El problema es que cuando llego a mi funcion se me cambian todos los registros de la cpu y el stack, y se me hace un desastre y cuando hago el return se me corrompe todo.

Esto es antes de llegar a __asm { }


Y asi queda cuando entra a __asm { }



No tengo idea en que estoy fallando, ya probe un monton de cosas y quede ahi trabado.

MCKSys Argentina

Hola!

Lo mejor que puedes hacer es: correr el programa cuya DLL modificas con un debugger (Parece que estás en 32 bits, así que aconsejo Olly), le pongas un BP al inicio de la misma (HBP si modificas los bytes) y veas qué pasa cuando el HBP salta.

Es la mejor opción para comprender qué estás haciendo mal.

Saludos!
MCKSys Argentina

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


tincopasan

supongo que cuando saltas a tu función haces un pushad (para mantener el valor de los registros) y cuando termina tu función un popad

GonzaFz

Cita de: MCKSys Argentina en 28 Octubre 2015, 04:39 AM
Hola!

Lo mejor que puedes hacer es: correr el programa cuya DLL modificas con un debugger (Parece que estás en 32 bits, así que aconsejo Olly), le pongas un BP al inicio de la misma (HBP si modificas los bytes) y veas qué pasa cuando el HBP salta.

Es la mejor opción para comprender qué estás haciendo mal.

Saludos!

Eso habia hecho y era que cuando ingresaba a la funcion (como yo hacia un jump) el prologo y el epilogo me destrozaban los registros.
Ahora encontre que tengo que poner al comienzo de la definicion de mi funcion a la cual hago el jump lo siguiente
__declspec(naked) definicion(parametros) {}

Eso hace que evite el prologo y el epilogo de manera que salta directo a las instrucciones.