我正在嘗試編寫一些函數來檢測DLL代碼拼接。我將dll代碼拼接爲意味着在加載的dll的函數的開始處修改字節,以便不是跳到dll中的完整函數實現,而是跳轉到其他位置。檢測DLL代碼拼接
我的方法到目前爲止:
首先 - 使用Toolhelp32庫得到的加載的dll信息(例如加載的dll的圖像庫等)。
對於每個加載DLL:
- 通過讀取導出表得到每個功能地址(RVA),在存儲器中,該DLL
- 在存儲器
- get函數中的8個字節在該地址讀出的從DLL版本的磁盤上RVA DLL的磁盤上的
- 解析PE頭,要轉換的RVA文件偏移 - 讀到這裏8個字節太
- 比較這8個字節
現在我知道我做的事情不對,我可能會犯一個概念性錯誤。
我一直在使用notepad.exe進行測試,32位。在加載的DLL中,大多數函數的比較成功,但它往往會發現一些差異。
例如:
ntdll.dll的:序號= 00000059,RVA = 0007e098,fileoffs = 0007d498,功能VA:7c97e098
盤:00 00 00 00 00 00 00 00
MEM:E4 04 00 00 00 00 00 00
和:
ntdll.dll的:序號= 0000003d,RVA = 0009d0d8,fileoffs = 0009c4d8功能VA:77a9d0d8
磁盤:A1 5C 81 F9 77 90 C3 90
MEM:A1 5C 81廣告77 c3 90 90
有人向我提到它與搬遷有關。但是,我無法弄清楚這一點,而且我還沒有找到任何關於這如何適用的文檔。
有沒有人有一些信息,或鏈接呢?還是有人知道我失敗的地方? 非常感謝提前。
編輯: DLL的是在它們的優選圖像鹼被加載(比較OptionalHeader.ImageBase到在存儲器中的加載模塊的基地址時)。
因此,我試圖弄清楚爲什麼可能有區別 - 例如。上圖:爲什麼ntdll中的1312函數似乎匹配,但是1313的函數並不是。
謝謝。你說的話是有道理的。我現在發現,雖然是我正在測試的DLL,正在被加載到他們的首選地址。所以我不確定什麼可能會導致這種差異... – kwytay 2011-04-14 07:49:55