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
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
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.