2013-04-29 8 views
14

Ich machte mit einem so genannten 'seh hooking'. Tatsächlich ändert es die Erlaubnis der Region des Gedächtnisses und fängt die Ausnahme ab, wenn es zugegriffen wird, also kann es die Funktion haken.Ist bei Win 7 eine Einzelschrittfalle verfügbar?

Es verwendet den einzigen Schritt Falle, die wie folgt aussieht:

info->ContextRecord->EFlags |= 0x100; 

den Schutz PAGE_NOACCESS fortzusetzen.

Die App läuft gut auf Win XP, aber nicht wie auf Sieg 7 ausgenommen. Es wurde gerade auf Sieg 7 eingefroren. Ich bezweifle sehr, dass es wegen der 'Single Step Trap' Sache ist, aber ich bin mir nicht sicher.

Click here zum direkten Download-Link des Quellcode-Pakets

+3

Einfach die Funktion auf die normale Weise einhängen. Diese Art von verrückten Techniken werden Ihren Code wahrscheinlich als Malware gekennzeichnet. –

+0

Haben Sie das Programm als Administrator gestartet? Windows 7 fügt den Programmberechtigungen eine Sicherheitsstufe hinzu. Sie können Berechtigungen mit der Einstellung Linker anfordern-> Manifest-Datei-> UAC-Ausführungsebene-> requireAdmin – typ1232

Antwort

11

Kurze Antwort:

Ja der einzelne Schritt Flag ist Teil der x86 achitecture und auch noch in Windows 7 über die EFLAGS-Komponente des Prozessors implementiert Kontext.

Ich habe es geschafft, Ihr Projekt herunterzuladen und alles funktioniert gut ohne Änderungen an Windows 8 mit UAC deaktiviert. Also sollte es auch unter Windows 7 funktionieren. Beim Start VEH Hooking Test.exe zeigt es zwei Nachrichtenfelder, nach jedem bekomme ich MessageBoxA Konsolenausgabe, so dass der Haken funktioniert. Vielleicht versuchen Sie das Programm als Admin unter Windows 7 zu starten?


Lange Antwort:

SEH steht für die strukturierte Ausnahmebehandlung, aber was Sie beschreiben, klingt eher wie VEH - vektorisiert Ausnahmebehandlung.

VEH Hooking ist eine Hooking-Methode, die wirklich verdammt langsam ist, also kann sie nicht wirklich in Performance-kritischen Hooks verwendet werden, wie zum Beispiel Grafikhaken, wo deine Hooks mehrmals pro Sekunde auftreffen. Es wird normalerweise für einmal verwendet. Der Zweck des VEH-Hookings ist, wirklich heimlich zu sein. Es ist kein Speicher in jemandes Code geschrieben und Sie müssen keine Debug-Register verwenden.


Folgendes ist, wie ich es mit C++ implementieren würde.

Zuerst müssen Sie einen Vector Exception Handler registrieren. Dies ist ein globaler Ausnahme-Handler für den Prozess. Jede ausgelöste Ausnahme, die nicht behandelt wurde und zum Betriebssystem durchschlägt, wird von diesem Handler abgefangen.

PVOID pExHandler = AddVectoredExceptionHandler(1, VectoredHandler); 

Danach Sie den Speicherschutz der Seite gesetzt ist, wo Ihre HOOK_LOCATION (die Adresse Haken) ist in. Die neue Schutz ich benutze ist PAGE_EXECUTE_READ|PAGE_GUARD. Eine geschützte Seite verursacht beim Zugriff eine Ausnahme und entfernt den Schutz danach automatisch. Diese Ausnahme wird von niemandem bearbeitet, daher fällt sie zu unserem Vektor-Handler. Nachdem die Ausnahme ausgelöst wurde, ist die Seite wieder zugänglich. (siehe Creating Guard Pages)

Speicher kann nur in Seiten geschützt werden (normalerweise 0x1000 Byte). Deshalb können wir nicht nur die Hook-Position schützen und den enormen Leistungs-Overhead haben.

DWORD orgProt; 
VirtualProtect(HOOK_LOCATION, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &orgProt); 

Jetzt für unsere Ausnahme Handler. So könnte es aussehen:

Wenn Code in die geschützte Speicherseite läuft, wird die Guard Page-Verletzung ausgelöst. Wir prüfen, ob wir am Hook-Standort waren. Wenn uns alles gut geht und wir den Rückruf anrufen können. Wenn wir nicht am richtigen Ort sind, müssen wir den Code irgendwie neu schützen, aber wenn wir es jetzt tun würden, könnten wir nicht fortfahren und immer eine Ausnahme am selben Ort bekommen und die Anwendung blockieren. Also haben wir das Prozessor-Single-Step-Flag gesetzt.

Jetzt, wenn wir die Einzelschrittausnahme erhalten, können wir den Schutz wieder einstellen, weil wir um eine Anweisung fortgeschritten sind. So können wir die Zielseite immer schützen und keine Hakentreffer verpassen.

Die Kosten sind zwei Ausnahmen und ein Seitenschutz pro Anweisung, der auf der Zielseite ausgeführt wird. Versuchen Sie dies nicht mit einem angehängten Debugger. Es wird verrückt werden.

Für eine tatsächliche Implementierung benötigen Sie möglicherweise Synchronisierungsobjekte, um den Haken loszuwerden, ohne dass das Programm abstürzt und die Verwaltung des Hooks verbessert wird.

Ich mag diesen cleveren Mechanismus wirklich und hoffe, dass einige Leute etwas darüber gelernt haben.

+0

Ich bin nicht sicher, dass dies die OP-Frage beantwortet, aber danke für die Erklärung, ich habe es genossen, es zu lesen! –

+0

@ dema80 vielen dank für feedback. Ich habe tatsächlich herausgefunden, wo ich die Datei jetzt herunterladen kann. Alles funktioniert gut für mich auf Windows 6.x – typ1232

+0

@ typ1232 Ich habe meine Frage geändert, um einen direkten Download-Link zur Quelle hinzufügen, Entschuldigung für die Unannehmlichkeiten –

Verwandte Themen