2012-01-06 40 views
1

我正在使用的第三方庫經常篡改幾個Windows API函數,最煩人的是SetUnhandledExceptionFilter。毫不奇怪,這使得我自己的處理程序完全過時(如果你不知道,試着找出原因!)。通過hotpatch禁用API函數(不是全局的)

我想解決這個愚蠢的問題。顯而易見的方法是用xor eax,eax ret 4(自己調用函數之後)覆蓋5個字節的hotpatch序言,從而有效地進一步調用no-op。

有兩個問題與此:

  1. 其他程序在同一時間運行可能需要合法地調用修補功能。他們可能會而不是完全braindamaged並可能做一些有用的事情。由於共享庫共享,任何其他程序加載或已經加載相同的DLL,而我的程序正在運行時將受到補丁,直到我的程序恢復退出功能。
  2. SetUnhandledExceptionFilter住在kernel32.dll,它永遠不會被卸載。這意味着如果出現意外的非例外程序終止(即用戶在TaskManager中終止進程),該補丁將一直存在,直到機器重新啓動。這是一個非常討厭的功能。

是否有一種可靠的方法來做這樣的事情,而不是同時干擾/損害整個系統的正常功能?

我曾想過在應用補丁之前設置保護PAGE_WRITECOPY,而不是PAGE_WRITEPAGE_EXECUTE_WRITECOPY是太誘人,因爲它不應該要求重新保護PAGE_EXECUTE_READ算賬,但MSDN說,這僅僅是Vista的SP1和XP功能後支持需要維護)。

在我的理解中,這應該限制我對過程所做的任何更改的可見性。

這是一個有效的假設,這樣的事情還能起作用,還可以根據我可能沒有想到的其他特徵(如DEP,或某些特殊的特權或其他干擾)?

回答

3

在指向SetUnhandledExceptionFilter的第三方庫就replace that IAT entry,這是簡單得多,並且是本地的第三方庫

更好的是,如果第三方庫是你的應用程序發佈的dll /二進制文件,你只需要NOP就可以打出SetUnhandledExceptionFilter的調用,這會更簡單,更安全。

我曾經想過,設置保護PAGE_WRITECOPY而非 PAGE_WRITE該補丁前(PAGE_EXECUTE_WRITECOPY是 誘惑太多,因爲它不應該要求重新保護 PAGE_EXECUTE_READ算賬,但MSDN說,這是隻有在支持 Vista SP1和XP功能需要維護)。

其實PAGE_EXECUTE_READWRITE是你最好的選擇,但它通常是一個好主意,以恢復原來的權限,除非你需要檢查,如果你或其他人與內存篡改了。

+0

更換IAT條目聽起來像個好主意,謝謝。 – Damon 2012-01-08 20:06:42