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.
Einfach die Funktion auf die normale Weise einhängen. Diese Art von verrückten Techniken werden Ihren Code wahrscheinlich als Malware gekennzeichnet. –
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