終結頑固進程是系統管理與安全對抗的基本功。本地進程終結看似簡單,實則涉及權限提升、句柄獲取、API 調用鏈;遠程進程終結更需構建 IPC 連接、遠程寫入可執行文件、操作服務控制管理器 (SCM) 創建臨時服務執行殺毒邏輯。本文提供完整 C 代碼實現與關鍵 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 錯誤
攻擊機/管理機 目標機
| ---- 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$ ---> |
// 服務入口
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. 返回結果
}
%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$ 寫入可執行文件 |
PostMessage(WM_CLOSE) / CtrlRoutine,超時再強制終結ControlService(hSvc, SERVICE_CONTROL_STOP) 替代暴力刪除服務掌握進程終結底層邏輯,不僅能應對頑固進程清理,更能在威脅狩獵中識別異常 SCM 活動、IPC$ 滥用、特權濫用等高價值 IOC。技術本身無善惡,關鍵在於使用者的授權與意圖。