• <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>

            小明思考

            高性能服務器端計算
            posts - 70, comments - 428, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯系 :: 聚合  :: 管理

            網絡包過濾的實現

            Posted on 2006-04-19 16:53 小明 閱讀(3792) 評論(6)  編輯 收藏 引用 所屬分類: Network/ACE
            最近在使用金山詞霸2005,由于金山詞霸2005在啟動的時候會發一個UDP包到局域網,然后檢測是否有相同序列號的金山詞霸,如果發現則要求退出。甚為無奈。windows 2000自帶有防火墻的功能,但是只有Permit all 和 Permit only兩種模式,居然沒有Deny only,奇怪。

            所以我就查了一下MSDN,發現有Routing and Remote Access Service一類的API可以用。
            于是程序的流程就是這樣
            1.設置臨時防火墻,以阻擋發到端口11113的UDP包
            2.啟動金山詞霸
            3.刪除設置

            代碼:


            #include?
            <stdlib.h>
            #include?
            <Iphlpapi.h>
            #include?
            <Fltdefs.h>

            #pragma?comment(lib,?
            "Iphlpapi.lib")

            const?int?XDICT_PORT?=?11113;

            unsigned?
            long?CharToIp(const?char?*sIp)
            {
            ????
            int?octets[4];
            ????
            int?i;
            ????
            const?char?*?auxCad?=?sIp;
            ????unsigned?
            long?lIp?=?0;
            ????
            ????
            //we?extract?each?octet?of?the?ip?address
            ????
            //atoi?will?get?characters?until?it?found?a?non?numeric?character(in?our?case?'.')
            ????for(i?=?0;?i?<?4;?i++)
            ????{
            ????????octets[i]?
            =?atoi(auxCad);

            ????????
            if(octets[i]?<?0?||?octets[i]?>?255)
            ????????????
            return?0;

            ????????lIp?
            |=?(octets[i]?<<?(i*8));

            ????????
            //update?auxCad?to?point?to?the?next?octet
            ????????auxCad?=?strchr(auxCad,?'.');

            ????????
            if(auxCad?==?NULL?&&?i!=3)
            ????????????
            return?-1;

            ????????auxCad
            ++;
            ????}
            ????
            return?lIp;
            }

            int?APIENTRY?WinMain(HINSTANCE?hInstance,
            ?????????????????????HINSTANCE?hPrevInstance,
            ?????????????????????LPSTR?????lpCmdLine,
            ?????????????????????
            int???????nCmdShow)
            {
            ????
            //first?get?adapter?info
            ????PIP_ADAPTER_INFO?pAdapterInfo?=?NULL,tmp;
            ????unsigned?
            long?len?=?0;
            ?????GetAdaptersInfo(pAdapterInfo,
            &len);
            ????pAdapterInfo?
            =?(PIP_ADAPTER_INFO)?malloc?(len);
            ????DWORD?result?
            =?GetAdaptersInfo(pAdapterInfo,?&len);
            ????
            if(result!=ERROR_SUCCESS)
            ????{
            ????????MessageBox(NULL,
            "Fail?to?call?GetAdaptersInfo","ERROR",MB_OK);
            ????????
            return?-1;
            ????}

            ????
            //create?filters?interface
            ????INTERFACE_HANDLE?hInterface?=?NULL;
            ????result?
            =?PfCreateInterface(0,PF_ACTION_FORWARD,PF_ACTION_FORWARD,FALSE,TRUE,&hInterface);
            ????
            if(result!=NO_ERROR)
            ????{
            ????????MessageBox(NULL,
            "Fail?to?call?PfCreateInterface","ERROR",MB_OK);
            ????????
            return?-1;
            ????}

            ????
            //add?the?filter?to?adapter
            ????unsigned?long?dmp?=?0;
            ????PF_FILTER_DESCRIPTOR?ipFlt;
            ????ipFlt.dwFilterFlags?????
            =?0;
            ????ipFlt.dwRule????????????
            =?0;
            ????ipFlt.pfatType??????????
            =?PF_IPV4;
            ????ipFlt.dwProtocol????????
            =?FILTER_PROTO_UDP;
            ????ipFlt.fLateBound????????
            =?0;
            ????ipFlt.wSrcPort??????????
            =?0;
            ????ipFlt.wSrcPortHighRange?
            =?0;
            ????ipFlt.wDstPort??????????
            =?XDICT_PORT;
            ????ipFlt.wDstPortHighRange?
            =?XDICT_PORT;
            ????ipFlt.SrcAddr?
            =?(PBYTE)&dmp?;
            ????ipFlt.SrcMask?
            =?(PBYTE)&dmp;
            ????ipFlt.DstAddr?
            =?(PBYTE)&dmp;
            ????ipFlt.DstMask?
            =?(PBYTE)&dmp;

            ????
            //bind
            ????IP_ADDR_STRING?*localIp;
            ????
            for(tmp=pAdapterInfo;tmp?!=?NULL;tmp=tmp->Next)
            ????{
            ????????????
            //?each?ip?of?a?adapter
            ????????????for(localIp=&tmp->IpAddressList;localIp!=NULL;localIp=localIp->Next)
            ????????????{
            ????????????????unsigned?
            long?ul?=?CharToIp(localIp->IpAddress.String);
            ????????????????PBYTE?lIp?
            =?(PBYTE)&ul;
            ????????????????PfBindInterfaceToIPAddress(hInterface,?PF_IPV4,?lIp);
            ????????????}
            ????}

            ????result?
            =?PfAddFiltersToInterface(hInterface,1,&ipFlt,1,&ipFlt,NULL);
            ????
            if(result!=NO_ERROR)
            ????{
            ????????MessageBox(NULL,
            "Fail?to?call?PfAddFiltersToInterface","ERROR",MB_OK);
            ????????
            return?-1;
            ????}

            ????
            //start?XDict
            ????STARTUPINFO?si;
            ????PROCESS_INFORMATION?pi;
            ????ZeroMemory(?
            &si,?sizeof(si)?);
            ????si.cb?
            =?sizeof(si);
            ????ZeroMemory(?
            &pi,?sizeof(pi)?);
            ????::CreateProcess(NULL,
            "XDICT.exe",
            ????????NULL,?????????????
            //?Process?handle?not?inheritable.?
            ????????NULL,?????????????//?Thread?handle?not?inheritable.?
            ????????FALSE,????????????//?Set?handle?inheritance?to?FALSE.?
            ????????0,????????????????//?No?creation?flags.?
            ????????NULL,?????????????//?Use?parent's?environment?block.?
            ????????NULL,?????????????//?Use?parent's?starting?directory.?
            ????????&si,??????????????//?Pointer?to?STARTUPINFO?structure.
            ????????&pi?);????????????//?Pointer?to?PROCESS_INFORMATION?structure.

            ????
            //?Wait?until?child?process?exits.
            ????WaitForSingleObject(?pi.hProcess,?INFINITE?);
            ????
            //?Close?process?and?thread?handles.?
            ????CloseHandle(?pi.hProcess?);
            ????CloseHandle(?pi.hThread?);


            ????
            //remove?filter
            ????for(tmp=pAdapterInfo;tmp?!=?NULL;tmp=tmp->Next)
            ????{
            ????????result?
            =?PfRemoveFiltersFromInterface(hInterface,1,&ipFlt,1,&ipFlt);
            ????????
            if(result!=NO_ERROR)
            ????????{
            ????????????MessageBox(NULL,
            "Fail?to?call?PfRemoveFiltersFromInterface","ERROR",MB_OK);
            ????????????
            return?-1;
            ????????}
            ????}
            ????PfUnBindInterface(hInterface);?
            ????PfDeleteInterface(hInterface);

            ????
            //free
            ????free(pAdapterInfo);
            ????
            return?0;
            }

            使用的API有
            GetAdapaterInfo --- 取得網卡的信息,如ip
            PfCreateInterface ----Create一個Filter Interface
            PfBindInterfaceToIPAddress ----綁定Filter Interface到IP
            PfAddFiltersToInterface ----增加Filter到Interface
            PfRemoveFiltersFromInterface ---Remove Filter
            PfUnBindInterface---取消綁定到ip
            PfDeleteInterface---刪除Filter Interface


            附上可執行文件: http://www.shnenglu.com/Files/sandy/XDictWrapper.zip
            使用的時候解壓放在金山詞霸同一個目錄就可以了,然后通過這個程序來啟動金山詞霸。

            Feedback

            # re: 網絡包過濾的實現  回復  更多評論   

            2006-04-20 11:26 by 小軟
            阻斷UDP包,不錯哦

            # re: 網絡包過濾的實現  回復  更多評論   

            2006-08-21 20:11 by 大風
            很好,頂了.

            # re: 網絡包過濾的實現  回復  更多評論   

            2007-05-11 14:31 by anfy
            up

            # re: 網絡包過濾的實現  回復  更多評論   

            2007-05-14 21:18 by anfy
            大哥
            能能不能把那個
            Iphlpapi.h
            Fltdefs.h
            Iphlpapi.lib
            給我發一個啊
            2706204·

            # re: 網絡包過濾的實現  回復  更多評論   

            2007-05-14 21:19 by anfy
            大哥
            能能不能把那個
            Iphlpapi.h
            Fltdefs.h
            Iphlpapi.lib
            給我發一個啊
            2706204@163.com

            # re: 網絡包過濾的實現  回復  更多評論   

            2012-03-15 16:56 by yc
            這段程序只有在windows2000系統上才有效么?
            久久久国产亚洲精品| 99久久精品免费看国产一区二区三区| 国产V亚洲V天堂无码久久久 | 国产精品乱码久久久久久软件| 国产精品亚洲美女久久久| 亚洲国产天堂久久综合网站| 久久综合久久综合久久综合| 久久香蕉国产线看观看乱码| 国产福利电影一区二区三区久久久久成人精品综合 | 精品国产青草久久久久福利| 中文精品久久久久人妻不卡| 久久综合给合久久国产免费| 国产婷婷成人久久Av免费高清| 久久精品国产影库免费看| 99久久久久| 国产香蕉久久精品综合网| 亚洲国产精品无码成人片久久| 久久精品人人槡人妻人人玩AV| 99久久综合狠狠综合久久止| 久久97久久97精品免视看秋霞| 久久久久亚洲AV无码专区桃色| 久久精品国产日本波多野结衣| 国产三级久久久精品麻豆三级| 国产成人久久久精品二区三区| 亚洲国产一成久久精品国产成人综合| 久久久久久精品免费看SSS | 久久国产香蕉视频| 亚洲AV日韩精品久久久久| 国产ww久久久久久久久久| 亚洲国产一成久久精品国产成人综合 | 免费观看成人久久网免费观看| 色综合久久久久综合99| 久久精品无码专区免费东京热| 久久精品不卡| 亚洲AV无码一区东京热久久| 久久国产成人午夜aⅴ影院| 久久久久久午夜成人影院| 久久精品亚洲乱码伦伦中文 | 思思久久99热只有频精品66 | 久久国产福利免费| 国产精品久久久久…|