我做了一個程序,從一個進程的加載的DLL(模塊)中讀取X字節,並散列它們以將它們與硬編碼的乾淨散列進行比較。該模塊的基地址是總是相同(在XP和7上由不同的人在幾個不同的計算機上測試),並且哈希也總是相同。基地dll地址總是不同和散列不匹配
但是對於一個人來說,基地址總是不同的,散列也總是不同的(每次運行都不相同)。他正在使用Windows 7旗艦版。
我的問題是:
爲什麼模塊的基本地址總是不同?我知道DLL可以在不同的地址加載,但是觸發這種行爲的是什麼? (Is DLL always have the same Base Address?)基地址始終是0x02XXXXXX類型,而其他人獲得的永不改變的地址是0x6F000000。
爲什麼散列不匹配?即使模塊被加載到不同的地址,我仍然從base + someoffset中讀取相同數量的字節。不僅散列不同,每次運行程序時都不相同。正因爲如此,我懷疑這個基地址實際上是錯誤的,而且有些可怕的事情正在發生。我比較了我的dll和他的dll的MD5,它們是相同的,所以加載的庫是非常相似的。
- 獲取的處理句柄(
CreateToolhelp32Snapshot
Process32Next
,)(GetModuleFileNameEx
- 枚舉加載的模塊(
EnumProcessModules
) - 查找名稱的特定模塊:
的代碼中的所採取的步驟)並獲取句柄
- 獲取的處理句柄(
- 向模塊基地址添加一個偏移量(模塊內的偏移量) 個
- 讀取X與
ReadProcessMemory(hProcess, base_of_module+some_additional_offset, dllBuffer_to_read_into, 0x100000, &numRead)
其中的0x100000確實從模塊字節不溢出模塊尺寸
什麼這個節目做的是比較反對一個「乾淨」的哈希發現篡改內存中的DLL內容惡意軟件/黑客/等。
」該程序正在做的是將內存中的dll內容與「乾淨」哈希進行比較,以發現惡意軟件/黑客入侵等。 - 如果有人鉤住了GetModuleFileNameEx這個例子,那麼你的工具就沒用了。 – user2120666
尋找不同的解決方案。黑客可能知道你在做什麼,並使第一個X字節與你的DLL匹配。一個更好的方法可能是調用DLL中傳遞一些「隨機」信息的方法,並讓方法計算一些關於隨機數據的信息,然後檢查它是否正確。 (這會稍微難以破解) –
我知道系統並不完美,無論如何也不可能,但我現在只需要它就可以工作。 – cen