這裏有一些標準的代碼片段,我們在我們感興趣的函數的開頭安裝鉤子重寫一些字節。我的問題是:爲什麼我們需要重新保護一段重寫的內存?我們不能讓它保持PAGE_EXECUTE_READWRITE
的權限嗎?我們在這裏假設我們需要不斷恢復原始字節並再次重新連接。掛鉤:爲什麼我們需要再次VirtualProtect()才能恢復權限?
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
}
嗯,你沒有。只要你從未做過成功的事情。這會讓其他人通過你打開的門破解程序太有趣。 –
@HansPassant,但是可以阻止其他人執行相同的操作,即掛鉤到VirtualProtect(),將我的(或原始)字節和VirtualProtect()重寫回來? – withkittens