Detoruing/Hooking - Zugriffsverletzung
-
Ich hab ein Problem beim detouring, meine Trampolin-/Jumpfunktion verursacht eine Speicherzugriffsverletzung. Hier mein Code:
typedef void (*TestTyp)(); TestTyp JTest; void Test() { MessageBox(NULL, L"Orginal Test(void)", L"Test", NULL); } void HTest() { MessageBox(NULL, L"Hooked Test(void)", L"Test", NULL); return JTest(); //Hier kommt die Zugriffsverletzung } void *Detour::CreateDetour(BYTE *OrginalFunc, BYTE *NewFunc, const int len) { BYTE *JumpFunc = (BYTE*)malloc(len+5); DWORD dwback; VirtualProtect(OrginalFunc, len, PAGE_READWRITE, &dwback); memcpy(JumpFunc, OrginalFunc, len); JumpFunc += len; JumpFunc[0] = 0xE9; *(DWORD*)(JumpFunc+1) = (DWORD)(OrginalFunc+len - JumpFunc) - 5; OrginalFunc[0] = 0xE9; *(DWORD*)(OrginalFunc+1) = (DWORD)(NewFunc - OrginalFunc) - 5; VirtualProtect(OrginalFunc, len, dwback, &dwback); return (JumpFunc-len); } BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD Reason, LPVOID Reserved) { if(Reason == DLL_PROCESS_ATTACH) { JTest = (TestTyp)Detour::CreateDetour((PBYTE)Test, (PBYTE)HTest, 5); //CreateDetour(&Test, &HTest, 5) hab ich auch schon veruscht Test(); } return TRUE; }Was mich wunder ist das was an Detour::CreateDetour übergeben wird, ich hab das mal Debbugt bzw. Dissassembled:
(>[...] ist die Andresse auf die gezeigt wird)void Test(); >008B1630 push ebp -008B1631 mov ebp,esp -008B1633 sub esp,0CCh -008B1639 push ebx [...] BYTE *OrginalFunc (in Detour::CreateDetour) >008B1041 jmp Test (8B1630h) ;Nach dem Detoruing steht hier ein Jump zu HTest -008B1046 jmp GetModuleFileNameW (8B3C1Ah) -008B104B jmp __security_init_cookie (8B3450h) -008B1050 jmp SetUnhandledExceptionFilter (8B3BE4h) [...] JTest >008D5DB0 jmp 008D639F ;Zeigt auf eine leere Speicherstelle -008D5DB5 jmp @ILT+65(_GetModuleFileNameW@12) (8B1046h) -008D5DBA std [...]Ich bin mir eigentl. sicher das es daran liegt, dass OrginalFunc nur auf einen Jump zur TestFunktion zeigt, aber wieso zeigt der Pointer auf einen Jump und nicht auf die eigentl. Funktion?
Grüße SWW13
-
Verwende MS Detours.
-
Ins WinAPI-Forum, oder?
-
@Check0r:
Danke für den Tipp. Ich will aber verstehen wie das ganze funktioniert und nicht einfach ne fertige Funktion(en) verwenden.@volkard:
Ich war mir nicht sicher eigntl. streift das Thema zwei Bereiche Assembler und C++. Die WinPI hat damit (bis auf VirualProtect) nicht's zu tue oder irr ich mich?Zum Problem, ich hab es jetzt unter Debug um laufen gegriegt, weil dort ja wie bereits gepostet ein Jump zur eigentl. Funktion ist. Hab die Jumpgröße für die Jumpfuktion umgerechnet und wolla, es funktioniert.
void *Detour::CreateDetour(BYTE *OrginalFunc, BYTE *NewFunc, const int len) { BYTE *JumpFunc = (BYTE*)malloc(len+5); DWORD dwback; VirtualProtect(OrginalFunc, len, PAGE_READWRITE, &dwback); if(OrginalFunc[0] == 0xE9) { JumpFunc[0] = 0xE9; *(DWORD*)(JumpFunc+1) = ( (DWORD)OrginalFunc + *(DWORD*)(OrginalFunc+1) ) - (DWORD)JumpFunc; JumpFunc += len; memcpy_s(JumpFunc, len, OrginalFunc, len); } else { memcpy_s(JumpFunc, len, OrginalFunc, len); JumpFunc += len; JumpFunc[0] = 0xE9; *(DWORD*)(JumpFunc+1) = (DWORD)(OrginalFunc+len - JumpFunc) - 5; } OrginalFunc[0] = 0xE9; VirtualProtect(OrginalFunc, len, dwback, &dwback); return (JumpFunc-len); }Unter Release läuft es leider immer noch nicht. Ich hab mir jetzt mal nen Logger geschrieben um das ganze auch im Release etwas genau ankucken zu können, aber irrgendwie find ich meinen Fehler immer noch nicht. Hier mal die Logs:
[Info] [BRN] Hook started... [Info] Debug-Build [Debug] Detour::CreateDetour(): OrginalFunc = 0x8B1055, NewFunc = 0x8B1235, JumpFunc = 0x8E36E8 [Debug] [Debug] OrginalFunc(Code): [Debug] [Code] 0xE9 0x26 0x0E 0x00 0x00 [Debug] [Code] 0xE9 0x69 0x3F 0x00 0x00 [Debug] NewFunc(Code): [Debug] [Code] 0xE9 0xC6 0x0C 0x00 0x00 [Debug] [Code] 0xE9 0x73 0x33 0x00 0x00 [Debug] JumpFunc(Code): [Debug] [Code] 0xCD 0xCD 0xCD 0xCD 0xCD [Debug] [Code] 0xCD 0xCD 0xCD 0xCD 0xCD [Debug] [Debug] (DWORD)(OrginalFunc+len - JumpFunc) - 5 = 0xFFFCD968 [Debug] (DWORD)(NewFunc - OrginalFunc) - 5 = 0x1DB [Debug] [Debug] After creating Detour: [Debug] OrginalFunc(Code): [Debug] [Code] 0xE9 0xDB 0x01 0x00 0x00 [Debug] [Code] 0xE9 0x69 0x3F 0x00 0x00 [Debug] NewFunc(Code): [Debug] [Code] 0xE9 0xC6 0x0C 0x00 0x00 [Debug] [Code] 0xE9 0x73 0x33 0x00 0x00 [Debug] JumpFunc(Code): [Debug] [Code] 0xE9 0x93 0xE7 0xFC 0xFF [Debug] [Code] 0xE9 0x26 0x0E 0x00 0x00 [Debug] [Debug] HTest(): JTest = 0x8E36E8 [Debug] Test() [Info] [BRN] Hook exited successful... [Info] [BRN] Hook started... [Info] Release-Build [Debug] Detour::CreateDetour(): OrginalFunc = 0x8A13A0, NewFunc = 0x8A13D0, JumpFunc = 0x8C5478, len = 5 [Debug] [Debug] OrginalFunc(Code): [Debug] [Code] 0x68 0xBC 0x32 0x8A 0x00 [Debug] [Code] 0xE8 0x76 0x02 0x00 0x00 [Debug] NewFunc(Code): [Debug] [Code] 0x8B 0x0D 0x58 0x43 0x8A [Debug] [Code] 0x00 0x8B 0x41 0x04 0x85 [Debug] JumpFunc(Code): [Debug] [Code] 0x0D 0xF0 0xAD 0xBA 0x0D [Debug] [Code] 0xF0 0xAD 0xBA 0xEE 0xFE [Debug] [Debug] (DWORD)(OrginalFunc+len - JumpFunc) - 5 = 0xFFFDBF23 [Debug] (DWORD)(NewFunc - OrginalFunc) - 5 = 0x2B [Debug] [Debug] After creating Detour: [Debug] OrginalFunc(Code): [Debug] [Code] 0xE9 0x2B 0x00 0x00 0x00 [Debug] [Code] 0xE8 0x76 0x02 0x00 0x00 [Debug] NewFunc(Code): [Debug] [Code] 0x8B 0x0D 0x58 0x43 0x8A [Debug] [Code] 0x00 0x8B 0x41 0x04 0x85 [Debug] JumpFunc(Code): [Debug] [Code] 0x68 0xBC 0x32 0x8A 0x00 [Debug] [code] 0xE9 0x23 0xBF 0xFD 0xFF [Debug] [Debug] Test() [Info] [BRN] Hook exited successful...Grüße SWW13
-
Keine Ahnung. Ich weiß nur, daß es nicht C++ ist. Du kannst (am einfachsten mit Copy&Paste) in einem anderen passenderen Forum nochmal posten. Das würde mich freuen.
