首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

DLL 手動映射與區段調用:模擬 PE 裝載器原理解析

     編輯:程式設計綜合問答

現象描述

觀察到某程序調用 DLL 時未使用 `LoadLibrary`/`GetProcAddress`,而是:

  1. `CreateFile` 打開 DLL 文件。
  2. `ReadFile` 將完整文件讀入內存緩衝區。
  3. 解析 PE 頭,遍歷區段表,將 `.text`、`.data`、`.rdata`、`.reloc` 等區段按 `VirtualAddress` 和 `SizeOfRawData` 映射到進程地址空間(需 `VirtualAlloc` + `MEM_COMMIT | MEM_RESERVE`,設置正確頁面保護屬性 `PAGE_EXECUTE_READWRITE` 等)。
  4. 處理重定位表:若映射基址 ≠ `ImageBase`,遍歷 `.reloc` 修正所有絕對地址引用。
  5. 解析導入表 (IAT);對每個導入 DLL 調用 `LoadLibrary` 獲取模塊句柄,對每個導入函數調用 `GetProcAddress` 獲取真實地址,寫入 IAT 對應槽位。
  6. 若 DLL 有 TLS 回調、綁定導入、延遲導入、安全 Cookie 等,需額外處理。
  7. 調用入口點 `DllMain(hInst, DLL_PROCESS_ATTACH, nullptr)`。
  8. 獲取目標導出函數地址(解析導出表),強制跳轉執行(函數指針調用或內聯彙編 `jmp/call`)。

核心原理:完全模擬 Windows PE Loader

這本質上是一個用戶態 PE 裝載器。系統加載器在內核支持下做同樣事情,手動映射將其移植到用戶態代碼實現,常用於:

  • 安全研究:無痕加載、繞過 EDR 監控 `LoadLibrary`、分析惡意代碼行為。
  • 插件系統:不鎖定文件、支持內存中動態生成/修補 DLL、隔離依賴版本衝突。
  • 外掛/作弊:隱藏模塊列表、Hook 系統 API。

關鍵技術難點

階段關鍵操作易錯點
內存分配`VirtualAlloc` 預留映射空間,逐區段 `VirtualAlloc` 提交區段對齊 (`SectionAlignment` vs `FileAlignment`)、頁屬性設置 (`PAGE_EXECUTE_READ` 等)
重定位遍歷 `IMAGE_BASE_RELOCATION` 塊,按類型 (`IMAGE_REL_BASED_HIGHLOW` / `DIR64`) 修正64 位下必須處理 `IMAGE_REL_BASED_DIR64`,漏掉會導致崩潰
導入解析遞歸加載依賴 DLL,填充 IAT (`OriginalFirstThunk` -> `FirstThunk`)循環依賴、延遲導入、綁定導入失效、API Set 重定向
入口點調用調用 `DllMain`,處理 `DLL_PROCESS_ATTACH`在 `DllMain` 內做複雜操作(鎖、加載其他 DLL)極易死鎖
異常處理註冊 `RtlAddFunctionTable` (x64) 或 `RtlAddVectoredExceptionHandler`缺少異常表導致崩潰無法捕獲、調試器無法回溯

成熟開源實現參考

  • Reflective DLL Injection — 經典無痕注入實現,包含完整手動映射代碼。
  • Blackbone — 強大的 C++ 內存操作庫,封裝了手動映射、Hook、掃描等功能。
  • ManualMap — 純 C 實現,教學價值高。

法律與道德警示

手動映射技術屬雙刃劍,**嚴禁用於惡意軟件開發、遊戲外掛、繞過授權保護、未經授權的滲透測試**。僅限安全研究、合法插件架構設計、逆向分析教學等白帽場景使用。違法使用將承擔刑事責任。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved