青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

twzheng's cppblog

『站在風(fēng)口浪尖緊握住鼠標(biāo)旋轉(zhuǎn)!』 http://www.cnblogs.com/twzheng

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  136 隨筆 :: 78 文章 :: 353 評(píng)論 :: 0 Trackbacks
基于SPI的數(shù)據(jù)報(bào)過濾原理與實(shí)現(xiàn)
作者:TOo2y

[摘自] VC 知識(shí)庫 (http://www.vckbase.com/)

一. 個(gè)人防火墻技術(shù)概述
二. Winsock 2 SPI介紹
三. 相關(guān)程序代碼分析
四. 小結(jié)與后記
五. 附錄之源代碼

一、個(gè)人防火墻技術(shù)概述

    隨著網(wǎng)絡(luò)安全問題日益嚴(yán)重,廣大用戶對(duì)網(wǎng)絡(luò)安全產(chǎn)品也越來越關(guān)注。防火墻作為一種網(wǎng)絡(luò)安全工具,早已受到大家的青睞。在PC機(jī)上使用的個(gè)人防火墻,很大程度上成為廣大網(wǎng)民的安全保護(hù)者。Windows下的個(gè)人防火墻都是基于對(duì)數(shù)據(jù)報(bào)的攔截技術(shù)之上。當(dāng)然在具體的實(shí)現(xiàn)方式上它們卻有很大的不同。總的來說可分為用戶級(jí)和內(nèi)核級(jí)數(shù)據(jù)報(bào)攔截兩類。其中內(nèi)核級(jí)主要是TDI過濾驅(qū)動(dòng)程序,NDIS中間層過濾驅(qū)動(dòng)程序,NDIS過濾鉤子驅(qū)動(dòng)程序等,它們都是利用網(wǎng)絡(luò)驅(qū)動(dòng)來實(shí)現(xiàn)的;而用戶級(jí)的過濾包括SPI接口,Windows2000包過濾接口等。本文主要講述基于SPI的包過濾實(shí)現(xiàn),它是Winsock 2的一個(gè)新特性。

二、Winsock 2 SPI介紹

    Winsock 2 是一個(gè)接口,而不是協(xié)議,所以它可以用于發(fā)現(xiàn)和使用任意數(shù)量的底層傳輸協(xié)議所提供的通信能力。起初的Winsock是圍繞著TCP/IP協(xié)議運(yùn)行的,但是在Winsock 2中卻增加了對(duì)更多傳輸協(xié)議的支持。Winsock 2不僅提供了一個(gè)供應(yīng)用程序訪問網(wǎng)絡(luò)服務(wù)的Windows socket應(yīng)用程序編程接口(API),還包含了由傳輸服務(wù)提供者和名字解析服務(wù)提供者實(shí)現(xiàn)的Winsock服務(wù)提供者接口(SPI)和ws2_32.dll。本文僅討論傳輸服務(wù)提供者及其應(yīng)用,暫不對(duì)名字解析服務(wù)提供者進(jìn)行分析。
    Winsock 2的傳輸服務(wù)提供者是以動(dòng)態(tài)鏈接庫的形式(DLL)存在的,它是通過WSPStartup函數(shù)為上層函數(shù)提供接口,而其他的傳輸服務(wù)提供者函數(shù)則是通過分配表的方式來訪問WS2_32.DLL。傳輸服務(wù)提供者的動(dòng)態(tài)鏈接庫只有在應(yīng)用程序需要時(shí)才由Ws2_32.dll來裝入內(nèi)存中的,在不需要時(shí)則會(huì)被自動(dòng)卸載。以下是winsock 2在傳輸服務(wù)提供者上的WOSA(Windows開放服務(wù)結(jié)構(gòu)):

----------------------------
│Windows socket 2 應(yīng)用程序│
----------------------------Windows socket 2 API
│       WS2_32.DLL        │
----------------------------Windows socket 2 傳輸SPI
│   傳輸服務(wù)提供者(DLL)  │  
----------------------------

    Windows socket SPI在服務(wù)提供者中使用了以下的函數(shù)前綴命名方式:WSP(Windows socket服務(wù)提供者),WPU(Windows socket提供者向上調(diào)用),WSC(Windows socket配置)。每一個(gè)傳輸服務(wù)提供者都有它自己所支持的傳輸協(xié)議,它是使用WSAPROTCOL_INFOW結(jié)構(gòu)來實(shí)現(xiàn)的。傳輸服務(wù)提供者把所有的相關(guān)信息都存放在這個(gè)結(jié)構(gòu)中,而應(yīng)用程序就是通過這個(gè)結(jié)構(gòu)的內(nèi)容來將自己和相應(yīng)的傳輸服務(wù)提供者相關(guān)聯(lián)。
    Windows socket SPI提供三種協(xié)議:分層協(xié)議,基礎(chǔ)協(xié)議和協(xié)議鏈。分層協(xié)議是在基礎(chǔ)協(xié)議的上層,依靠底層基礎(chǔ)協(xié)議實(shí)現(xiàn)更高級(jí)的通信服務(wù)?;A(chǔ)協(xié)議是能夠獨(dú)立,安全地和遠(yuǎn)程端點(diǎn)實(shí)現(xiàn)數(shù)據(jù)通信的協(xié)議,它是相對(duì)與分層協(xié)議而言的。協(xié)議鏈?zhǔn)菍⒁幌盗械幕A(chǔ)協(xié)議和分層協(xié)議按特點(diǎn)的順序連接在一起的鏈狀結(jié)構(gòu),請(qǐng)參見下圖:

API------------------------
   │      WS2_32.DLL     │
SPI------------------------
   │ 分層協(xié)議 │
SPI-------------
   │ 分層協(xié)議 │
SPI------------------------
   │       基礎(chǔ)協(xié)議       │
   ------------------------

    Ws2_32.dll數(shù)據(jù)傳輸部分的主要功能是在服務(wù)提供者和應(yīng)用程序之間提供流量管理的功能。每個(gè)應(yīng)用程序通過Ws2_32.dll和相應(yīng)的服務(wù)提供者進(jìn)行嚴(yán)格的數(shù)據(jù)交換。Ws2_32.dll根據(jù)應(yīng)用程序在創(chuàng)建套接字時(shí)所提供的參數(shù)來選擇特定的服務(wù)提供者,然后把應(yīng)用程序的實(shí)現(xiàn)過程轉(zhuǎn)發(fā)由所選創(chuàng)建套接字的服務(wù)提供者來管理。也就是說,Ws2_32.dll只是一個(gè)中間過程,而應(yīng)用程序只是一個(gè)接口,數(shù)據(jù)通信的實(shí)現(xiàn)卻是有服務(wù)提供者來完成的。我們說過,Ws2_32.dll是通過創(chuàng)建套接字的API函數(shù)WSASocket或socket的參數(shù)來確定使用哪一個(gè)服務(wù)提供者。而WSASocket/socket的參數(shù)中包括了地址族,套接字類型和協(xié)議類型,這三個(gè)因素共同決定了創(chuàng)建套接字的服務(wù)提供者。Ws2_32.dll在服務(wù)提供者中尋找第一個(gè)和前面三因素相匹配的WSAPROTOCOL_INFOW結(jié)構(gòu),然后就調(diào)用這個(gè)WSAPROTOCOL_INFOW結(jié)構(gòu)相應(yīng)的WSPStartup函數(shù),(所有的數(shù)據(jù)傳輸服務(wù)提供者以DLL的形式,它們對(duì)外的接口就只有WSPStartup,其他的服務(wù)提供者函數(shù)都是通過WSPStartup來調(diào)用的),進(jìn)而調(diào)用如WSPSocket的函數(shù)來創(chuàng)建套接字,WSPConnect的函數(shù)來建立連接等等。除了流量管理功能外,Ws2_32.dll還提供了其他的服務(wù),比如協(xié)議枚舉,基于線程的阻塞鉤子管理和在Ws2_32.dll和服務(wù)提供者之間進(jìn)行版本協(xié)商。

    傳輸服務(wù)提供者實(shí)現(xiàn)的功能包括建立連接,傳輸數(shù)據(jù),實(shí)現(xiàn)流控制和差錯(cuò)控制等函數(shù)。其實(shí)Ws2_32.dll并不知道服務(wù)提供者的請(qǐng)求等活動(dòng)是如何實(shí)現(xiàn)了,Ws2_32.dll在應(yīng)用程序和服務(wù)提供者之間實(shí)現(xiàn)了媒介的功能。傳輸服務(wù)提供者可分為兩類:套接字描述符是可安裝的文件系統(tǒng)(IFS)句柄的提供者;剩下的是非IFS的提供者。在我們的程序中選用了非IFS提供者。可見,服務(wù)提供者實(shí)現(xiàn)了底層的與網(wǎng)絡(luò)相關(guān)的協(xié)議。Ws2_32.dll提供了介質(zhì)級(jí)別的流量管理,應(yīng)用程序則提供了有關(guān)如何實(shí)現(xiàn)網(wǎng)絡(luò)相關(guān)的操作,它實(shí)現(xiàn)了用戶所希望的功能。

    在傳輸服務(wù)提供者的實(shí)現(xiàn)過程中,安裝順序是非常重要的。我們不僅要正確的安裝服務(wù)提供者,而且還必須在Windows socket中注冊(cè),將相關(guān)的系統(tǒng)信息保存在數(shù)據(jù)庫中,這樣Ws2_32.dll才能夠方便的獲得下層服務(wù)提供者的相關(guān)信息。在Ws2_32.dll中提供了用來安裝服務(wù)提供者的函數(shù)WSCInstallProvider,它需要服務(wù)提供者的有關(guān)數(shù)據(jù),比如DLL的名稱和路徑。同時(shí)Ws2_32.dll還提供了卸載服務(wù)提供者的函數(shù)WSCDeinstallProvider,在不需要時(shí)通過它將特定的服務(wù)提供者從系統(tǒng)中刪除。為什么說傳輸服務(wù)者的安裝順序很重要呢?在服務(wù)提供者配置函數(shù)中的WSCEnumProtocols是用來枚舉系統(tǒng)中所有已安裝的服務(wù)提供者,它按照服務(wù)提供者的安裝順序相應(yīng)的列出他們。在前面我們也提到過,Ws2_32.dll在服務(wù)提供者中按安裝順序搜尋和WSASocket/socket提供的三個(gè)參數(shù)相匹配的服務(wù)提供者,所以安裝順序在一定程度上是決定了服務(wù)提供者是否被正確調(diào)用的關(guān)鍵。Windows socket 2還提供了一個(gè)動(dòng)態(tài)鏈接庫Sporder.dll,它提供了對(duì)已安裝的所有服務(wù)提供者順序的重新排列(此DLL系統(tǒng)沒有自帶,common目錄中已提供)。在附錄中的T-Sporder.exe是一個(gè)查詢當(dāng)前已安裝所有數(shù)據(jù)傳輸服務(wù)提供者屬性的工具。
  
  服務(wù)提供者系統(tǒng)中區(qū)分基礎(chǔ)協(xié)議,分層協(xié)議和協(xié)議鏈?zhǔn)峭ㄟ^結(jié)構(gòu)WSAPROTOCOL_INFOW中的Protocolchain結(jié)構(gòu)的ChainLen值來實(shí)現(xiàn)的。分層協(xié)議的ChainLen值為0,基礎(chǔ)協(xié)議的值為1,而協(xié)議鏈的值是大于1。在數(shù)據(jù)傳輸服務(wù)提供者的實(shí)現(xiàn)方式中分層協(xié)議和基礎(chǔ)協(xié)議幾乎是相同的,它們的不同之處在安裝上。Windows中,現(xiàn)有的系統(tǒng)服務(wù)提供者(系統(tǒng)自帶)幾乎已提供了所有基本的服務(wù),因此我們所寫的服務(wù)提供者程序,都可以對(duì)數(shù)據(jù)報(bào)進(jìn)行適當(dāng)“修飾”后調(diào)用系統(tǒng)服務(wù)提供者來完成絕大部分剩下的功能,無論是基礎(chǔ)服務(wù)提供者還是分層服務(wù)提供者都可以使用這種技術(shù),免去不必要的勞動(dòng)。基礎(chǔ)服務(wù)提供者的實(shí)現(xiàn)過程主要是替換當(dāng)前系統(tǒng)服務(wù)提供者的安裝路徑為自己的服務(wù)提供者的安裝路徑即可,當(dāng)然我們必須保存所以系統(tǒng)服務(wù)者的相關(guān)數(shù)據(jù),在我們卸載自己的服務(wù)提供者還原系統(tǒng)服務(wù)提供者時(shí)要用到這些信息,如系統(tǒng)服務(wù)者DLL的名稱和路徑。而協(xié)議鏈就不同了,首先我們必須安裝好所有的基礎(chǔ)協(xié)議和分層協(xié)議后,再構(gòu)造協(xié)議鏈的WSAPROTOCOL_INFOW結(jié)構(gòu)鏈,組成協(xié)議鏈的每個(gè)協(xié)議都會(huì)在協(xié)議鏈的ProtocolChain.ChainEntries數(shù)組中被定義,協(xié)議鏈數(shù)組中的第一個(gè)協(xié)議應(yīng)該是第一個(gè)分層服務(wù)提供者。當(dāng)然在安裝分層協(xié)議及協(xié)議鏈時(shí)我們不會(huì)改變系統(tǒng)服務(wù)提供者,最多只是改變系統(tǒng)服務(wù)提供者的安裝順序罷了。在此,我們以分層服務(wù)提供者為例來說明數(shù)據(jù)傳輸服務(wù)提供者的安裝過程。
 
   Ws2_32.dll是使用標(biāo)準(zhǔn)的動(dòng)態(tài)鏈接庫來加載服務(wù)提供者接口的DLL到系統(tǒng)中去的,并調(diào)用WSPStartup來初始化。WSPStartup是Windows Socket 2應(yīng)用程序調(diào)用SPI程序的初始化函數(shù),也就是入口函數(shù)。WSPStartup的參數(shù)LPWSAPROTOCOL_INFOW指針提供應(yīng)用程序所期望的協(xié)議信息,然后通過這個(gè)結(jié)構(gòu)指針我們可以獲得所保存的系統(tǒng)服務(wù)提供者的DLL名稱和路徑,加載系統(tǒng)服務(wù)提供者后查找到系統(tǒng)SPI程序的WSPStartup函數(shù)的指針,通過這個(gè)指針我們就可以將自己服務(wù)提供者的WSPStartup函數(shù)和系統(tǒng)SPI程序的WSPStartup函數(shù)相關(guān)聯(lián),進(jìn)而調(diào)用系統(tǒng)的各個(gè)服務(wù)提供者函數(shù)。在數(shù)據(jù)傳輸服務(wù)提供者的實(shí)現(xiàn)中,我們需要兩個(gè)程序,一個(gè)是可執(zhí)行文件用來安裝傳輸服務(wù)提供者;另一個(gè)就是DLL形式的數(shù)據(jù)傳輸服務(wù)提供者。下面我們就對(duì)安裝程序(instif.exe)和實(shí)現(xiàn)程序(ipfilter.dll)所使用的主要函數(shù)進(jìn)行簡(jiǎn)要分析。

三、相關(guān)程序代碼分析

1.instif.exe

    可執(zhí)行程序instif.exe的主要功能是安裝我們自己的分層傳輸服務(wù)提供者,并重新排列所有傳輸服務(wù)提供者的順序,使我們的服務(wù)提供者位于協(xié)議鏈的頂端,這樣相應(yīng)類型的應(yīng)用程序就會(huì)首先進(jìn)入我們的傳輸服務(wù)提供者接口。本程序只有一個(gè)參數(shù),就是安裝(-install)或卸載(-remove)。作為演示,本程序只安裝了IP分層協(xié)議及與UDP相關(guān)的協(xié)議鏈。(在ipfilter.dll中,我們只過濾目標(biāo)端口為8000的UDP數(shù)據(jù)報(bào))
    自定義函數(shù):
    BOOL  getfilter();     //獲得所有已經(jīng)安裝的傳輸服務(wù)提供者
    void  freefilter();    //釋放存儲(chǔ)空間
    void  installfilter(); //安裝分層協(xié)議,協(xié)議鏈及排序
    void  removefilter();  //卸載分層協(xié)議和協(xié)議鏈

    代碼分析:
    protoinfo=(LPWSAPROTOCOL_INFOW)GlobalAlloc(GPTR,protoinfosize);
    //分配WSAPROTOCOL_INFOW結(jié)構(gòu)的存儲(chǔ)空間
    totalprotos=WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode);
    //獲得系統(tǒng)中已安裝的所有服務(wù)提供者
    GetCurrentDirectory(MAX_PATH,filter_path);  
    //得到當(dāng)前的路徑
    _tcscpy(filter_name,_T("\\ipfilter.dll"));  
    //構(gòu)造服務(wù)提供者文件ipfilter.dll的路徑全名
    WSCInstallProvider(&filterguid,filter_path,&iplayerinfo,1,&errorcode);
    //安裝自定義的IP分層協(xié)議
    iplayercataid=protoinfo[i].dwCatalogEntryId;
    //獲得已安裝自定義IP分層協(xié)議的由Ws2_32.dll分配的唯一標(biāo)志
    udpchaininfo.ProtocolChain.ChainEntries[0]=iplayercataid;
    //將自定義的IP分層協(xié)議作為自定義UDP協(xié)議鏈的根分層服務(wù)提供者安裝在協(xié)議鏈的頂端
    WSCInstallProvider(&filterchainguid,filter_path,chainarray,provcnt,&errorcode);
    //安裝協(xié)議鏈
    WSCWriteProviderOrder(cataentries,totalprotos);
    //更新所有服務(wù)提供者的安裝順序,把自定義的服務(wù)提供者排在所有協(xié)議的最前列
    WSCDeinstallProvider(&filterguid,&errorcode);
    //卸載IP分層協(xié)議
    WSCDeinstallProvider(&filterchainguid,&errorcode);
    //卸載協(xié)議鏈

  2.ipfilter.dll

    傳輸服務(wù)提供者都是以動(dòng)態(tài)鏈接庫的形式存在的,在應(yīng)用程序需要時(shí)由Ws2_32.dll加載,在用完之后就被卸載。本文的ipfilter.dll提供了對(duì)發(fā)送的UDP數(shù)據(jù)報(bào)進(jìn)行過濾的功能。也就是自定義WSPSendTo函數(shù),在調(diào)用系統(tǒng)服務(wù)提供者之前進(jìn)行過濾,判斷是否繼續(xù)向下調(diào)用,而其他的函數(shù)都是直接調(diào)用下層的系統(tǒng)服務(wù)提供者由它們直接處理。傳輸服務(wù)提供者只有一個(gè)入口函數(shù)就是WSPStartup,它是Windows Socket 應(yīng)用程序調(diào)用SPI的初始化函數(shù),其他SPI函數(shù)的調(diào)用都是通過WSPStartup的參數(shù)WSPUPCALLTABLE來實(shí)現(xiàn)的。
    自定義函數(shù):
    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);
    //SPI函數(shù)WSPSendTo和Windows Socket 2的API函數(shù)WSASendTo相對(duì)應(yīng)
    int  WSPAPI WSPStartup(WORD wversionrequested,LPWSPDATA lpwspdata,LPWSAPROTOCOL_INFOW lpprotoinfo,
         WSPUPCALLTABLE upcalltable,LPWSPPROC_TABLE lpproctable);
    //SPI函數(shù)WSPStartup和Windows Socket 2的API函數(shù)WSAStartup相對(duì)應(yīng),WSPStartup是唯一的入口函數(shù),剩下的30個(gè)SPI函數(shù)則是通過參數(shù)upcalltable來實(shí)現(xiàn)的,它們只能在內(nèi)部調(diào)用,不向外提供入口
    
    代碼分析:
    GetModuleFileName(NULL,processname,MAX_PATH);
    //獲得調(diào)用本服務(wù)提供者動(dòng)態(tài)鏈接庫的可執(zhí)行文件的全名
    OutputDebugString(_T("WSPSendTo Tencent Filtered"));
    //輸出調(diào)試信息
    nextproctable.lpWSPSendTo(s,lpbuffer,dwbuffercount,lpnumberofbytessent,dwflags,lpto,
                              itolen,lpoverlapped,lpcompletionroutine,lpthreadid,lperrno);
    //如果數(shù)據(jù)報(bào)滿足發(fā)送條件,調(diào)用下層系統(tǒng)服務(wù)提供者發(fā)送數(shù)據(jù)
    layerid=protoinfo[i].dwCatalogEntryId;
    //獲得已安裝自定義IP分層協(xié)議的由Ws2_32.dll分配的唯一標(biāo)志
    nextlayerid=lpprotoinfo->ProtocolChain.ChainEntries[i+1];
    //獲得下一層傳輸服務(wù)提供者的標(biāo)志信息
    WSCGetProviderPath(&protoinfo[i].ProviderId,filterpath,&filterpathlen,&errorcode);
    //獲得下一層傳輸服務(wù)提供者的安裝路徑
    ExpandEnvironmentStrings(filterpath,filterpath,MAX_PATH);
    //擴(kuò)展環(huán)境變量
    hfilter=LoadLibrary(filterpath));
    //裝載下一層傳輸服務(wù)提供者
    wspstartupfunc=(LPWSPSTARTUP)GetProcAddress(hfilter,"WSPStartup"));
    //獲得下一層傳輸服務(wù)提供者的入口函數(shù)WSPStartup,以便調(diào)用
    wspstartupfunc(wversionrequested,lpwspdata,lpprotoinfo,upcalltable,lpproctable);
    //調(diào)用下一層傳輸服務(wù)提供者的WSPStartup函數(shù),實(shí)現(xiàn)鉤子功能
    nextproctable=*lpproctable;
    //保存下一層服務(wù)提供者的30個(gè)服務(wù)函數(shù)指針
    lpproctable->lpWSPSendTo=WSPSendTo;
    //調(diào)用自定義函數(shù)WSPSendTo

    由于以動(dòng)態(tài)鏈接庫形式的服務(wù)提供者要向外提供一個(gè)入口函數(shù),因此還須一個(gè)配置文件ipfilter.def:
    EXPORTS    WSPStartup
    //向外提供入口函數(shù)WSPStartup
  
    3.T-Sporder.exe
    T-Sporder.exe是一個(gè)輔助工具,用來查看當(dāng)前系統(tǒng)中所有已經(jīng)安裝的傳輸服務(wù)提供者的屬性。
    totalprotocols=WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode);
    //獲得系統(tǒng)中的所有傳輸服務(wù)提供者,然后根據(jù)參數(shù)輸出它們的各項(xiàng)屬性。

四、小結(jié)與后記

    本文向大家介紹了Windows Socket 2的一個(gè)新特性,那就是服務(wù)提供者接口SPI(Service Provider Interface)。它不僅包括我們主要講解的傳輸服務(wù)提供者接口,還包括名字空間服務(wù)提供者接口。當(dāng)然,基于SPI的包過濾安全措施并不是特別的好,因?yàn)楹芏嘟⒃赥DI上面的數(shù)據(jù)傳輸并不會(huì)受到SPI的影響,所以當(dāng)前流行的防火墻大都是建立在NDIS之上的。
    傳輸服務(wù)提供者是以DLL的形式存在于系統(tǒng)之中的,在基于IP協(xié)議的網(wǎng)絡(luò)程序運(yùn)行時(shí),如果參數(shù)相匹配就會(huì)加載我們的傳輸服務(wù)提供者程序。而且在Windows下有很多系統(tǒng)網(wǎng)絡(luò)服務(wù),它們都是在系統(tǒng)啟動(dòng)時(shí)自動(dòng)加載的,這就為我們隱藏木馬的進(jìn)程提供了有利的條件。也就是說在傳輸服務(wù)提供者程序里嵌入木馬程序,很多基于IP協(xié)議的網(wǎng)絡(luò)系統(tǒng)程序在開機(jī)時(shí)運(yùn)行,這樣我們嵌入的木馬程序就會(huì)在系統(tǒng)啟動(dòng)時(shí)自動(dòng)加載,在系統(tǒng)關(guān)閉時(shí)才會(huì)卸載。它的特點(diǎn)是只要安裝一次后每每系統(tǒng)啟動(dòng)就會(huì)加載我們的傳輸服務(wù)提供者(里面包含木馬程序),而不必像遠(yuǎn)程注入線程那樣在系統(tǒng)每次啟動(dòng)時(shí)執(zhí)行安裝程序,并且它可同時(shí)被多個(gè)系統(tǒng)網(wǎng)絡(luò)程序加載。
    已編譯好的可執(zhí)行文件(過濾QQ數(shù)據(jù)報(bào)),您可以在我們的網(wǎng)站(http://fz5fz.yeah.net)下載。

五、附錄之源程序
 1.instif.exe
  1#define  UNICODE     
  2#define  _UNICODE         
  3
  4#include <stdio.h>
  5#include <tchar.h>
  6#include <string.h>
  7#include <ws2spi.h>
  8#include <sporder.h>
  9                           
 10GUID  filterguid={0x4d1e91fd,0x116a,0x44aa,{0x8f,0xd4,0x1d,0x2c,0xf2,0x7b,0xd9,0xa9}};
 11
 12GUID  filterchainguid={0xd3c21121,0x85e1,0x48f3,{0x9a,0xb6,0x23,0xd9,0x0c,0x73,0x07,0xef}};
 13
 14BOOL  getfilter();
 15void  freefilter();
 16void  installfilter();
 17void  removefilter();
 18void  start();
 19void  usage();
 20
 21int                   totalprotos=0;
 22DWORD                 protoinfosize=0;
 23LPWSAPROTOCOL_INFOW   protoinfo=NULL;
 24
 25int main(int argc,char *argv[])           
 26{
 27    start();
 28
 29    if(argc==2)
 30    {
 31        if(strcmp(argv[1],"-install")==0)   
 32        {
 33            installfilter();
 34            return 0;
 35        }

 36        else if(strcmp(argv[1],"-remove")==0)  
 37        {
 38            removefilter();
 39            return 0;
 40        }

 41    }

 42    usage();
 43    return 0;
 44}

 45
 46BOOL getfilter()
 47{
 48    int  errorcode;
 49
 50    protoinfo=NULL;
 51    totalprotos=0;
 52    protoinfosize=0;
 53
 54    if(WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode)==SOCKET_ERROR)
 55    {
 56        if(errorcode!=WSAENOBUFS)
 57        {
 58            _tprintf(_T("First WSCEnumProtocols Error: %d\n"),errorcode);
 59            return FALSE;
 60        }

 61    }

 62
 63    if((protoinfo=(LPWSAPROTOCOL_INFOW)GlobalAlloc(GPTR,protoinfosize))==NULL)
 64    {
 65        _tprintf(_T("GlobalAlloc in getfilter Error: %d\n"),GetLastError());
 66        return FALSE;
 67    }

 68
 69    if((totalprotos=WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode))==SOCKET_ERROR)
 70    {
 71        _tprintf(_T("Second WSCEnumProtocols Error: %d\n"),GetLastError());
 72        return FALSE;
 73    }

 74
 75    _tprintf(_T("Found %d protocols!\n"),totalprotos); 
 76    return TRUE;
 77}

 78
 79void freefilter()
 80{
 81    GlobalFree(protoinfo);
 82}

 83
 84void installfilter()
 85{
 86    int                i;
 87    int                provcnt;
 88    int                cataindex;
 89    int                errorcode;
 90    BOOL               rawip=FALSE;
 91    BOOL               udpip=FALSE;
 92    DWORD              iplayercataid=0,udporigcataid=0;
 93    TCHAR              filter_path[MAX_PATH];            
 94    TCHAR              filter_name[MAX_PATH];
 95    TCHAR              chainname[WSAPROTOCOL_LEN+1];      
 96    LPDWORD            cataentries;
 97    WSAPROTOCOL_INFOW  iplayerinfo,udpchaininfo,chainarray[1];
 98
 99    getfilter();
100    
101    for(i=0;i<totalprotos;i++)
102    {
103        if(!rawip
104        && protoinfo[i].iAddressFamily==AF_INET
105        && protoinfo[i].iProtocol==IPPROTO_IP)
106        {
107            rawip=TRUE;
108            memcpy(&iplayerinfo,&protoinfo[i],sizeof(WSAPROTOCOL_INFOW));
109            iplayerinfo.dwServiceFlags1=protoinfo[i].dwServiceFlags1 & (~XP1_IFS_HANDLES);
110        }

111
112        if(!udpip
113        && protoinfo[i].iAddressFamily==AF_INET
114        && protoinfo[i].iProtocol==IPPROTO_UDP)
115        {
116            udpip=TRUE;
117            udporigcataid=protoinfo[i].dwCatalogEntryId;
118            memcpy(&udpchaininfo,&protoinfo[i],sizeof(WSAPROTOCOL_INFOW));
119            udpchaininfo.dwServiceFlags1=protoinfo[i].dwServiceFlags1 & (~XP1_IFS_HANDLES);
120        }

121    }

122
123    _tcscpy(iplayerinfo.szProtocol,_T("T-IpFilter"));
124    iplayerinfo.ProtocolChain.ChainLen=LAYERED_PROTOCOL;
125
126    if(GetCurrentDirectory(MAX_PATH,filter_path)==0)
127    {
128        _tprintf(_T("GetCurrentDirectory Error: %d\n"),GetLastError());
129        return ;
130    }

131    _tcscpy(filter_name,_T("\\ipfilter.dll"));  
132    _tcscat(filter_path,filter_name);
133
134    if(WSCInstallProvider(&filterguid,filter_path,&iplayerinfo,1,&errorcode)==SOCKET_ERROR)
135    {
136        _tprintf(_T("WSCInstallProvider Error: %d\n"),errorcode);
137        return ;
138    }

139
140    freefilter();
141
142    getfilter();
143
144    for(i=0;i<totalprotos;i++)
145    {
146        if(memcmp(&protoinfo[i].ProviderId,&filterguid,sizeof(GUID))==0)
147        {
148            iplayercataid=protoinfo[i].dwCatalogEntryId;
149            break;
150        }

151    }

152
153    provcnt=0;
154    if(udpip)
155    {
156        _tcscpy(chainname,_T("T-UdpFilter"));
157        _tcscpy(udpchaininfo.szProtocol,chainname);
158
159        if(udpchaininfo.ProtocolChain.ChainLen==BASE_PROTOCOL)
160        {
161            udpchaininfo.ProtocolChain.ChainEntries[1]=udporigcataid;
162        }

163        else
164        {
165            for(i=udpchaininfo.ProtocolChain.ChainLen;i>0;i--)
166            {
167                udpchaininfo.ProtocolChain.ChainEntries[i+1]=udpchaininfo.ProtocolChain.ChainEntries[i];
168            }

169        }

170
171        udpchaininfo.ProtocolChain.ChainLen++;
172        udpchaininfo.ProtocolChain.ChainEntries[0]=iplayercataid;
173
174        memcpy(&chainarray[provcnt++],&udpchaininfo,sizeof(WSAPROTOCOL_INFOW));
175    }

176
177    if(WSCInstallProvider(&filterchainguid,filter_path,chainarray,provcnt,&errorcode)==SOCKET_ERROR)
178    {
179        _tprintf(_T("WSCInstallProvider for chain Error: %d\n"),errorcode);
180        return ;
181    }

182
183    freefilter();
184
185    getfilter();
186
187    if((cataentries=(LPDWORD)GlobalAlloc(GPTR,totalprotos*sizeof(WSAPROTOCOL_INFOW)))==NULL)
188    {
189        _tprintf(_T("GlobalAlloc int installfilter Error: %d\n"),errorcode);
190        return ;
191    }

192
193    cataindex=0;
194    for(i=0;i<totalprotos;i++)
195    {
196        if(memcmp(&protoinfo[i].ProviderId,&filterguid,sizeof(GUID))==0 
197        || memcmp(&protoinfo[i].ProviderId,&filterchainguid,sizeof(GUID))==0)
198        {
199        cataentries[cataindex++]=protoinfo[i].dwCatalogEntryId;
200        }

201    }

202
203    for(i=0;i<totalprotos;i++)
204    {
205        if(memcmp(&protoinfo[i].ProviderId,&filterguid,sizeof(GUID))!=0 
206        && memcmp(&protoinfo[i].ProviderId,&filterchainguid,sizeof(GUID))!=0)
207        {
208            cataentries[cataindex++]=protoinfo[i].dwCatalogEntryId;
209        }

210    }

211
212    if((errorcode==WSCWriteProviderOrder(cataentries,totalprotos))!=ERROR_SUCCESS)
213    {
214        _tprintf(_T("WSCWriteProviderOrder Error: %d\n"),GetLastError());
215        return ;
216    }

217
218    freefilter();
219
220    _tprintf(_T("\nInstall IP Filter Successfully"));
221    return ;
222}

223
224void removefilter()
225{
226    int  errorcode;
227    BOOL signal=TRUE;
228
229    if(WSCDeinstallProvider(&filterguid,&errorcode)==SOCKET_ERROR)
230    {
231        _tprintf(_T("WSCDeinstall filterguid Error: %d\n"),errorcode);
232        signal=FALSE;
233    }

234
235    if(WSCDeinstallProvider(&filterchainguid,&errorcode)==SOCKET_ERROR)
236    {
237        _tprintf(_T("WSCDeinstall filterchainguid Error: %d\n"),errorcode);
238        signal=FALSE;
239    }

240
241    if(signal)
242    {
243        _tprintf(_T("Deinstall IP Filter Successfully"));
244    }

245    return ;
246}

247
248void  start()
249{
250    _tprintf(_T("Install IP Filter, by TOo2y\n"));
251    _tprintf(_T("E-Mail: TOo2y@safechina.net\n"));
252    _tprintf(_T("HomePage: www.safechina.net\n"));
253    _tprintf(_T("Date: 10-29-2002\n\n"));
254    return ;
255}

256
257void  usage()
258{
259    _tprintf(_T("Usage:  instif  [ -install │ -remove ]\n"));
260    return ;
261}

262

2.ipfilter.dll
  1#define  UNICODE
  2#define  _UNICODE
  3
  4#include <ws2spi.h>
  5#include <tchar.h>
  6
  7GUID  filterguid={0x4d1e91fd,0x116a,0x44aa,{0x8f,0xd4,0x1d,0x2c,0xf2,0x7b,0xd9,0xa9}};
  8
  9LPWSAPROTOCOL_INFOW  protoinfo=NULL;
 10WSPPROC_TABLE        nextproctable;
 11DWORD                protoinfosize=0;
 12int                  totalprotos=0;
 13
 14BOOL getfilter()
 15{
 16    int    errorcode;
 17
 18    protoinfo=NULL;
 19    protoinfosize=0;
 20    totalprotos=0;
 21
 22    if(WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode)==SOCKET_ERROR)
 23    {
 24        if(errorcode!=WSAENOBUFS)
 25        {
 26            OutputDebugString(_T("First WSCEnumProtocols Error!")); 
 27            return FALSE;
 28        }

 29    }

 30
 31    if((protoinfo=(LPWSAPROTOCOL_INFOW)GlobalAlloc(GPTR,protoinfosize))==NULL)
 32    {
 33        OutputDebugString(_T("GlobalAlloc Error!"));                
 34        return FALSE;
 35    }

 36
 37    if((totalprotos=WSCEnumProtocols(NULL,protoinfo,&protoinfosize,&errorcode))==SOCKET_ERROR)
 38    {
 39        OutputDebugString(_T("Second WSCEnumProtocols Error!"));   
 40        return FALSE;
 41    }

 42
 43    return TRUE;
 44}

 45
 46void freefilter()
 47{
 48    GlobalFree(protoinfo);
 49}

 50
 51BOOL WINAPI DllMain(HINSTANCE hmodule,
 52DWORD     reason,
 53LPVOID    lpreserved)
 54{
 55    TCHAR   processname[MAX_PATH];
 56    TCHAR   showmessage[MAX_PATH+25];
 57
 58
 59    if(reason==DLL_PROCESS_ATTACH)
 60    {
 61        GetModuleFileName(NULL,processname,MAX_PATH);
 62        _tcscpy(showmessage,processname);
 63        _tcscat(showmessage,_T(" Loading IPFilter "));
 64        OutputDebugString(showmessage);  
 65    }

 66    return TRUE;
 67}

 68
 69int WSPAPI WSPSendTo(SOCKET    s,
 70  LPWSABUF         lpbuffer,
 71  DWORD            dwbuffercount,
 72  LPDWORD          lpnumberofbytessent,
 73  DWORD            dwflags,
 74  const struct     sockaddr FAR *lpto,
 75  int              itolen,
 76  LPWSAOVERLAPPED  lpoverlapped,
 77  LPWSAOVERLAPPED_COMPLETION_ROUTINE  lpcompletionroutine,
 78  LPWSATHREADID    lpthreadid,
 79  LPINT            lperrno)
 80{
 81
 82    struct sockaddr_in sin;
 83
 84    sin=*(const struct sockaddr_in *)lpto;
 85    if(sin.sin_port==htons(8000))        
 86    {
 87        OutputDebugString(_T("WSPSendTo Tencent Filtered"));
 88        return 0;
 89    }

 90    else
 91    {
 92        return nextproctable.lpWSPSendTo(s,lpbuffer,dwbuffercount,
 93            lpnumberofbytessent,dwflags,lpto,itolen,
 94            lpoverlapped,lpcompletionroutine,lpthreadid,lperrno);
 95    }

 96}

 97
 98int WSPAPI WSPStartup(
 99WORDwversionrequested,
100LPWSPDATA         lpwspdata,
101LPWSAPROTOCOL_INFOWlpprotoinfo,
102WSPUPCALLTABLEupcalltable,
103LPWSPPROC_TABLElpproctable
104)
105{
106    OutputDebugString(_T("IPFilter WSPStartup "));
107
108    int           i;
109    int           errorcode; 
110    int           filterpathlen;
111    DWORD         layerid=0
112    DWORD         nextlayerid=0;
113    TCHAR         *filterpath;
114    HINSTANCE     hfilter;
115    LPWSPSTARTUP  wspstartupfunc=NULL;
116
117    if(lpprotoinfo->ProtocolChain.ChainLen<=1)
118    {
119        OutputDebugString(_T("ChainLen<=1"));  
120        return FALSE;
121    }

122
123    getfilter();
124
125    for(i=0;i<totalprotos;i++)
126    {
127        if(memcmp(&protoinfo[i].ProviderId,&filterguid,sizeof(GUID))==0)
128        {
129            layerid=protoinfo[i].dwCatalogEntryId;
130            break;
131        }

132    }

133
134    for(i=0;i<lpprotoinfo->ProtocolChain.ChainLen;i++)
135    {
136        if(lpprotoinfo->ProtocolChain.ChainEntries[i]==layerid)
137        {
138            nextlayerid=lpprotoinfo->ProtocolChain.ChainEntries[i+1];
139            break;
140        }

141    }

142
143    filterpathlen=MAX_PATH;
144    filterpath=(TCHAR*)GlobalAlloc(GPTR,filterpathlen);  
145    for(i=0;i<totalprotos;i++)
146    {
147        if(nextlayerid==protoinfo[i].dwCatalogEntryId)
148        {
149            if(WSCGetProviderPath(&protoinfo[i].ProviderId,filterpath,&filterpathlen,&errorcode)==SOCKET_ERROR)
150            {
151                OutputDebugString(_T("WSCGetProviderPath Error!"));  
152                return WSAEPROVIDERFAILEDINIT;
153            }

154            break;
155        }

156    }

157
158    if(!ExpandEnvironmentStrings(filterpath,filterpath,MAX_PATH))
159    {
160        OutputDebugString(_T("ExpandEnvironmentStrings Error!"));    
161        return WSAEPROVIDERFAILEDINIT;
162    }

163
164    if((hfilter=LoadLibrary(filterpath))==NULL)
165    {
166        OutputDebugString(_T("LoadLibrary Error!")); 
167        return WSAEPROVIDERFAILEDINIT;
168    }

169
170    if((wspstartupfunc=(LPWSPSTARTUP)GetProcAddress(hfilter,"WSPStartup"))==NULL)
171    {
172        OutputDebugString(_T("GetProcessAddress Error!"));  
173        return WSAEPROVIDERFAILEDINIT;
174    }

175
176    if((errorcode=wspstartupfunc(wversionrequested,lpwspdata,lpprotoinfo,upcalltable,lpproctable))!=ERROR_SUCCESS)
177    {
178        OutputDebugString(_T("wspstartupfunc Error!"));  
179        return errorcode;
180    }

181
182    nextproctable=*lpproctable;
183    lpproctable->lpWSPSendTo=WSPSendTo;
184
185    freefilter();
186    return 0;
187}

(全文完)
posted on 2007-05-21 11:36 譚文政 閱讀(1349) 評(píng)論(0)  編輯 收藏 引用 所屬分類: 網(wǎng)絡(luò)編程
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲视频欧洲视频| 亚洲电影激情视频网站| 免费欧美在线| 亚洲午夜视频| 欧美日韩精品久久| 亚洲国产一区二区视频| 久久久久国色av免费看影院 | 免费日韩精品中文字幕视频在线| 国产欧美精品一区二区三区介绍| 99精品热6080yy久久 | 久久久久这里只有精品| 国产精品一区免费视频| 亚洲图片欧美日产| 91久久久久久久久久久久久| 久久综合一区| 激情五月综合色婷婷一区二区| 欧美一区二区成人| 在线亚洲精品| 欧美午夜精品久久久久久超碰| 99精品热视频| 91久久精品国产91久久性色tv| 蜜桃久久av| 亚洲第一久久影院| 乱人伦精品视频在线观看| 欧美在线一二三| 国产一区二区无遮挡| 久久高清福利视频| 性欧美在线看片a免费观看| 国产精品一区二区你懂得| 午夜精品三级视频福利| 亚洲图片你懂的| 国产精品九九久久久久久久| 亚洲一区精品在线| 亚洲一区二区免费视频| 影音先锋久久久| 一区二区欧美在线| 欧美人与禽性xxxxx杂性| 亚洲开发第一视频在线播放| 欧美国产日本高清在线| 久久综合网络一区二区| 亚洲激情啪啪| 91久久中文| 欧美三级视频| 午夜精品国产精品大乳美女| 亚洲制服欧美中文字幕中文字幕| 国产精品亚洲片夜色在线| 羞羞视频在线观看欧美| 午夜精品美女自拍福到在线| 国产一区二区成人| 米奇777超碰欧美日韩亚洲| 久久综合九九| 日韩写真在线| 9久草视频在线视频精品| 国产精品久久久久久一区二区三区| 欧美一区1区三区3区公司| 午夜精品网站| 在线观看日韩av电影| 欧美激情一区二区三区在线视频| 欧美高清在线一区二区| 亚洲视频播放| 欧美亚洲视频在线观看| 尤物九九久久国产精品的特点 | 国产精品久久97| 久久国产日韩欧美| 久久夜精品va视频免费观看| 亚洲人成免费| 99在线|亚洲一区二区| 国产精品一二一区| 久久亚洲视频| 欧美激情综合五月色丁香小说| 亚洲免费在线电影| 欧美综合二区| 亚洲免费激情| 亚洲字幕在线观看| 在线看成人片| 99re国产精品| 国产一区日韩欧美| 亚洲国产精品成人精品| 欧美午夜激情在线| 久久久水蜜桃| 欧美精品网站| 久久se精品一区精品二区| 麻豆成人av| 午夜精品福利在线观看| 久久久午夜精品| 亚洲桃花岛网站| 久久国产欧美精品| 一区二区国产日产| 欧美一区二区三区视频| 亚洲精品社区| 午夜精品久久久久久99热| 亚洲国产成人精品女人久久久 | 亚洲精品自在久久| 亚洲欧美在线高清| 亚洲精品一区二区三区在线观看 | 欧美国产先锋| 国产精品免费一区二区三区在线观看 | 国产一区在线看| 亚洲欧洲在线播放| 国产亚洲欧美色| 亚洲精品日韩欧美| 精品不卡一区二区三区| 一个色综合导航| 亚洲高清在线观看| 亚洲欧美日韩成人| 亚洲作爱视频| 久久视频精品在线| 亚洲欧美一区二区原创| 免费久久99精品国产自在现线| 欧美一区二区日韩一区二区| 欧美黄在线观看| 久久久水蜜桃| 国产精品免费观看在线| 91久久线看在观草草青青| 国外成人在线| 亚洲一二三四区| 9色porny自拍视频一区二区| 久久九九久精品国产免费直播| 亚洲综合色丁香婷婷六月图片| 欧美成人亚洲成人| 久久伊人精品天天| 国产欧美精品在线播放| 9i看片成人免费高清| 亚洲经典在线看| 久久精品日产第一区二区三区| 亚洲女优在线| 欧美裸体一区二区三区| 欧美国产日本高清在线| 激情六月婷婷综合| 翔田千里一区二区| 久久久久国产成人精品亚洲午夜| 午夜在线电影亚洲一区| 亚洲福利国产精品| 亚洲欧美色婷婷| 亚洲永久视频| 欧美日韩亚洲一区二区| 亚洲国产精品久久久久婷婷老年 | 欧美午夜视频在线| 亚洲国产天堂久久综合| 亚洲国产99精品国自产| 久久精品人人爽| 久久精品视频一| 国产麻豆精品视频| 亚洲小说春色综合另类电影| 亚洲少妇诱惑| 欧美另类视频| 91久久在线播放| 亚洲精品中文字幕在线| 欧美成人a∨高清免费观看| 欧美成人一区二区| 在线国产亚洲欧美| 欧美中文字幕视频在线观看| 久久精品国产一区二区三| 国产精品视频专区| 亚洲一区激情| 欧美亚洲尤物久久| 国产精品美女| 亚洲一区二区三区在线播放| 午夜免费电影一区在线观看| 国产精品久久久久免费a∨| 一本色道88久久加勒比精品| 一区二区三区久久久| 欧美日韩精品免费观看视频完整| 亚洲人成亚洲人成在线观看| 日韩视频免费看| 欧美激情精品久久久久久黑人| 亚洲国产成人久久综合| 亚洲久久在线| 欧美日韩一区二区三区在线看 | 国产亚洲成人一区| 欧美一区二区三区免费视频| 久久久国产精品一区二区三区| 国产一区二区三区久久| 久久高清福利视频| 毛片基地黄久久久久久天堂| 亚洲国产精品成人| 欧美成人亚洲| 日韩亚洲精品在线| 午夜精品福利视频| 国产日韩av一区二区| 久久福利影视| 欧美激情bt| 夜久久久久久| 国产精品久久久久久av下载红粉 | 亚洲国产毛片完整版 | 国产精品免费网站| 性欧美xxxx视频在线观看| 久久看片网站| 亚洲韩日在线| 欧美日韩国产大片| 亚洲午夜精品一区二区三区他趣| 午夜欧美精品| 黄色在线一区| 欧美大片免费观看| 99国产精品| 欧美一二三区精品| 亚洲第一在线视频| 欧美日韩免费观看中文| 午夜精品福利一区二区蜜股av| 久久综合九色99|