Frage : IAT, das, Problem ausbessert, wenn Sie zurück zur ursprünglichen Zielfunktion benennen?

Hallo, wunderte

I, wenn ein Experte mir mit IAT helfen könnte, das auf NT gegründetem O/Ss ausbessert, da ich unstuck wenig gekommen.  Ich versuche, einen API-Haken using DLL-Einspritzung (LoadLibrary/CreateRemoteThread Technik) anzubringen, und ausbessere dann ein paar OpenGL Funktionen, um in der Lage zu sein, ihre Parameter abzufangen und Betriebe durchzuführen er, bevor ich die Vorlagen benenne.  Das ganzes dieses arbeitet abgesehen von, scheint es, wenn ich zurück zu den ursprünglichen Versionen der Funktionen benenne, die eine Parameterliste haben - zurück benennen zu den Funktionen ohne Parameter ist fine.

I Verdächtiges, das es ist, wie ich durch Funktionszeiger spezifiziert, ich ist neu zu dieser Technik und kann nicht scheinen, herauszufinden, die die korrekte Weise des Handelns von Sachen ist.  Wenn ich zurück zu den ursprünglichen Funktionen mit der Parameterliste benenne, zerschmettert sie gerade den Code des Ziels process.

The, den ich bin verwende, wie folgt: -

//Zeiger zur ursprünglichen Funktion:

void (WINAPI *glRotatefOrig) (GLfloat Winkel, GLfloat x, GLfloat y, GLfloat z);

//Code, zum des ursprünglichen Funktionszeigers zu erhalten:

glRotatefOrig = (Lücke (WINAPI *) (GLfloat, GLfloat, GLfloat, GLfloat)) GetProcAddress (hMod, „glRotatef“); //-hMod = Handgriff zum openGL module.

//mein eigenes Funktion implentation (dieses benannt erfolgreich durch das Ziel, das nach IAT Flecken) Prozess ist:

void myglRotatef (GLfloat Winkel, GLfloat x, GLfloat y, GLfloat z)
{
console->Write („glRotatef benannt \ n“); //-Drucke ok
glRotatefOrig (Winkel, x, y, z); // dieser Anruf zerschmettert die Anwendung (keine sinnvolle Störung gegeben).
}

Can jedermann zeigen mich vielleicht auf, wo ich falsch gehe?  Ich versucht zahlreiche unterschiedliche Arten der Spezifizierung des ursprünglichen Funktionszeigers aber alles Endes in den Rissen: /

Cheers im Voraus, wenn Sie helfen können,
Chris

Antwort : IAT, das, Problem ausbessert, wenn Sie zurück zur ursprünglichen Zielfunktion benennen?

Hallo Chris,

IAT das Ausbessern ist etwas, das ich mit ziemlich viel unlängst fiedelte: J.Richter Bücher sind wirklich erforderlicher Messwert auf diesem:)

Ich schrieb eine Verpackungskategorie, angespornt vom oben genannten Herrn, der mir ermöglichte, erfolgreich anzuspannen Funktionen wie:: MessageBox etc.  Ich angebracht meine Helferkategorie unten, zusammen mit Beispielverbrauch.  Ihn using Ihre OpenGL Funktionen bitte heraus versuchen - er sollte ohne Problem arbeiten.

Sie sehen das, wenn ich den Anruf: anspanne: MessageBox, ändere ich den Text, der war ursprünglich spezifiziert „ich angespannt diesen Anruf!“
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
// gründete den Haken
ÜBERPRÜFEN (CFuncInAPIHook:: () .HookFunction (_T („user32.dll“), _T („MessageBoxW“), AfxGetInstanceHandle (), &MyMessageBox (PROC) als Beispiel anführen));

//-Wiedereinbauverfahren
int WINAPI MyMessageBox (HWND hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
)
{
	//-Funktionszeiger muss die gleiche benennende Versammlung wie PROC (WINAPI) haben!  Folglich WINAPI (__stdcall) voranstellen!
	typedef int  (WINAPI *MESSAGEBOX_FUNC) (HWND, LPCTSTR, LPCTSTR, UINT);

	// zurückholen nur die ursprüngliche Adresse der Funktion einmal einmal!
	statisches MESSAGEBOX_FUNC pFunc = (MESSAGEBOX_FUNC) CFuncInAPIHook:: () .RetrieveOriginalAPIFunctionAddress (_T („user32.dll“), _T („MessageBoxW“ als Beispiel anführen));
	ERKLÄREN (pFunc);
	pFunc zurückbringen? (*pFunc) (hWnd, _T („ich angespannt diesen Anruf n! "), lpCaption, uType): 0;
}

// dieser Anruf angespannt t
:: MessageBox (NULL, _T (""), _T („Titel“), MB_OK);
Weitere Lösungen  
 
programming4us programming4us