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

限制 PC 上網的實作方案:基於 SPI 封包過濾與 IE Proxy 偵測

     編輯:關於VC++

前言

需求:允許特定時段(如週六 08:00-20:00)上網,其餘時間封鎖。用戶態實現主要有三種路徑:Hook 瀏覽器網址列(不準)、Winsock SPI 封包過濾(推薦)、WSAIoctl 原始 Socket 抓包(易漏本機發送封包)。本文聚焦 SPI 方案,並解決代理上網繞過直連過濾的問題。

一、兩種上網路徑與對應過濾策略

路徑 A:直連網關/路由器

封包目的 IP 為公網位址。在 WSPSendTo 中攔截,判斷目標 IP 是否屬於區域網段(如 192.168.x.x),非區網即丟棄:


int WSPAPI WSPSendTo(SOCKET s, LPWSABUF lpBuffers, DWORD dwBufferCount,
    LPDWORD lpNumberOfBytesSent, DWORD dwFlags, const struct sockaddr FAR *lpTo,
    int iToLen, LPWSAOVERLAPPED lpOverlapped,
    LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine,
    LPWSATHREADID lpThreadId, LPINT lpErrno) {
    sockaddr_in sin = *(sockaddr_in*)lpTo;
    if (sin.sin_addr.S_un.S_un_b.s_b1 != 192) { // 非 192.168.x.x
        OutputDebugString(_T("WSPSendTo Filtered"));
        return 0; // 丟棄封包
    }
    return NextProcTable.lpWSPSendTo(s, lpBuffers, dwBufferCount, ...); // 放行
}

路徑 B:透過區域網代理伺服器

所有對外封包目的 IP 均為代理伺服器區網 IP,直連過濾失效。解法:

  1. 啟動時透過 InternetQueryOption(NULL, INTERNET_OPTION_PROXY, ...) 取得 IE 設定的代理 IP 與埠號
  2. 在 SPI 發送函數中,同時比對目標 IP 與埠號,若同時匹配代理設定則丟棄
  3. 如此可封鎖代理上網,不影響存取代理伺服器本身的區網資源(如檔案共享)

INTERNET_PROXY_INFO* pInfo = NULL;
DWORD dwSize = 0;
InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pInfo, &dwSize); // 取得緩衝區大小
pInfo = (INTERNET_PROXY_INFO*)new char[dwSize];
InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pInfo, &dwSize); // 實際取值
// pInfo->lpszProxy 格式如 "http=192.168.1.100:8080;ftp=..."
// 解析出 IP 與 Port 存入全域變數 g_ProxyIP, g_ProxyPort

過濾判斷:


if (sin.sin_addr.S_un.S_addr == g_ProxyIP && ntohs(sin.sin_port) == g_ProxyPort)
    return 0; // 丟棄經代理的對外請求

二、SPI 服務提供者安裝要點

  • 實現 WSPStartup、WSPCleanup、WSPSocket、WSPSendTo、WSPRecvFrom 等必要入口
  • 透過 WSCInstallProvider 將自訂 SPI 註冊至 Winsock 目錄,並設定鏈路順序置於基礎 TCP/IP 提供者之前
  • 參考 VC 知識庫《線上雜志》第 20 期 TOo2y 文章《基於 SPI 的資料報過濾原理與實現》及 Windows SDK Layered.zip 範例

三、限制與防繞過

  • 用戶態 SPI 无法攔截繞過 Winsock 的核心層驅動或 TDI 級別通訊(如部分惡意程式、Rootkit)
  • 若需企業級管控,建議部署網關防火牆或 LSP/TDI 過濾驅動
  • 本方案適用於家長控制、教室管理等一般用戶態限制場景

四、總結

結合直連 IP 判斷與 IE Proxy 偵測雙重過濾,可有效限制 PC 對外網路存取,同時保留區域網通訊。完整原始碼可作為網路存取控制模組的參考實現。

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