Detours x64
-
Hallo zusammen,
ich habe im Internet folgenden Code gefunden, welchen ich soweit einigermaßen verstanden habe...(bin um genau zu sein, noch dabei... ;))
#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, 0xC3}; 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, 4); 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, "bb", "aa", uiType); memcpy(pOrigMBAddress, JMP, SIZE); VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL); return retValue; }
Dieser Code funktioniert natürlich nur bei 32bit DLL bzw. Executable...
Was muss ich ändern, damit er auch 64bit läuft, bzw. was ist da der Unterschied?
Habe schon gesucht, bin allerdings nicht so recht fündig gewordenGruß
-
Das liegt u.a. an den unterschiedlichen Datentypen und an der Speicherverwaltung bei Zeigern: http://en.wikipedia.org/wiki/Windows_API#Versions
Ich weiß nicht woher du den Code hast, aber das wird dir weiterhelfen: http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/86aa53b3-b3bd-4b76-bdd9-3d62e4737710/und das: http://en.wikipedia.org/wiki/LLP64#Specific_C-language_data_models
http://www.w7forums.com/windows-7-64-bit-vs-32-bit-t484.htmlWenn du ein tieferes Verständnis willst: http://queue.acm.org/detail.cfm?id=1165766
-
Die Codierung von JMP imm32 ist bei x86-32 und x86-64 gleich.
Das Problem bei deiner Funktion wird wohl sein, das du die Adressen auf DWORD castest, obwohl es SQWORDs sind (__int64).
Den INT 3 (C3) kann man im Übrigen weglassen.
-
@[Rewind]:
Danke, den "tieferen Einblick" werde ich bei Zeiten mal lesen@masm:
Das 0xC3 hat mich schon gewundert, wusste aber nicht, dass das der INT 3 ist, hab aber auch noch nicht nachgeschaut gehabt....Naja, soweit so gut, hab jetzt folgende Änderung:
//DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5); __int64 JMPSize = ((__int64)newFunction - (__int64)pOrigMBAddress - 5);
Vorher ist einfach garnichts passiert. Jetzt bekomme ich wenigstens schon einen Crash
Unbehandelte Ausnahme bei 0xf561100f in Test.exe: 0xC0000005: Zugriffsverletzung bei Position 0x00000000f561100f.
Benutze eine x64 DLL und x64 Injector.
PS: Wäre klassen, wenn mir jemand folgendes erläutern würde:
// Warum 6 ? #define SIZE 6 // Warum -5 ? __int64 JMPSize = ((__int64)newFunction - (__int64)pOrigMBAddress - 5);
-
Edit:
Das zweite "VirtualProtect" in "void BeginRedirect(...)" schlägt wohl fehl.
GetLastError = 0x3E6 = 998 = Invalid access to memory location.Ich kann mir den Fehler leider nicht erklären...
-
Kann es sein, dass diese Addresse im Stack liegt? Den kannst Du nicht schreibschützen.
-
Woher weiß ich das?
Wie gesagt, ich hab Programm (64bit), welches im Loop MessageBoxA aufruft...
Dann hab ich meine DLL(64bit) und meinen Injector(64bit), welcher mit "SE_DEBUG_NAME" läuft (ka ob das nötig ist).Wenn ich den oben genannten Code bei 32bit verwende, läuft ja alles wie es soll, nur bei 64bit nicht...
-
...kann mir niemand weiterhelfen?
Ich weiß, es ist möglicherweise alles etwas ungenau beschrieben, aber ich hab echt keine Ahnung woran das liegt...keine Ahnung wie viel Zeit ich jetzt schon in eine Lösung investiert habe, ich komme nicht weiter
-
Da Du die x64 Version von Detours hast, hast Du diese sicher gekauft und kannst Dich somit auch an den Support wenden.
Siehe auch:
http://research.microsoft.com/en-us/projects/detours/PS: Wenn Du 10.000$ übrig hast, dürfte die Support Anfrage ja wohl kein Problem für Dich sein...
Falls Du es noch nicht gekauft hast, dann Frage ich mich, wie Du da drangekommen bist....
Ansonsten kannst Du es ja noch hier kaufen:
http://www.microsoftstore.com/store/msstore/en_US/pd/productID.216531800/search.true
-
Jochen Kalmbach schrieb:
Da Du die x64 Version von Detours hast, hast Du diese sicher gekauft und kannst Dich somit auch an den Support wenden.
Siehe auch:
http://research.microsoft.com/en-us/projects/detours/PS: Wenn Du 10.000$ übrig hast, dürfte die Support Anfrage ja wohl kein Problem für Dich sein...
Falls Du es noch nicht gekauft hast, dann Frage ich mich, wie Du da drangekommen bist....
Ansonsten kannst Du es ja noch hier kaufen:
http://www.microsoftstore.com/store/msstore/en_US/pd/productID.216531800/search.true
Der gepostete Code hat nichts mit dem Produkt zu tun.
-
Jetzt hab ich es auch gesehen
PS: Die hier vorgestellte Lösung ist etwas zu trivial... das geht nur bei ca. 60% der Methoden...