首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

導入表注入技術深度解析(一):PE 結構、IAT 解析與靜態重導向實作

     編輯:關於VC++

PE 檔案格式與導入表基礎

PE (Portable Executable) 結構包含:MS-DOS Header、NT Headers (PE 簽章、COFF Header、Optional Header)、Section Headers、Section Images。導入表位於 Optional Header 的 Data Directory 索引 1 (IMAGE_DIRECTORY_ENTRY_IMPORT):

DWORD it_voffset = pNTHeaders->OptionalHeader
    .DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;

導入描述符 結構詳解

每個被導入的 DLL 對應一個 IMAGE_IMPORT_DESCRIPTOR:

  • OriginalFirstThunk:指向 IMAGE_THUNK_DATA 陣列 (INT),含 Hint/Name RVA
  • FirstThunk:指向 IAT (導入位址表),載入器將填入實際函數位址
  • Name:DLL 名稱字串 RVA
typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    DWORD OriginalFirstThunk;
    DWORD TimeDateStamp;
    DWORD ForwarderChain;
    DWORD Name;
    DWORD FirstThunk;
} IMAGE_IMPORT_DESCRIPTOR;

Thunk 資料結構

typedef struct _IMAGE_THUNK_DATA {
    union {
        PDWORD Function;              // IAT: 載入後填入函數位址
        PIMAGE_IMPORT_BY_NAME AddressOfData; // INT: 指向 Hint/Name 結構
    } u1;
} IMAGE_THUNK_DATA;

IMAGE_IMPORT_BY_NAME 包含 WORD Hint + BYTE Name[1] (函數名稱字串)。

靜態/動態導入表視圖差異

  • 檔案映像 (磁碟):IAT 可能為 0 或含 Hint/Name RVA
  • 載入後記憶體:PE Loader 解析 INT,填寫 IAT 為實際函數虛擬位址

工具輔助:Dependency Walker (官方)、自製 Import Table Viewer (圖形化介面)。

導入表視圖 含 OriginalFirstThunk Loader 重寫後 Dependency Walker Import Table Viewer

API 重導向引擎實作

核心演算法 (_it_fixup_1 組語例程):

  1. VirtualAlloc 分配獨立可執行記憶體區 (0x1D000 位元組)
  2. 遍歷導入描述符,LoadLibrary + GetProcAddress 取得目標函數位址
  3. 白名單檢查:僅重導向 Kernel32/User32/GDI32/AdvApi32/Shell32
  4. 生成相對 JMP 指令 (0xE9 + 相對位移),寫入獨立區
  5. 修改 IAT Thunk 指向該 JMP 指令位址
// JMP 生成邏輯
mov byte ptr [edi], 0E9h        ; JMP opcode
mov eax, [TargetAddr]
sub eax, edi
sub eax, 5                      ; 相對位移 = 目標 - (當前+5)
mov [edi+1], eax                ; 填入位移
mov word ptr [edi+5], 0C08Bh    ; MOV EAX,EAX (NOP 滑板)
mov [Thunk], edi                ; 重寫 IAT

實戰驗證與限制

對 CALC.EXE 套用後,OllyDbg 顯示 IAT 區域變為一連串 JMP 樁代碼:

008E0000  E9 E6F8177C  JMP SHELL32.ShellAboutW
008E0005  8BC0         MOV EAX,EAX
008E0007  E9 0F764F77  JMP ADVAPI32.RegOpenKeyExA
...

限制:部分 DLL (如 MSVCRT) 的 Thunk 會被內部代碼區直接呼叫 (非經 IAT),重導向失效。專業 Protector 採用 x86 指令生成器 + 變體引擎 產生極度混淆的重導向邏輯。

絕對 JMP 示意

作業與延伸

嘗試修改 PE Maker 使用絕對 JMP (MOV EAX, Addr / JMP EAX) 實現重導向。完整原始碼包含 itview.zip、pemaker6.zip、pemaker7.zip、zimport.zip。

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