2010-03-23 16 views
6

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.

+0

¿Puedes pasar por esto en un desensamblador? –

+0

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

Respuesta

1

Dado que está intentando interceptar una llamada de método C++, es probable que tenga un problema de convención de llamada cuando llame a la función original.

No he intentado hacer esto personalmente con desvíos, pero esta publicación apunta a algo que podría ayudarlo. C++ — Detours (Win32 API Hijacking) — Hijack Class Methods Ver el enlace en la segunda respuesta.

+0

Esto funcionó, de una manera redonda. Al final, creé una clase de esqueleto que funciona perfectamente. Incluso puede llamarse a sí mismo para insertar mensajes en la cola u omitir las partes finales para evitar un mensaje. Gracias por el enlace! :) – ssube

Cuestiones relacionadas