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

三線程互護機制原理與實現:以誘鼠器為例的深度剖析

     編輯:關於VC++

前言

「三線程」常被防毒廠商宣傳為病毒高階技術,實則為進程自我保護的經典模式:主線程 + 本地監視線程 + 遠程注入線程,三者互相監控,實現進程難以被終止、檔案難以被刪除。本文以誘鼠器為例,詳細拆解其架構、核心 API 呼叫流程與清除對策。

一、三線程架構設計

T-mouse (主進程/主線程)
   ├─ 建立 watch 線程(駐留主進程)
   └─ 建立 remote 線程(注入遠程進程,如 explorer.exe / taskmgr.exe)

watch 線程職責:
  1. 即時監控註冊表 Run 鍵,被刪即寫回
  2. 監控 remote 線程存活,掛掉則重新注入

remote 線程職責:
  1. 開啟主進程句柄,WaitForSingleObject 等待其結束
  2. 主進程終止時,檢查系統目錄備份檔是否存在,不存在則還原
  3. 重新啟動主程式 (WinExec)

形成閉環:remote 守護主進程 → watch 守護 remote 與註冊表 → 主進程守護檔案備份

二、核心程式碼逐段解析

1. 主線程 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); // 建立本地監視線程

2. 本地監視線程 watch

RegOpenKeyEx(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(...); // 重新注入

3. 遠程線程 remote


HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, FALSE, mainPid);
WaitForSingleObject(hProc, INFINITE);      // 等待主進程結束
WinExec(backupExePath, 0);                 // 重啟主程式

4. 取得目標進程 PID 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;

5. 建立遠程線程 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 禁止跨進程直接存取記憶體。

三、駐體進程選擇策略

  • 固定雙駐體:explorer.exe + taskmgr.exe。用戶殺掉 explorer 時,remote 會重注入 taskmgr;反之亦然。雙進程同時存活時極難清除。
  • 隨機駐體:從系統進程列表隨機挑選,增加分析難度。
  • 關鍵系統進程:如 smss.exe (會話管理器),殺掉會導致系統崩潰,極具威懾力但風險極高。

四、清除對策(不使用第三方工具)

  1. 進入安全模式或 DOS 環境
  2. 刪除系統目錄下的主程式副本與 kernel.dll 備份
  3. 重啟系統(此時註冊表 Run 鍵雖在,但檔案不存在無法啟動)
  4. 刪除註冊表 Run 鍵值、原始安裝檔

調試建議:使用 DbgView.exe 捕捉遠程線程輸出訊息。

五、總結與警示

三線程機制本質是利用 OS 進程/線程隔離特性,構建相互守望的拓撲。雖技術本身中性,但被惡意軟體廣泛濫用。防護廠商應從行為監控(跨進程 WriteProcessMemory/CreateRemoteThread、註冊表 Run 鍵頻繁寫入、檔案屬性異常修改)入手檢測,而非單純特徵碼匹配。開發者切勿將此技術用於合法軟體保護,應採用數位簽章、授權伺服器等正規授權機制。

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