2012-11-19 9 views
8

Hier ist ein Standard-Code, wo wir den Hook installieren einige Bytes zu Beginn der Funktion von unserem Interesse neu zu schreiben. Meine Frage ist: Warum müssen wir ein Stück umgeschriebene Erinnerung neu beschriften? Können wir es nicht einfach mit PAGE_EXECUTE_READWRITE Berechtigungen verlassen? Wir nehmen hier an, dass wir ständig Original-Bytes wiederherstellen und erneut rehaken müssen.Hooks: Warum müssen wir VirtualProtect() erneut ausführen, um Berechtigungen wiederherzustellen?

if (VirtualProtect(funcPtr, 6, PAGE_EXECUTE_READWRITE, &dwProtect)) // make memory writable 
{ 
    ReadProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, Hook::origData, 6, 0); // save old data 
    DWORD offset = ((DWORD)hook - (DWORD)funcPtr - 5); //((to)-(from)-5) 
    memcpy(&jmp[1], &offset, 4); // write address into jmp 
    memcpy(Hook::hookData, jmp, 6); // save hook data 
    WriteProcessMemory(GetCurrentProcess(), (LPVOID)funcPtr, jmp, 6, 0); // write jmp 
    VirtualProtect(funcPtr, 6, dwProtect, NULL); // reprotect 
} 
+1

Nun, Sie nicht. Solange du nie erfolgreich bist bei dem was du tust. Das würde es für andere zu interessant machen, das Programm durch die Tür zu hacken, die du offen gelassen hast. –

+1

@HansPassant, aber was kann andere davon abhalten, das gleiche zu tun, nämlich Haken in diese, VirtualProtect(), schreibe meine (oder ursprünglichen) Bytes und VirtualProtect() zurück? – withkittens

Antwort

8

Sobald die Tür geöffnet ist, kann jeder durchgehen. Wenn Sie den Schreibschutz aus einem Speicherbereich entfernt haben, kann jeder Code diesen Speicher aktualisieren - nicht nur Ihren Code. Der Speicher hat keine Möglichkeit zu wissen, dass Ihr (legitimer) Code derjenige ist, der ihn gegen einige mögliche Malware aktualisiert, oder einfach nur eine fehlerhafte DLL, die ebenfalls in den Prozessbereich geladen wird. Das erneute Schützen hilft dabei, sich gegen den nicht-Ihren-Code zu schützen, der die Speicherstellen aktualisiert, die Sie ändern möchten.

+0

Danke für deine Antwort, David. Den Vergleich mit der Tür fortsetzen - wenn ich weiß, dass ich es bin, der nur durch sie hindurchgeht, scheint es, dass ich sie offen lassen kann? Gibt es irgendwelche Leistungseinbußen, um das Erinnerungsstück ständig zu schützen/neu zu beschützen? – withkittens

+0

Aus Sicherheitsgründen verwaltet 'VirtualProtect' eine Schutzschicht gegen schlechten/fehlerhaften Code. Es liegt an Ihnen, ob Sie diese Schicht benötigen. Aus Performanceperspektive benötigt eine aufgerufene Funktion immer mehr Ausführungszeit als eine Funktion, die nicht aufgerufen wird. Verwenden Sie Profiling, um zu sehen, ob Sie wirklich einen solchen Leistungsschub erhalten, dass es sich lohnt, nicht über die Schutzebene zu verfügen. – prprcupofcoffee

Verwandte Themen