Cuestión : ¿IAT que remienda, problema al llamar detrás a la función original de la blanco?

Hola, el

I se preguntaba si un experto podría ayudarme con IAT que remendaba en O/Ss basado NT pues he venido un poco unstuck.  Estoy intentando instalar un gancho del API usar la inyección del DLL (técnica de LoadLibrary/CreateRemoteThread), y después remiendo unas par de funciones de OpenGL para poder interceptar sus parámetros y realizar operaciones antes de llamar las originales.  Todo el esto está trabajando aparte de, parece, cuando llamo de nuevo a las versiones originales de las funciones que tienen una lista de parámetro - la llamada detrás a las funciones sin parámetros es sospechoso de fine.

I que es cómo he especificado por los indicadores de la función, yo es nuevo a esta técnica y no puede parecer imaginar que sea la manera correcta de hacer cosas.  Cuando llamo de nuevo a las funciones originales con la lista de parámetro apenas estrella el código de la blanco process.

The que estoy utilizando soy como sigue: - indicador del

//a la función original:

void (*glRotatefOrig de WINAPI) (ángulo de GLfloat, GLfloat x, GLfloat y, GLfloat z); código del

//para conseguir el indicador original de la función:

glRotatefOrig = (vacío (WINAPI *) (GLfloat, GLfloat, GLfloat, GLfloat)) GetProcAddress (hMod, “glRotatef”); hMod = manija de // al openGL module.

//mi propio implentation de la función (esto es llamada con éxito por la blanco de proceso después de remiendo de IAT): myglRotatef del

void (ángulo de GLfloat, GLfloat x, GLfloat y, z)
{console->Write del
(“glRotatef de GLfloat llamado \ n”); glRotatefOrig del ok
de las impresiones de // (ángulo, x, y, z); // esta llamada estrella el uso (ningún error significativo dado). ¿el

Can cualquier persona del
} me señala posiblemente a donde estoy saliendo mal?  He intentado maneras diferentes numerosas de especificar el indicador original de la función pero todo el extremo en rasgones: /

Cheers por adelantado si usted puede ayudar,
Chris
class= del

Respuesta : ¿IAT que remienda, problema al llamar detrás a la función original de la blanco?

Hola Chris,

El remendar de IAT es algo que toqué el violín con bastante no hace mucho tiempo: Los libros de J.Richter son realmente lectura requerida en esto:)

Escribí una clase de la envoltura, inspirada por el caballero antedicho, tales como quien me permitió enganchar con éxito funciones:: MessageBox etc.  He atado mi clase del ayudante abajo, junto con uso del ejemplo.  Probarlo por favor usar sus funciones de OpenGL - debe trabajar sin problema.

Usted verá eso cuando engancho la llamada:: MessageBox, cambio el texto que era especificado original “yo ha enganchado esta llamada!”
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
// fijó el gancho
VERIFICAR (CFuncInAPIHook:: Citar como ejemplo () .HookFunction (_T (“user32.dll”), _T (“MessageBoxW”), AfxGetInstanceHandle (), &MyMessageBox (PROC)));

Procedimiento del reemplazo de //
internacional WINAPI MyMessageBox (hWnd de HWND,
    lpText de LPCTSTR,
    lpCaption de LPCTSTR,
    uType de UINT
)
{
	¡El indicador de la función de // debe tener la misma convención de llamada que PROC (WINAPI)!  ¡Por lo tanto, prepend WINAPI (__stdcall)!
	typedef internacional  (*MESSAGEBOX_FUNC) de WINAPI (HWND, LPCTSTR, LPCTSTR, UINT);

	¡// recupera solamente la dirección de función original una vez!
	pFunc estático de MESSAGEBOX_FUNC = (MESSAGEBOX_FUNC) CFuncInAPIHook:: Citar como ejemplo () .RetrieveOriginalAPIFunctionAddress (_T (“user32.dll”), _T (“MessageBoxW”));
	AFIRMAR (pFunc);
	¿volver el pFunc? ¡(*pFunc) (hWnd, _T (“he enganchado esta llamada! "), lpCaption, uType): 0;
}

// esta llamada será enganchado
:: MessageBox (FALTA DE INFORMACIÓN, _T (""), _T (“título”), MB_OK);
Otras soluciones  
 
programming4us programming4us