Benutzer mit den meisten Antworten
Detours x64

Frage
-
Hallo, ich habe folgenden Code im Internet gefunden, läuft auch perfekt...auf 32bit...
#include <Windows.h> #include <TlHelp32.h> #define SIZE 6 DWORD oldProtect, myProtect = PAGE_EXECUTE_READWRITE; typedef int (WINAPI *pMessageBoxA)(HWND, LPCSTR, LPCSTR, UINT); int WINAPI MyMessageBoxA(HWND, LPCSTR, LPCSTR, UINT); void BeginRedirect(LPVOID); pMessageBoxA pOrigMBAddress = NULL; BYTE oldBytes[SIZE] = {0}; BYTE JMP[SIZE] = {0}; BOOL WINAPI DllMain(HMODULE hModule, DWORD dwReason, LPVOID lpReserved) { if(DLL_PROCESS_ATTACH == dwReason) { pOrigMBAddress = (pMessageBoxA)GetProcAddress(GetModuleHandle("user32.dll"), "MessageBoxA"); if(pOrigMBAddress != NULL) { BeginRedirect(MyMessageBoxA); } } return TRUE; } void BeginRedirect(LPVOID newFunction) { BYTE tempJMP[SIZE] ={0xE9, 0x90, 0x90, 0x90, 0x90, 0x90}; memcpy(JMP, tempJMP, SIZE); DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5); VirtualProtect((LPVOID)pOrigMBAddress, SIZE, PAGE_EXECUTE_READWRITE, &oldProtect); memcpy(oldBytes, pOrigMBAddress, SIZE); memcpy(&JMP[1], &JMPSize, 8); memcpy(pOrigMBAddress, JMP, SIZE); VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL); } int WINAPI MyMessageBoxA(HWND hWnd, LPCSTR lpText, LPCSTR lpCaption, UINT uiType) { VirtualProtect((LPVOID)pOrigMBAddress, SIZE, myProtect, NULL); memcpy(pOrigMBAddress, oldBytes, SIZE); int retValue = MessageBoxA(hWnd, "MessageX", "CaptionX", uiType); memcpy(pOrigMBAddress, JMP, SIZE); VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL); return retValue; }
Jetzt möchte ich ihn aber auch bei 64bit verwenden...Habe natürlich dazu ein 64bit Testprogramm, sowie die passende 64bit Dll und den 64bit Injecter...
Wenn ich den oben stehenden Code verwende, passiert einfach garnichts...
Dann habe ich etwas experimentiert und irgendwann bekam ich wenigstens schonmal einen Crash...
Ich weiß nicht wie lange ich schon an diesem Problem sitze, nichts funktioniert....:(
Hoffe es findet jemand die Zeit mir zu helfen...
Windows 7 x64; Visual Studio 2010;
Gruß !
Antworten
-
Die 64-Bit Variante kannst Du bei MS für 10000$ kaufen...
http://www.microsoftstore.com/store/msstore/en_US/pd/productID.216531800
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Martin RichterModerator Dienstag, 27. September 2011 19:28
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 28. September 2011 15:20
-
Wenn ich Google verwende und Deinen Titel dieses Threads angebe finde ich erstaunlicherweise diesen Artikel:
http://www.codeproject.com/KB/system/mini_hook_engine.aspx;)
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin RichterModerator Dienstag, 27. September 2011 19:28
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 28. September 2011 15:20
Alle Antworten
-
Ich seh's auch nicht... aber ich frag mal ein paar Sachen (mit der richtigen Frage kommt die Antwort nämlich von selbst).
1) schlägt irgendwas fehl bei der Aktion? ... oder funktionieren alle Aufrufe?
2) wieso definierst du die Size auf 6? weil du von 44/48 relevanten Bits für die Adresse ausgehst?
3) ... die 5 stört mich noch... wieso steht da - 5 bei der JMPSize Berechnung? abgesehen davon, dass ich nicht ganz verstehe, wieso es ausgerechnet 5 DWORD (mit so vielen nop) sein müssen, würde ich mich auch nicht zwingend drauf einlassen, dass es in der x64 Dll auch wieder 5 DWORD sind
Rudolf
-
Danke zunächst einmal für die Antwort!
zu 1: Nein, nur VirtualProtect, weil ich den letzen Parameter NULL setze, das ist allerdings nicht wichtig...
zu 2: Keine Ahnung, habe den Code wie gesagt übernommen...könnte ich mir folgendermaßen vorstellen (1 für JMP-Befehl, 4 für Adresse, 1 als Puffer)
zu 3: -5 ? Weiß ich auch nicht, hab ich letztens noch irgendwo gelesen, das klang logisch und hat ja funktioniert....auf 32bit...
Hoffe das bringt etwas Licht ins Dunkle ?
Gruß
-
Die 64-Bit Variante kannst Du bei MS für 10000$ kaufen...
http://www.microsoftstore.com/store/msstore/en_US/pd/productID.216531800
Jochen Kalmbach (MVP VC++)- Als Antwort vorgeschlagen Martin RichterModerator Dienstag, 27. September 2011 19:28
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 28. September 2011 15:20
-
Wenn ich Google verwende und Deinen Titel dieses Threads angebe finde ich erstaunlicherweise diesen Artikel:
http://www.codeproject.com/KB/system/mini_hook_engine.aspx;)
Martin Richter -- MVP for VC++ [Germany] -- http://blog.m-ri.de- Als Antwort vorgeschlagen Martin RichterModerator Dienstag, 27. September 2011 19:28
- Als Antwort markiert Robert BreitenhoferModerator Mittwoch, 28. September 2011 15:20
-
Ja, habe erfahren, dass das doch "etwas" mehr Aufwand ist, das reicht mir ;)
Aber noch eine technische Frage:
Wenn ich doch einen Jmp zu meiner Funktion mache, dann kommt es doch nicht auf x64 an, das ist doch immer gleich oder nicht?
Das müsste doch auch auf 64bit gehen, jedenfalls soweit, dass meine Funktion aufgerufen wird:
ErsteBytesDerFunktion = JMP + &MeineFunktion; __stdcall void MeineFunction(void) { Whatever... return }
Das klappt allerdings irgendwie auch nicht, kann mir jemand erklären warum ?Gruß !