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

            小明思考

            高性能服務(wù)器端計(jì)算
            posts - 70, comments - 428, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            網(wǎng)絡(luò)包過濾的實(shí)現(xiàn)

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

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

            代碼:


            #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 --- 取得網(wǎng)卡的信息,如ip
            PfCreateInterface ----Create一個(gè)Filter Interface
            PfBindInterfaceToIPAddress ----綁定Filter Interface到IP
            PfAddFiltersToInterface ----增加Filter到Interface
            PfRemoveFiltersFromInterface ---Remove Filter
            PfUnBindInterface---取消綁定到ip
            PfDeleteInterface---刪除Filter Interface


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

            Feedback

            # re: 網(wǎng)絡(luò)包過濾的實(shí)現(xiàn)  回復(fù)  更多評論   

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

            # re: 網(wǎng)絡(luò)包過濾的實(shí)現(xiàn)  回復(fù)  更多評論   

            2006-08-21 20:11 by 大風(fēng)
            很好,頂了.

            # re: 網(wǎng)絡(luò)包過濾的實(shí)現(xiàn)  回復(fù)  更多評論   

            2007-05-11 14:31 by anfy
            up

            # re: 網(wǎng)絡(luò)包過濾的實(shí)現(xiàn)  回復(fù)  更多評論   

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

            # re: 網(wǎng)絡(luò)包過濾的實(shí)現(xiàn)  回復(fù)  更多評論   

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

            # re: 網(wǎng)絡(luò)包過濾的實(shí)現(xiàn)  回復(fù)  更多評論   

            2012-03-15 16:56 by yc
            這段程序只有在windows2000系統(tǒng)上才有效么?
            7777精品久久久大香线蕉| 久久无码av三级| 精品久久久久久国产免费了| 国产精品久久99| 午夜福利91久久福利| 久久人人爽人人爽人人片AV不 | 色欲综合久久躁天天躁蜜桃| 久久精品国产精品青草| 久久久久99这里有精品10| 久久久精品国产sm调教网站| 国产精品美女久久久免费| 久久久久无码精品国产不卡| 久久久久久综合一区中文字幕| 久久久免费观成人影院| 欧美日韩中文字幕久久伊人| 国产精品99久久久精品无码| 亚洲欧美日韩精品久久| 国产99久久精品一区二区| 成人妇女免费播放久久久| 午夜人妻久久久久久久久| 三上悠亚久久精品| 国产V综合V亚洲欧美久久| 久久亚洲精品人成综合网| 久久精品麻豆日日躁夜夜躁| 亚洲精品乱码久久久久久按摩| 99久久精品免费看国产一区二区三区| 久久国产亚洲精品| 国内精品伊人久久久久AV影院| 91精品国产色综合久久| 91精品婷婷国产综合久久| 国产精品免费久久久久影院| 久久久久综合国产欧美一区二区| 久久综合视频网站| 国产69精品久久久久9999APGF| 久久99精品久久久久久hb无码| 久久影院亚洲一区| 久久综合久久久| 999久久久免费精品国产| 久久无码AV中文出轨人妻| segui久久国产精品| 久久久无码精品亚洲日韩京东传媒|