2011-05-17 61 views
1

這是作業作業。更改dll的內容

我應該改變一個DLL函數的內容,並把它的錯誤(0xCC)。加載dll函數並將其保護更改爲PAGE_EXECUTE_READWRITE

我在種植錯誤代碼時遇到了麻煩。我嘗試以下(我刪除了非有趣的事情):

typedef BOOL (*pfn)(); 

HMODULE hModule=LoadLibrary("somedll"); 

pfn somefunc=(pfn)GetProcAddress(hModule,"somefunction"); 

VirtualProtect (somefunc,dwSize,PAGE_EXECUTE_READWRITE,&dwOldProtect); 

BYTE *p = (BYTE*)somefunc; 

*p = 0xCC; 

當我執行somefunc,而不是得到一個例外,它運行沒有任何問題。爲什麼是這樣,我做錯了?

如何覆蓋該功能?

+0

你在同一個進程中運行'somefunc'? – 2011-05-17 18:11:50

+0

a。是的,我在同一個過程中運行somefunc。 b。這是我問 - 我如何覆蓋函數? – aaaa 2011-05-17 18:13:48

+0

請幫助任何人嗎? – aaaa 2011-05-17 18:47:50

回答

0

很可能VirtualProtect返回一個錯誤。檢查其(BOOL)返回值,如果爲false,則使用GetLastError檢查原因。

請注意,VirtualProtect必須與對分配內存的VirtualAlloc調用給出的訪問兼容。現在,這是你無法控制的,因爲VirtualAlloc是在LoadLibrary內部調用的。

另一件事是,提供給VirtualProtect的指針必須是該內存頁的起始地址,並且您提供的函數指針最有可能不是。你的功能可以在頁面的任何地方,你必須調整到最近的頁面開始。

有趣的是:

http://support.microsoft.com/kb/127904 (你正在做的基本上是必需的,但幾個步驟)

http://www.joachim-bauch.de/tutorials/loading-a-dll-from-memory/ (可能是DLL的加載機制的細節有幫助)

+0

我沒有檢查布爾值 - 並沒有錯誤。如果我提供函數的指針 - 這是否意味着我可以寫入它? (我試圖將保護更改爲讀 - 實際上得到訪問異常)我正在嘗試更改函數本身 - 無論我在那裏更改多少字節 - 它仍然執行沒有任何例外... – aaaa 2011-05-17 19:06:32

+0

好吧,如果VirtualProtect成功,那麼可能唯一需要的是在調用函數指針之前調用FlushInstructionCache()。 – 2011-05-17 19:10:05

+0

另請注意,MS建議分兩步進行:首先將訪問模式更改爲PAGE_WRITECOPY,然後修改代碼,然後再次將訪問模式修改爲PAGE_EXECUTE。不知道這是否有所作爲,但無論如何... – 2011-05-17 19:11:51

0

你怎麼知道函數成功運行?你可以在調試器中運行代碼(OllyDbg的,例如),並確保:

  1. 您的代碼在特定地址寫入的0xCC,
  2. 的0xCC被成功寫入,
  3. 而且沒有例外的0xCC操作碼。
+0

我已經寫了一個簡單的dll,其中包含一個可以向屏幕輸出一些輸出的功能。該函數被執行 - 這不是我想要發生的事情... – aaaa 2011-05-17 18:16:59

+0

你可以將0xCC更改爲0xF4(HLT)來查看是否有任何區別? – 2011-05-17 18:22:09

+0

我改變了它,沒有區別。謝謝您的幫助! – aaaa 2011-05-17 19:02:26