2011-03-25 38 views
1

我目前正在研究一些系統級代碼,我希望能夠識別來自加載的二進制文件的內存部分以檢測損壞或修改的指令等內容;獲取二進制指令的內存地址

本質上,我所追求的是一種在使用C++的Win32中獲取指向範圍指令的指針。這有點類似於要求一個指向.text段的開始和結束的函數指針。我對exe格式的理解是,.text部分是存儲指令的地方,而.data部分則包含全局變量之類的東西。不幸的是,我發現這裏可能有0個提示(我沒有看到win32函數調用,TIB中沒有任何內容等)。

任何人都可以指示我在哪裏可以找到/計算此信息?

P.S.我明白,如果任何人惡意更改代碼,他們可能會發現此代碼並進行更改;我仍然對如何根據自己的好奇心獲取這些信息的細節感興趣。

回答

1

您可以在PE頭中找到代碼的入口點。從MSDN下載PE(可移植可執行文件)文件定義 - 它具有所有信息。內存中程序的格式與磁盤上的格式幾乎相同。從代碼中,您可以通過GetModuleHandle()函數獲得指向內存中PE頭的指針(句柄實際上是指向第一頁的指針)。

+0

另一個新的信息。嗯,你知道如果一個句柄只是第一頁的內存地址,確保你總是關閉句柄的目的是什麼?我假設操作系統必須跟蹤頁面分開打開的次數,否則有什麼意義?只是在這裏好奇。 – Tom 2011-03-25 23:14:27

+0

一般來說,它的確如此,但GetModuleHandle(作爲特例)不會增加句柄的引用計數。 – 2011-03-28 17:16:30

+0

您正在討論與HANDLE非常不同的HMODULE。 – 2011-04-05 21:49:16

1

這並不直接回答你的問題,但對於你的整體解決方案,你可以看看Code Signing。如果你喜歡這個解決方案,那麼Windows上就有現有的實現。

正如你所說的,二進制驗證本身並不能解決你的問題。您還應該考慮在需要提升/管理權限的文件系統區域(如Program Files)中安裝應用程序,或者將其部署到用戶無法直接修改它的某處(如Web服務器)。

4

你不可能真的期望這與內存二進制文件一起工作。對導入的DLL的任何函數調用都將被加載器修改爲指向加載的DLL中的目標過程的實際位置。

例如,假設你在kernel32.dll中調用一個函數。然後發生更新kernel32.dll的Windows更新。下一次運行應用程序時,kernel32.dll中的函數跳轉到的內存地址與應用Windows更新之前的內存地址不同。

當然,這一切都假定DLL加載在他們的首選地址。然後你可能會有一些自我修改的代碼。

依此類推,等等。

+0

好點大衛,其實這其中的目的之一是檢測是否有一些自修改代碼已經發生。然而,我沒有考慮DLL加載,但是......嗯。謝謝,每天學習一些東西! – Tom 2011-03-25 23:09:04

+0

從我做過的更多閱讀中,實際上,這看起來不正確。基於此:http://msdn.microsoft.com/en-us/library/aa271769(VS.60).aspx加載DLL時,它不會改變實際的DLL調用,它更類似於設置函數你的應用程序正在調用的指針。 – Tom 2011-03-31 01:54:58

+0

不過你想去想,代碼改變了 – 2011-03-31 06:16:27