Estoy usando Detours para engancharme a la función de mensaje de un ejecutable, pero necesito ejecutar mi propio código y luego llamar al código original. Por lo que he visto en los documentos de Detours, definitivamente parece que eso debería suceder automáticamente. La función original imprime un mensaje en la pantalla, pero tan pronto como conecto un desvío, comienza a ejecutar mi código y deja de imprimir.Necesito llamar a la función original desde la función desviada
El código de función original es más o menos:
void CGuiObject::AppendMsgToBuffer(classA, unsigned long, unsigned long, int, classB);
Mi función es:
void CGuiObject_AppendMsgToBuffer([same params, with names]);
sé la posición de memoria de la función original reside en, por lo que usar:
DWORD OrigPos = 0x0040592C;
DetourAttach((void*)OrigPos, CGuiObject_AppendMsgToBuffer);
me lleva a la función. Este código funciona casi a la perfección: mi función se llama con los parámetros adecuados. Sin embargo, la ejecución deja mi función y no se llama al código original. Intenté regresar, pero eso bloquea el programa (supongo que el código que Detours movió para encajar en el anzuelo es responsable del colapso).
Editar: He logrado solucionar el primer problema, sin volver a la ejecución del programa. Al llamar al valor de OrigPos como una función, puedo ir a la función "trampolín" y desde allí al código original. Sin embargo, en algún lugar a lo largo de las líneas, los registros están cambiando y eso está causando que el programa falle con una segfault tan pronto como regrese al código original.
Edit2: Final de código de trabajo:
class CGuiObject
{
public:
void MyFunc([params]);
};
DWORD TrueAddr = 0x0040592C;
CGuiObject::MyFunc([params])
{
_asm { pushad }
// process
_asm {
popad
leave
jmp TrueAddr
}
}
y el uso de TrueAddr para el primer parámetro en DetourAttach.
¿Puedes pasar por esto en un desensamblador? –
Sí, incorporé la depuración y establecí un punto de interrupción al comienzo de mi función. El código golpea que, me pushad, haga un poco de registro (envíe el mensaje a un flujo de datos usando el operador <<), popad y jmp a la dirección que devuelve Detours. La ejecución pasa por las cosas copiadas y vuelve al ejecutable original. Se ejecuta por algunas líneas, pero hasta donde puedo ver, ECX se restablece a 0 y se utiliza como un puntero, de ahí la segfault. Si eso no ayuda, puedo publicar el código completo con asm. – ssube