Denkfehler bei meinem Hook?
-
Und die fixe Adresse 0x663811e4? Die Funktion ist bei jedem Start des Opferprogramms genau dort?
-
Laut IDA Pro, wenn ich die Dll disassamble, ja.
function1 .text 663811E4 0000002F R . . . B . .
(die Hexadezimalzahl dahinter ist übrigens die Länge)
Wo könnte ich sehen, ob diese Addresse statisch ist?
-
Die Adresse im Prozessspeicher, nicht in der Dll-Datei... hole sie mit GetProcAddress.
-
In Zeile 29 hast Du ein Bug! -> taeter.dll
-
-lb schrieb:
In Zeile 29 hast Du ein Bug! -> taeter.dll
Mal so aus Neugier: Was ist denn der Fehler genau?
-
Also wenn man denn Hook startet passiert nichts. Die MsgBox wird scheinbar gehookt, doch es passiert nichts. Wenn man die calladdresse zu Msgbox nimmt funktioniert es, doch nach der gehookten Funktion stürzt das Opferprogramm ab. Irgendetwas schein nicht zu Funktionieren.!?
-
Ich bin Matrix... schrieb:
Einen wunderschönen Montagmittag allen miteinander!
Da ich die Basics der WINApi inzwischen durch habe, dachte ich mir ich fange mal mit den Detouren von Funktionen an. Da ich kein Buch fand (wer eins kennt bitte melden :)) hab ich das anhand verschiedener Internet-Tutorials gemacht. Das Problem ist nun, dass es einfach nicht funktionieren will. Hab mir mein "Opferprogramm" und die Dll mit der Zielfunktion selbst geschrieben. Sie ist denkbar einfach:void DLL_EXPORT function1() { MessageBox(NULL, "Message", "Dll", MB_OK); }
Hab mir im Programm noch einen Button gemacht, der die Funktion aufruft, funktioniert alles. (DLL_EXPORT ist passend definiert...)
Meine Hook-Dll (kann man das so nennen?) sieht nun wie folgt aus:
void FakeFun() { MessageBox(0, "FakeFun", "", MB_OK); } void* DetourFunc(PBYTE, const PBYTE, const int); typedef void (*OriginalFunc)(void); BOOL WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { //my::Dll dll(DLL_PATH("DetourOpferDll.dll")); switch (fdwReason) { case DLL_PROCESS_ATTACH: // attach to process //my::DetourFunc(reinterpret_cast<PBYTE>(dll.GetProcAddress<void (*) (void)>("function1")), (PBYTE)FakeFun, 5); OriginalFunc f; f = (OriginalFunc)DetourFunc((PBYTE)0x702411e4, (PBYTE)FakeFun, 5); break; } return true; // succesful } void* DetourFunc(PBYTE src, const PBYTE dst, const int len) { PBYTE jmp = (PBYTE)malloc(len+5); DWORD dwback; VirtualProtect(src, len, PAGE_READWRITE, &dwback); memcpy(jmp, src, len); jmp+=len; jmp[0] = 0xe9; *(PDWORD)(jmp+1) = (DWORD)(src+len-jmp)-5; src[0] = 0xe9; *(PDWORD)(src+1) = (DWORD)(dst-src)-5; VirtualProtect(src, len, dwback, &dwback); return (jmp-len); }
Passende Header (windows.h) sind auch inkludiert, hab einfach nur das wesentliche rauskopiert.
Die Addresse stimmt lt. IDA Pro auch und hab sie mir auch mit GetProcAddress mal vom "Opferprogramm" ausgeben lassen. Stimmt alles überein.
Hab dann das Opferprogramm gestartet und die Dll mit dem DllInjector, den mir hier letztens jemand empfahl injected. Wenn ich nun wieder auf den Button drücke wird aber immernoch die normale Funktion ausgeführt. Warum funktioniert das nicht so, wie ich es mir denke? Hab ich einen kompletten Denkfehler drin oder mal wieder nur irgendetwas kleines vergessen?PS: Hab die Dll mit der "Opferfunktion" auch schon auf verschiedene Weise vom "Opferprogramm" laden lassen (per Compiler, per LoadLibrary)
Danke im Voraus
Komisch wie Du das machst, aber ehrlich gesagt ist mir das auch shit egal. Aber ich denke das Funktioniert nicht ganz (Kurz überflogen). Wenn Du die src Addr mit einem relativen jump zu deiner Funktion überschrieben hast musst Du sie auch sichern. Bevor dass Du die Originalfunktion wieder aufrufst in FakeFun, musst Du die Originaladresse wieder herstellen mit den zuvor gesicherten bytes, da Du sonnst in einer Endlosschleife bist und somit gar nichts zu Gesicht bekommst.
-
-
Tipi der freundliche Tipp schrieb:
Unterstützt aber nur x86! Für x64 braucht man eine Liz.
-
Hallo, da mich auch das Thema Hooks interessiert habe ich mich damit auch mal etwas beschäftigt.
Ich habe hier ein gutes Tutorial gefunden wo das ganze erklärt wird. Nachdem anschauen von dem Tutorial habe ich mir ein einfaches test Programm geschrieben und mal geschaut ob das auch funktioniert und ich kann mich nicht beklagen funktioniert ohne Problem.
Hier ist der Link zu dem Tutorial:
http://www.vivid-abstractions.net/downloads/InDem Present/Hooking Tutorial.htmDa such mal nach Hook dann siehste auch den kompletten Quelltext
http://www.vivid-abstractions.net/category/programming/tutorials/Der Autor ist hier auch im Forum registriert fällt mir gerade ein.^^
Naja danke nochmal an Patrickssj6 das er sich die Arbeit gemacht hat.