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

VC++ 建立零依賴無 DLL 導入的極小 WIN32 程式

     編輯:VC 教學

目標

不連結任何 CRT/Lib,直接呼叫 Native API (ntdll.dll)、kernel32.dll 匯出函數,產生極小執行檔 (原文測試 VC2003 約 1KB,VC6 類似)。

核心技術

  1. 進入點修改:連結器 → 進階 → 進入點 設為 MyEntryPoint (非 main/WinMain),避免 CRT 啟動代碼。
  2. 手動解析 API 位址:透過 PEB (Process Environment Block) 走訪 Ldr 模組列表,找 kernel32.dll 基址,解析匯出表取得 LoadLibrary/GetProcAddress,再載入其他 DLL 取函數。
  3. 自定義字串/記憶體函數:不使用 strcpy/malloc,自行實作或用 RtlMoveMemory (ntdll)。

關鍵結構定義 (需精確對齊 #pragma pack(8))

typedef struct _PEB_LDR_DATA {
    ULONG Length; BOOLEAN Initialized; PVOID SsHandle;
    LIST_ENTRY InLoadOrderModuleList;
    LIST_ENTRY InMemoryOrderModuleList;
    LIST_ENTRY InInitializationOrderModuleList;
} PEB_LDR_DATA;

typedef struct _LDR_MODULE {
    LIST_ENTRY InLoadOrderModuleList;
    LIST_ENTRY InMemoryOrderModuleList;
    LIST_ENTRY InInitializationOrderModuleList;
    PVOID BaseAddress; PVOID EntryPoint; ULONG SizeOfImage;
    UNICODE_STRING FullDllName; UNICODE_STRING BaseDllName;
    // ... 其餘欄位
} LDR_MODULE;

極小程式骨架

#define WIN32_LEAN_AND_MEAN
#include  // 僅用型別定義,不連結.lib

#pragma comment(linker, "/ENTRY:MyEntryPoint /SUBSYSTEM:WINDOWS /MERGE:.rdata=.text /SECTION:.text,EWR")

// 手動實作 strlen, strcmp, 字串轉數字等...
// 走訪 PEB 取得 kernel32 基址 -> 解析匯出表 -> 取得 LoadLibraryA -> 載入 user32.dll -> 取得 MessageBoxA

void MyEntryPoint() {
    // 1. 從 FS:[0x30] (TEB) 取得 PEB
    // 2. PEB->Ldr->InLoadOrderModuleList 走訪找 kernel32.dll
    // 3. 解析 PE 匯出表找 LoadLibraryA, GetProcAddress
    // 4. LoadLibraryA("user32.dll") -> GetProcAddress("MessageBoxA")
    // 5. 呼叫 MessageBoxA(NULL, "Hello", "Tiny", MB_OK);
    // 6. 取得 ExitProcess 並呼叫退出
}

連結器優化選項 (VC6/VC2003)

  • /ENTRY:MyEntryPoint 指定進入點。
  • /SUBSYSTEM:WINDOWS 或 CONSOLE。
  • /MERGE:.rdata=.text 合併區段減少對齊浪費。
  • /SECTION:.text,EWR 設定區段屬性 (可執行/可寫/可讀)。
  • /OPT:REF /OPT:ICF 移除未參考代碼/合併相同函數。
  • 關閉 緩衝區安全檢查 (/GS-)、運行時類型資訊 (/GR-)、例外處理 (/EHsc-)。

實際應用場景

  • Shellcode、Loader、Bootstrap 程式。
  • 極度受限環境 (嵌入式 Windows、PE 感染器、保護殼)。
  • **不建議** 一般應用開發:維護成本極高、失去 CRT 安全檢查、字串處理痛苦。

原文註記

代碼片段截斷於 _RTL_USER_PROCESS_PARAMETERS 結構定義中,完整實作需補齊 PEB 走訪、PE 匯出表解析、字串比對 (Unicode/ANSI) 等數百行組合邏輯。

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