簡體   English   中英

基本dll地址始終不同且哈希不匹配

[英]Base dll address always different and hash mismatch

我編寫了一個程序,該程序從進程的已加載dll(模塊)中讀取X個字節,並對其進行哈希處理以將它們與經過硬編碼的干凈哈希進行比較。 模塊的基址始終是相同的(在XP和7上由不同的人在幾台不同的計算機上進行了測試),哈希值也始終相同。

但是對於一個人來說,基址總是不同的,並且哈希值也總是不同的(每次運行都不同)。 他正在使用Windows 7 Ultimate。

我的問題是:

  1. 為什么模塊的基址總是不同的? 我知道dll可以加載到不同的地址,但是什么觸發了此行為? DLL是否始終具有相同的基址? )基址始終為0x02XXXXXX類型,而其他所有人獲得的永不變地址為0x6F000000。

  2. 為什么哈希不匹配? 即使模塊加載到不同的地址,我仍然從base + someoffset讀取相同數量的字節。 哈希不僅有所不同, 而且每次運行該程序都不同 因此,我懷疑基址實際上是錯誤的,並且有些混亂。 我比較了我的dll和他的dll的md5,它們是相同的,因此要加載的庫在外觀上完全相同。

代碼中采取的步驟:

  1. 獲取流程句柄( CreateToolhelp32SnapshotProcess32Next
  2. 枚舉已加載的模塊( EnumProcessModules
  3. 通過名稱找到特定的模塊( GetModuleFileNameEx )並獲取句柄
  4. 向模塊基地址添加一個額外的偏移量(模塊內的偏移量)
  5. 讀X字節從與模塊ReadProcessMemory(hProcess, base_of_module+some_additional_offset, dllBuffer_to_read_into, 0x100000, &numRead)其中的0x100000 溢出模塊尺寸

該程序正在做的是將內存中的dll內容與“干凈的”哈希進行比較,以發現惡意軟件/黑客/等等的篡改。

您的方法不能希望成功。 DLL的基地址僅是加載程序的指南。 加載程序可以選擇在該地址加載DLL。 如果這樣做的話,就不需要修復任何絕對引用。

但是,如果請求的地址不可用(該進程中的其他內容已經保留了請求的地址范圍),或者加載程序選擇不使用請求的地址(例如ASLR),則DLL將在其他某個地址加載。 然后,重定位表將用於修改絕對引用。

為了使哈希計算更可靠,您需要考慮重定位。 原則上,您可以讀取重定位表,並在執行哈希計算時考慮重定位。 但是,這可能很棘手。

  1. 配置為在每個進程中加載​​的其他一些DLL被加載到該系統上。 例如,如果您安裝了網絡攝像頭或鼠標軟件,則會發生這種情況,這些趨向於迫使它們的DLL在每個進程中加載​​。 當然,如果將此DLL加載到阻止使用您首選的基地址的地址,則DLL將被重定位。

  2. 搬遷。 加載DLL時,加載程序將解析.reloc節,並將對絕對地址的更正直接寫入到加載的DLL映像中。 為了創建正確的哈希,還必須讀取重定位目錄並更正這些DLL的加載程序修改。

最可能的原因是EMET (Microsoft的增強緩解經驗工具包)​​。

EMET要做的一件事是強制執行A​​SLR(地址空間布局隨機化),即,即使未將其配置為使用ASLR,它也會強制將所有DLL加載到隨機地址。 這使攻擊者利用漏洞變得更加困難。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM