2012-11-19 45 views
8

這裏有一些標準的代碼片段,我們在我們感興趣的函數的開頭安裝鉤子重寫一些字節。我的問題是:爲什麼我們需要重新保護一段重寫的內存?我們不能讓它保持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 
} 
+1

嗯,你沒有。只要你從未做過成功的事情。這會讓其他人通過你打開的門破解程序太有趣。 –

+1

@HansPassant,但是可以阻止其他人執行相同的操作,即掛鉤到VirtualProtect(),將我的(或原始)字節和VirtualProtect()重寫回來? – withkittens

回答

8

一旦門打開,任何人都可以走過。如果您已經從內存範圍中刪除了寫保護,則任何代碼都可以更新該內存 - 而不僅僅是您的代碼。內存無法知道你的(合法的)代碼是對它進行更新的,而不是一些可能的惡意軟件,或者甚至只是簡單的有bug的DLL也加載到進程空間中。重新保護它有助於防止非你的代碼更新你想改變的內存位置。

+0

謝謝你的回答,大衛。 - 繼續與門的比較 - 如果我知道只有誰纔會穿過它,看起來我可以將它打開?是否有不斷保護/重新保護記憶片的性能命中? – withkittens

+0

從安全角度來看,'VirtualProtect'管理一層保護,以防止壞的/錯誤的代碼。您是否需要該圖層取決於您。從性能的角度來看,一個被調用的函數總是需要更多的時間來執行,而不是一個未被調用的函數。使用分析來查看你是否真的獲得了這樣的性能提升,因此值得考慮沒有保護層。 – prprcupofcoffee

相關問題