Pytanie : IAT łatanie, problem gdy dzwonić z powrotem oryginalny cel funkcja?

Cześć,

I zastanawiać się jeżeli ekspert móc z IAT łatanie na NT opierać się O/Ss gdy I przychodzić troszkę.  I próbować API haczyk using DLL zastrzyk (LoadLibrary/CreateRemoteThread technika), i wtedy łatać kilka OpenGL funkcja sprawnie ich parametr i operacja przed the oryginał.  Być być pracować oprócz, ono wydawać się, gdy I dzwonić z powrotem the wersja oryginalna funkcja który mieć parametr lista - z powrotem funkcja bez parametr być fine.

I podejrzany ono być jak I precyzować funkcja pointer, I być nowy ten technika i móc ten che być the poprawny sposób rzecz.  Gdy I dzwonić z powrotem the oryginalny funkcja z the parametr lista ono właśnie rozbijać the cel process.

The kod I używać być podążać: -

//Pointer oryginalny funkcja:

void (WINAPI *glRotatefOrig) (GLfloat kąt, GLfloat x, GLfloat y, GLfloat z);

//Kod oryginalny funkcja pointer:

glRotatefOrig = (pustka (WINAPI *) (GLfloat, GLfloat, GLfloat, GLfloat)) GetProcAddress (hMod, "glRotatef"); // hMod = rękojeść openGL module.

//Mój swój funkcja implentation (łata dzwonić pomyślnie the cel proces następujący IAT łata):

void myglRotatef (GLfloat kąt, GLfloat x, GLfloat y, GLfloat z)
{
console->Write ("glRotatef Dzwonić \ n"); // druk ok
glRotatefOrig (kąt, x, y, z); // Ten wezwanie rozbijać the zastosowanie (żadny znacząco błąd dawać).
}

Can źle możliwie wskazywać dokąd I iść źle?  I próbować mnogi inny sposób the oryginalny funkcja pointer ale wszystkie końcówka w spłakanie: /

Cheers w postęp jeżeli ty móc,
Chris

Odpowiedź : IAT łatanie, problem gdy dzwonić z powrotem oryginalny cel funkcja?

Cześć Chris,

IAT łatanie być bawić się I bawić się z sporo nie więc tęsknić temu: J.Richter's książka naprawdę być wymagać czytanie na książka:)

I napisać opakowanie klasa, inspirować the inspirować dżentelmen, che umożliwiać pomyślnie funkcja tak jak:: MessageBox Etc. I dołączać mój pomagier klasa mój, wraz z przykład użycie.  Zadawalać próba ono problem using twój OpenGL funkcja - ono musieć bez problem.

Ty widzieć widzieć gdy I haczyć the wezwanie:: MessageBox, I zmieniać the tekst który być oryginalnie "I haczyć ten wezwanie!"
(1):
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
// Ustawianie the haczyk
WERYFIKOWAĆ (CFuncInAPIHook:: Przykład () .HookFunction (_T ("user32.dll"), _T ("MessageBoxW"), AfxGetInstanceHandle (), (PROC) &MyMessageBox));

// Zastępstwo procedura
int WINAPI MyMessageBox (HWND hWnd,
    LPCTSTR lpText,
    LPCTSTR lpCaption,
    UINT uType
)
{
	// Funkcja pointer musieć ten sam konwencja PROC (WINAPI)!  Tym samym, prepend WINAPI (__stdcall)!
	typedef int  (WINAPI *MESSAGEBOX_FUNC) (HWND, LPCTSTR, LPCTSTR, UINT);

	// Tylko odzyskiwać the oryginalny funkcja adres oryginalny!
	statyczny MESSAGEBOX_FUNC pFunc = (MESSAGEBOX_FUNC) CFuncInAPIHook:: Przykład () .RetrieveOriginalAPIFunctionAddress (_T ("user32.dll"), _T ("MessageBoxW"));
	ZAPEWNIAĆ (pFunc);
	wracać pFunc? (*pFunc) (hWnd, _T ("I haczyć ten wezwanie! "), lpCaption, uType): (0);
}

// Ten wezwanie haczyć
:: MessageBox (NIEOBOWIĄZUJĄCY, _T (""), _T ("Tytuł"), MB_OK);
Inne rozwiązania  
 
programming4us programming4us