8

これは、関心のある関数の先頭でいくつかのバイトを書き換えるフックをインストールする標準的なコードです。私の質問は、書き換えられたメモリの一部を再保護する必要があるのはなぜですか? 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
}
4

1 に答える 1

8

ドアが開いたら、誰でも通り抜けることができます。メモリ範囲から書き込み保護を削除した場合、コードだけでなく、すべてのコードがそのメモリを更新できます。メモリは、(正当な) コードがそれを更新するものであることと、潜在的なマルウェアまたはプロセス空間にもロードされる単純なバグのある DLL であることを知る方法がありません。再保護すると、変更したいメモリの場所が自分のコード以外で更新されるのを防ぐのに役立ちます。

于 2012-11-19T20:40:46.620 に答える