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
}
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. –
@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