我正在使用的第三方庫經常篡改幾個Windows API函數,最煩人的是SetUnhandledExceptionFilter
。毫不奇怪,這使得我自己的處理程序完全過時(如果你不知道,試着找出原因!)。通過hotpatch禁用API函數(不是全局的)
我想解決這個愚蠢的問題。顯而易見的方法是用xor eax,eax ret 4
(自己調用函數之後)覆蓋5個字節的hotpatch序言,從而有效地進一步調用no-op。
有兩個問題與此:
- 其他程序在同一時間運行可能需要合法地調用修補功能。他們可能會而不是完全braindamaged並可能做一些有用的事情。由於共享庫共享,任何其他程序加載或已經加載相同的DLL,而我的程序正在運行時將受到補丁,直到我的程序恢復退出功能。
SetUnhandledExceptionFilter
住在kernel32.dll
,它永遠不會被卸載。這意味着如果出現意外的非例外程序終止(即用戶在TaskManager中終止進程),該補丁將一直存在,直到機器重新啓動。這是一個非常討厭的功能。
是否有一種可靠的方法來做這樣的事情,而不是同時干擾/損害整個系統的正常功能?
我曾想過在應用補丁之前設置保護PAGE_WRITECOPY
,而不是PAGE_WRITE
(PAGE_EXECUTE_WRITECOPY
是太誘人,因爲它不應該要求重新保護PAGE_EXECUTE_READ
算賬,但MSDN說,這僅僅是Vista的SP1和XP功能後支持需要維護)。
在我的理解中,這應該限制我對過程所做的任何更改的可見性。
這是一個有效的假設,這樣的事情還能起作用,還可以根據我可能沒有想到的其他特徵(如DEP,或某些特殊的特權或其他干擾)?
更換IAT條目聽起來像個好主意,謝謝。 – Damon 2012-01-08 20:06:42