これは、関心のある関数の先頭でいくつかのバイトを書き換えるフックをインストールする標準的なコードです。私の質問は、書き換えられたメモリの一部を再保護する必要があるのはなぜですか? PAGE_EXECUTE_READWRITE
パーミッションでそのままにしておくことはできませんか? ここでは、常に元のバイトを復元して再度フックする必要があると想定しています。
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
}