惡意程式常透過列舉視窗標題來關閉防毒軟體。其核心機制極簡單——僅需十幾行程式碼。本文示範如何使用 EnumWindows 列舉所有頂層視窗,比對標題關鍵字,並發送 WM_CLOSE 訊息關閉目標視窗。
EnumWindows 遍歷所有頂層視窗。EnumWindowsProc 中,用 GetWindowText 取得視窗標題。strstr 或 CString::Find 判斷標題是否包含目標關鍵字(如「記事本」)。WM_CLOSE 訊息請求關閉。#include <windows.h>
#include <string.h>
BOOL CALLBACK EnumWindowsProc(HWND hwnd, LPARAM lParam)
{
char wtitle[512];
GetWindowTextA(hwnd, wtitle, sizeof(wtitle));
// 目標關鍵字:此處為「記事本」
if (strstr(wtitle, "記事本") != NULL) {
// 發送關閉訊息,讓程式自行處理存檔提示等邏輯
SendMessage(hwnd, WM_CLOSE, 0, 0);
}
return TRUE; // 繼續列舉
}
int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
EnumWindows(EnumWindowsProc, 0);
return 0;
}
// 在任意命令處理函數中,例如按鈕點擊
void CMyDialog::OnBtnCloseNotepad()
{
EnumWindows([](HWND hwnd, LPARAM) -> BOOL {
CString title;
GetWindowText(hwnd, title.GetBuffer(512), 512);
title.ReleaseBuffer();
if (title.Find(_T("記事本")) >= 0) {
::SendMessage(hwnd, WM_CLOSE, 0, 0);
}
return TRUE;
}, 0);
}
SetProcessShutdownParameters 提高關閉順序,並攔截 WM_CLOSE 檢查呼叫者權限。OpenProcess + TerminateProcess 強制結束。透過 EnumWindows + WM_CLOSE 即可依視窗標題關閉程式,原理簡單卻威力驚人。開發者應理解其機制,以便在自家軟體中加入防禦邏輯,或開發合法的自動化測試工具。