觀察到某程序調用 DLL 時未使用 `LoadLibrary`/`GetProcAddress`,而是:
這本質上是一個用戶態 PE 裝載器。系統加載器在內核支持下做同樣事情,手動映射將其移植到用戶態代碼實現,常用於:
| 階段 | 關鍵操作 | 易錯點 |
|---|---|---|
| 內存分配 | `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` | 缺少異常表導致崩潰無法捕獲、調試器無法回溯 |
手動映射技術屬雙刃劍,**嚴禁用於惡意軟件開發、遊戲外掛、繞過授權保護、未經授權的滲透測試**。僅限安全研究、合法插件架構設計、逆向分析教學等白帽場景使用。違法使用將承擔刑事責任。