萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 電腦基礎知識 >  >> 健康知識

本地與遠程 NT 系統進程終結技術全解析:從 OpenProcess 到 SCM 遠程服務注入

終結頑固進程是系統管理與安全對抗的基本功。本地進程終結看似簡單,實則涉及權限提升、句柄獲取、API 調用鏈;遠程進程終結更需構建 IPC 連接、遠程寫入可執行文件、操作服務控制管理器 (SCM) 創建臨時服務執行殺毒邏輯。本文提供完整 C 代碼實現與關鍵 API 深度解析。

第一部分:本地進程終結 —— 權限提升是關鍵

核心 API 調用鏈

1. GetCurrentProcess()           // 獲取當前進程偽句柄
2. OpenProcessToken(..., TOKEN_ALL_ACCESS, &hToken)  // 打開訪問令牌
3. LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luid)  // 獲取 SeDebugPrivilege LUID
4. AdjustTokenPrivileges(hToken, FALSE, &tp, ...)    // 啟用調試特權
5. OpenProcess(PROCESS_ALL_ACCESS, FALSE, dwPID)     // 打開目標進程(含系統進程)
6. TerminateProcess(hProcess, 1)                     // 強制終結
7. CloseHandle 清理資源

關鍵點解析

  • SE_DEBUG_PRIVILEGE 允許打開任意進程(含 SYSTEM 權限的 winlogon.exe、csrss.exe),Idle 進程 (PID 0) 除外
  • 使用 __try/__finally 結構確保句柄在異常時正確釋放
  • 錯誤碼處理:ERROR_ACCESS_DENIED (5) 通常因特權未啟用;ERROR_INVALID_PARAMETER (87) 多為 PID 錯誤

第二部分:遠程進程終結 —— SCM 服務注入法

攻擊/管理流程圖

攻擊機/管理機                    目標機
    | ---- IPC$ (admin$) 建立會話 ---> |
    | ---- 複製 killsrv.exe 到 \admin$\system32 ---> |
    | ---- OpenSCManager(目標, SC_MANAGER_ALL_ACCESS) ---> |
    | ---- CreateService("PSKILL", killsrv.exe, ...) ---> |
    | ---- StartService("PSKILL", PID參數) ---> |
    |                            killsrv.exe 運行
    |                            OpenProcess + TerminateProcess
    |                            設置服務狀態 STOPPED/PAUSED
    | ---- DeleteService / 刪除文件 / 關閉 IPC$ ---> |

killsrv.exe 服務主邏輯 (Killsrv.c)

// 服務入口
void main() {
  SERVICE_TABLE_ENTRY ste[2] = {
    {"PSKILL", ServiceMain},
    {NULL, NULL}
  };
  StartServiceCtrlDispatcher(ste);  // 註冊服務控制處理器
}

// 服務主函數
void WINAPI ServiceMain(DWORD argc, LPTSTR *argv) {
  ssh = RegisterServiceCtrlHandler("PSKILL", svc_ctrl);
  ServiceRunning();  // 設置狀態 RUNNING
  Sleep(100);        // 等待參數就緒
  // argv[5] 為目標 PID (argv[0]=程序名, [1]=pskill, [2]=target, [3]=user, [4]=pwd)
  if (KillPS(atoi(argv[5]))) ServiceStopped(); else ServicePaused();
}

// 核心殺進程函數 (function.c)
BOOL KillPS(DWORD pid) {
  // 1. 獲取當前進程 Token 並啟用 SeDebugPrivilege (同本地邏輯)
  // 2. OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid)
  // 3. TerminateProcess(hProcess, 1)
  // 4. 返回結果
}

關鍵技術細節

  • IPC$ 連接:需目標機啟用 Server 服務、開放 445/139 端口、提供有效管理員憑證
  • admin$ 共享:指向 %SystemRoot%,寫入 system32\killsrv.exe 需管理員權限
  • 服務創建參數:CreateService(hSCM, "PSKILL", ..., SERVICE_WIN32_OWN_PROCESS, SERVICE_DEMAND_START, SERVICE_ERROR_NORMAL, path, ...)
  • 參數傳遞:StartService(hSvc, 5, argv_array) 將 PID 作為第 5 個參數傳入服務主函數
  • 清理機制:任務完成後必須 DeleteService、刪除 killsrv.exe、關閉 IPC$,避免留下痕跡

實戰注意事項與防禦視角

場景合法管理用途惡意利用風險檢測/防禦
本地提權殺進程管理員清理掛起/殭屍進程惡意軟體關閉安全軟體、EDR Agent監控 SeDebugPrivilege 啟用事件 (Event ID 4672)、TerminateProcess 調用堆疊
遠程服務注入殺進程跨域批量終結業務進程、修補部署橫向移動階段關閉防禦組件、釋放惡意載荷審計 SCM 操作 (Event ID 7045 服務安裝、7036 狀態變更)、異常 IPC$ 連接、admin$ 寫入可執行文件

代碼完善建議(生產級)

  1. 增加目標進程名稱驗證(避免誤殺關鍵系統進程)
  2. 實現優雅關閉:先 PostMessage(WM_CLOSE) / CtrlRoutine,超時再強制終結
  3. 加密傳輸 killsrv.exe(AES-256),運行時內存解密,落地無特徵
  4. 使用 ControlService(hSvc, SERVICE_CONTROL_STOP) 替代暴力刪除服務
  5. 記錄詳細審計日志:操作者、時間、目標 PID/名稱、結果、錯誤碼

掌握進程終結底層邏輯,不僅能應對頑固進程清理,更能在威脅狩獵中識別異常 SCM 活動、IPC$ 滥用、特權濫用等高價值 IOC。技術本身無善惡,關鍵在於使用者的授權與意圖。

copyright © 萬盛學電腦網 all rights reserved