IE 瀏覽特定網站時會彈出廣告視窗,通常特徵為:
IEFrameWorkerW 設為不可見 (WS_VISIBLE 未設定)利用 WH_CALLWNDPROC Hook 攔截 WM_SHOWWINDOW 訊息,檢測符合特徵的視窗並發送 WM_CLOSE 關閉。
LRESULT CALLBACK CallWndProc(int nCode, WPARAM wParam, LPARAM lParam) {
if (nCode < 0) return CallNextHookEx(g_hHook, nCode, wParam, lParam);
CWPSTRUCT* pCwp = (CWPSTRUCT*)lParam;
if (!pCwp) return CallNextHookEx(g_hHook, nCode, wParam, lParam);
// 僅處理視窗顯示訊息
if (pCwp->message != WM_SHOWWINDOW) {
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
TCHAR szClass[128];
GetClassName(pCwp->hwnd, szClass, 128);
// 檢查是否為 IEFrame
if (lstrcmpi(szClass, _T("IEFrame")) != 0) {
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
// 遍歷子視窗尋找 WorkerW
HWND hChild = GetWindow(pCwp->hwnd, GW_CHILD);
BOOL bClose = FALSE;
while (hChild) {
GetClassName(hChild, szClass, 128);
if (lstrcmpi(szClass, _T("WorkerW")) == 0) {
// 檢查可見性
LONG style = GetWindowLong(hChild, GWL_STYLE);
if (!(style & WS_VISIBLE)) {
bClose = TRUE; // 不可見的 WorkerW = 廣告視窗特徵
}
break;
}
hChild = GetWindow(hChild, GW_HWNDNEXT);
}
if (bClose) {
PostMessage(pCwp->hwnd, WM_CLOSE, 0, 0); // 非同步關閉,避免死結
}
return CallNextHookEx(g_hHook, nCode, wParam, lParam);
}
// 全域變數
HHOOK g_hHook = NULL;
void InstallAdBlockHook() {
HINSTANCE hDll = GetModuleHandle(_T("AdBlockHook.dll"));
if (!hDll) return;
HOOKPROC proc = (HOOKPROC)GetProcAddress(hDll, "CallWndProc");
if (!proc) return;
g_hHook = SetWindowsHookEx(WH_CALLWNDPROC, proc, hDll, 0); // 0 = 所有執行緒
}
void UninstallAdBlockHook() {
if (g_hHook) {
UnhookWindowsHookEx(g_hHook);
g_hHook = NULL;
}
}
// 程式啟動時呼叫 InstallAdBlockHook()
// 程式結束時呼叫 UninstallAdBlockHook()
| API/常數 | 用途 |
|---|---|
| WH_CALLWNDPROC | 攔截 SendMessage 發送的訊息 (同步,訊息進入目標視窗程序前) |
| CWPSTRUCT | Hook 回呼參數結構,含 hwnd, message, wParam, lParam |
| WM_SHOWWINDOW | 視窗顯示/隱藏時發送,wParam=TRUE 表示顯示 |
| GetClassName | 取得視窗類別名稱 |
| GetWindow / GW_CHILD / GW_HWNDNEXT | 遍歷子視窗 |
| GetWindowLong / GWL_STYLE | 取得視窗樣式位元組 |
| WS_VISIBLE | 視窗可見旗標 (0x10000000) |
| PostMessage / WM_CLOSE | 張貼關閉訊息,非同步避免阻塞 Hook 鏈 |
IWebBrowser2 介面事件 (NewWindow2/3) 攔截導航,屬應用層解決方案同樣架構可用於: