程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> C++入門知識 >> VC++實現禁止上網

VC++實現禁止上網

編輯:C++入門知識

1、使用windows Hook,監視IE或其他浏覽器的地址欄,發現有www或http字樣的,則更改這些url,使之不能訪問相應的url。這種方法實現可能相對容易,但是不准確,不能限制所有的上網軟件。糊弄未成年小孩可能比較有效。
  2、基於SPI的數據包過濾。通過編寫自己的Winsock服務提供者(SPI),過濾掉不符合規則的包,如過濾訪問Internet的數據包。下面會詳述此方法。
  3、使用Winsock 2的WSAIoctl特性進行包過濾。WinSock 2允許程序使用WSAIoctl() 給一個SOCK_RAW類型的socket設置SIO_RCVALL屬性,這樣Socket可以接收到所有經過本機的數據。此方法詳細參閱文檔“無需驅動程序的Sniffer-IPMon”
  以上三種都是在用戶態(user-mode)的實現方法。優點是方便實現,無須編程者理解驅動方面的知識,缺點是還是可能遺漏一些數據包,譬如那些一些病毒軟件可能不通過socket接口來訪問網絡,這樣用戶態的程序就無法捕獲到這些包。但由於我們的目的是限制普通用戶上網,而不是做防火牆,所以第2種方法基本可以接受。至於第3種方法,據文檔1描述經常無法看到本機發出去的數據包,我也沒有仔細測試,有興趣的朋友可以自己試試。
  第2種方法主要參考了VC知識庫《在線雜志》第20期中TOo2y的文章:“基於SPI的數據報過濾原理與實現”。Windows也有一個例子 Layered.zip。另外,《windows網絡編程技術》(Anthony Jones著京京工作室譯,機工出版),這本書第14章“Winsock2服務提供者接口”較詳細討論了SPI知識。
  下面討論實現方案。以一個局域網中的電腦為例,實現目標是:不能訪問Internet,但可以訪問局域網。我們知道,PC機上網有兩種方式:A 通過網關(路由器)上網,B 通過代理服務器上網。
  對於A,則其訪問Internet時的地址都是公網地址,我們直接通過自己的傳輸服務提供者直接過濾掉。如下:
int WSPAPI WSPSendTo(
 
               SOCKET           s,
 
               LPWSABUF         lpbuffer,
 
               DWORD            dwbuffercount,
 
               LPDWORD          lpnumberofbytessent,
 
               DWORD            dwflags,
 
               const struct     sockaddr FAR *lpto,
 
               int              itolen,
 
               LPWSAOVERLAPPED  lpoverlapped,
 
               LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpcompletionroutine,
 
               LPWSATHREADID    lpthreadid,
 
               LPINT            lperrno)
 
{
 
     
 
       struct sockaddr_in sin; 
 
       sin=*(const struct sockaddr_in *)lpto;
 
 
 
       //過濾掉訪問地址不是本地局域網的包,下面只是簡單認為192.168.*.*是局域網的IP,具體需
 
       //根據不同的局域網網絡地址進行設置。
 
 
 
       if (192 != sin.sin_addr.S_un.S_un_b.s_b1)
 
       {
 
              OutputDebugString(_T("WSPSendTo Tencent Filtered"));
 
              return 0;
 
       }
 
       else
 
       {
 
              return nextproctable.lpWSPSendTo(s,
 
                                    lpbuffer,
 
                                    dwbuffercount,
 
                                    lpnumberofbytessent,
 
                                    dwflags,
 
                                    lpto,
 
                                    itolen,
 
                                    lpoverlapped,
 
                                    lpcompletionroutine,
 
                                    lpthreadid,
 
                                    lperrno);
 
       }
 
}              對於B,由於PC機是通過局域網中的代理上網的,所以其所有的上網數據包通過先發給本地代理,然後代理將它請求的網頁返回給它,所以其訪問Internet是間接的,其訪問Internet時發出的包都是局域網的IP。這樣上面的過濾規則就不適用。怎麼辦?我們可以先取得IE的代理服務器IP地址和端口號,然後將包的地址和端口號與IE的代理IP地址和端口號比較,如果都相等,則過濾此包。這樣就可以限制PC機通過代理上網,同時不影響它訪問代理服務器的局域網資源。
  至於如何獲取IE的代理服務器地址和端口號,可使用下面代碼:
       INTERNET_PROXY_INFO *pIEinfo = NULL;
 
       DWORD dwSize = 0;
 
       BOOL bRet = InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pIEinfo, &dwSize);
 
       pIEinfo = (INTERNET_PROXY_INFO*)new char[dwSize];
 
       bRet = InternetQueryOption(NULL, INTERNET_OPTION_PROXY, pIEinfo, &dwSize);
作者:yincheng01

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved