<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆-17  評(píng)論-64  文章-79  trackbacks-1
    作者:
    CSDN? VC/MFC 網(wǎng)絡(luò)編程 PiggyXP ?^_^
    ?
    ? 目錄:
    二。發(fā)送數(shù)據(jù)包的編程實(shí)現(xiàn)
    ?? 1.? 填充數(shù)據(jù)包
    ?? 2.? 發(fā)送數(shù)據(jù)包
    三。一些附加步驟及說(shuō)明
    ?? 1.? 如果在VC中使用winpcap
    ?? 2.? 獲得網(wǎng)卡信息列表
    ?? 3.? 獲得系統(tǒng)ARP信息列表
    ?
    ?????????................緊接上 文................
    ?
    1.??????? 填充數(shù)據(jù)包
    ?
    下面我舉個(gè)填充包頭的例子,我首先定義個(gè)了一個(gè)轉(zhuǎn)換字符的函數(shù),如下
    ?
    /****************************************************************************
    ?*?? Name & Params::
    ?*???????????? formatStrToMAC
    ?*???????????? (
    ?*???????????????? const LPSTR lpHWAddrStr : 用戶輸入的MAC地址字符串
    ?*???????????????? unsigned char *HWAddr :?? 返回的MAC地址字符串(賦給數(shù)據(jù)包結(jié)構(gòu)體)
    ?*???????????? )
    ?*?? Purpose:
    ?*???????????? 將用戶輸入的MAC地址字符轉(zhuǎn)成數(shù)據(jù)包結(jié)構(gòu)體需要的格式
    ?****************************************************************************/
    void formatStrToMAC(const LPSTR lpHWAddrStr, unsigned char *HWAddr)
    {
    ?????? unsigned int i, index = 0, value, temp;
    ????? unsigned char c;
    ?
    ????? _strlwr(lpHWAddrStr);???????????????????????????????????????????????? ? // 轉(zhuǎn)換成小寫
    ?
    ????? for (i = 0; i < strlen(lpHWAddrStr); i++)
    ???? {
    ?????????? c = *(lpHWAddrStr + i);
    ????????? ? if (( c>='0' && c<='9' ) || ( c>='a' && c<='f' ))
    ?????????? {
    ??????????? ?? if (c>='0' && c<='9')? temp = c - '0';??????????????????????? ?// 數(shù)字
    ???????????? ? if (c>='a' && c<='f')? temp = c - 'a' + 0xa;????????????? ?// 字母
    ????????????? ?if ( (index % 2) == 1 )
    ????????????? {
    ?????????????????? value = value*0x10 + temp;
    ?????????????????? HWAddr[index/2] = value;
    ????????????? }
    ????????????? else value = temp;
    ????????????? index++;
    ???????? }
    ???????????? ? if (index == 12) break;
    ???? ?? }
    }
    ?
    // 開(kāi)始填充各個(gè)字段
    ARPPACKET ARPPacket;?????????????????????? ???????????????????????? ??// 定義ARPPACKET結(jié)構(gòu)體變量
    ?
    ??? memset(&ARPPacket, 0, sizeof(ARPPACKET));??????????? ??????????// 數(shù)據(jù)包初始化
    ?
    ???? formatStrToMAC(“DLC源MAC字符串”,ARPPacket.dlcHeader.SrcMAC);?????? // DLC幀頭
    ???? formatStrToMAC(“DLC目的MAC字符串”,ARPPacket.dlcHeader.DesMAC);
    ?
    ???? formatStrToMAC(“ARP源MAC字符串”,ARPPacket.arpFrame.Send_HW_Addr);? // 源MAC
    ???? ARPPacket.arpFrame.Send_Prot_Addr = inet_addr(srcIP);???????????? ?// 源IP
    ???? formatStrToMAC(“ARP目的MAC字符串”,ARPPacket.arpFrame.Targ_HW_Addr); // 目的MAC
    ???? ARPPacket.arpFrame.Targ_Prot_Addr = inet_addr(desIP);???????????? ??// 目的IP
    ????
    ???? ARPPacket.arpFrame.Opcode = htons((unsigned short)arpType);??????? // arp包類型
    ????
    ???? // 自動(dòng)填充的常量
    ???? ARPPacket.dlcHeader.Ethertype = htons((unsigned short)0x0806); // DLC Header的以太網(wǎng)類型
    ???? ARPPacket.arpFrame.HW_Type = htons((unsigned short)1);???????????// 硬件類型
    ???? ARPPacket.arpFrame.Prot_Type = htons((unsigned short)0x0800);??? // 上層協(xié)議類型
    ???? ARPPacket.arpFrame.HW_Addr_Len = (unsigned char)6;???????????????? // MAC地址長(zhǎng)度
    ???? ARPPacket.arpFrame.Prot_Addr_Len = (unsigned char)4;?????????????? // IP地址長(zhǎng)度
    ?
    That’s all ! ^_^
    填充完畢之后,我們需要做的就是把我們的ARPPACKET結(jié)構(gòu)體發(fā)送出去
    ?
    2.發(fā)送ARP數(shù)據(jù)包:
    ?
    我們發(fā)送ARP包就要用到winpcap的api了,具體步驟及函數(shù)是這樣的,為了簡(jiǎn)單易懂,我把錯(cuò)誤處理的地方都去掉了,詳見(jiàn)代碼
    /**********************************************************************
    *??? Name & Params::
    *???????????? SendARPPacket()
    *??? Purpose:
    *???????????? 發(fā)送ARP數(shù)據(jù)包
    *??? Remarks:
    *???????????? 用的是winpcap的api函數(shù)
    ***********************************************************************/
    void SendARPPacket()
    {
    ???? char *AdapterDeviceName =GetCurAdapterName(); ????// 首先獲得獲得網(wǎng)卡名字
    ?
    ???? lpAdapter = PacketOpenAdapter(AdapterDeviceName);???? // 根據(jù)網(wǎng)卡名字打開(kāi)網(wǎng)卡
    ?
    ???? lpPacket = PacketAllocatePacket();????????? ?????// 給PACKET結(jié)構(gòu)指針?lè)峙鋬?nèi)存
    ?
    ???? PacketInitPacket(lpPacket, &ARPPacket, sizeof(ARPPacket));?//初始化PACKET結(jié)構(gòu)指針
    ?????????????????????? ??????????????????????// 其中的ARPPacket就是我們先前填充的ARP包
    ?
    ???? PacketSetNumWrites(lpAdapter, 1);????? ?????????// 每次只發(fā)送一個(gè)包
    ?
    ???? PacketSendPacket(lpAdapter, lpPacket, true)????? ?// Send !!!!! ^_^
    ?
    ???? PacketFreePacket(lpPacket);???????????????????? // 釋放資源
    ???? PacketCloseAdapter(lpAdapter);
    }
    ?
    呵呵,至此,關(guān)于ARP包最關(guān)鍵的部分就講完了,你現(xiàn)在就可以來(lái)隨心所欲的發(fā)送自己的ARP包了
    ?
    既然作為一篇“科普文章”,接下來(lái)我再講一講與整個(gè)項(xiàng)目有關(guān)的附加步驟以及說(shuō)明
    ?
    三.附加步驟以及說(shuō)明
    1. 如何在VC中使用winpcap驅(qū)動(dòng)
    ?????? 雖然winpcap開(kāi)發(fā)包使用起來(lái)非常簡(jiǎn)便,但是前期準(zhǔn)備工作還是要費(fèi)一番功夫的,缺一不可。^_^
    ?????? 首先就是要安裝它的驅(qū)動(dòng)程序了,可以到它的主頁(yè)下載,更新很快的
    ???? http://winpcap.polito.it/install/default.htm
    ???? 下載WinPcap auto-installer (driver +DLLs),直接安裝就好了,或者我提供的代碼包里面也有。
    ???? 希望以后用winpcap作開(kāi)發(fā)的朋友,還需要下載 Developer's pack,解壓即可。
    ????
    ??????? 然后,需要設(shè)置我們工程的附加包含目錄為我們下載Developer's pack開(kāi)發(fā)包的Inclulde目錄,連接器的附加依賴庫(kù)設(shè)置為Developer's pack的lib目錄。
    ?????? 當(dāng)然,因?yàn)槲覀兊墓ぷ鞅容^簡(jiǎn)單,就是借用winpcap發(fā)送數(shù)據(jù)包而已,所以只用從
    winpcap開(kāi)發(fā)包的include文件夾中,拷貝Packet32.h,到我們的工程來(lái),并且包含它就可
    以, 但是要注意,Packet32.h本身還要包含一個(gè)Devioctl.h,也要一并拷貝進(jìn)來(lái),當(dāng)然還有運(yùn)
    行庫(kù)Packet.lib,一共就是需要拷貝3個(gè)文件了,如果加入庫(kù)不用我多說(shuō)了吧,在工程里面設(shè)
    置,或者是在需要它的地方加入#pragma comment(lib, "Packet.lib")了。
    ?
    ??????? 整個(gè)項(xiàng)目其實(shí)可以分為四個(gè)部分,填充數(shù)據(jù)包、發(fā)送數(shù)據(jù)包、枚舉系統(tǒng)網(wǎng)卡列表
    相關(guān)信息以及枚舉系統(tǒng)ARP緩存列表,下面我再講一下如何獲得系統(tǒng)的網(wǎng)卡以及ARP
    表,這兩個(gè)部分都要用到IP Helperapi,所以要包含<Iphlpapi.h>以及庫(kù)文件Iphlpapi.lib,
    其實(shí)都是很簡(jiǎn)單的,只用寥寥幾行就OK了
    2.???? 枚舉系統(tǒng)網(wǎng)卡以及信息
    最好是先定義關(guān)于網(wǎng)卡信息的一個(gè)結(jié)構(gòu)體,這樣顯得結(jié)構(gòu)比較清晰
    // 網(wǎng)卡信息
    typedef struct tagAdapterInfo?????????
    {
    ???? ???????? char szDeviceName[128];?????????? // 名字
    ???? ???????? char szIPAddrStr[16];???????????? // IP
    ???? ???????? char szHWAddrStr[18];???????????? // MAC
    ???? ???????? DWORD dwIndex;??????????????????? // 編號(hào)?????????
    }INFO_ADAPTER, *PINFO_ADAPTER;
    ?
    /*********************************************************************
    *??? Name & Params::
    *???????????? AddAdapInfoToList
    *???????????? (
    *????????????????? CListCtrl& list :? CARPPlayerDlg傳入的list句柄
    *???????????? )
    *??? Purpose:
    *???????????? 獲得系統(tǒng)的網(wǎng)卡信息,并將其添加到list控件中
    *??? Remarks:
    *???????????? 獲得網(wǎng)卡IP及MAC用到了IpHelper api GetAdaptersInfo
    ******************************************************************/
    void AddAdapInfoToList(CListCtrl& list)
    {
    ???? char tempChar;
    ???? ULONG uListSize=1;
    ???? PIP_ADAPTER_INFO pAdapter;?????????? // 定義PIP_ADAPTER_INFO結(jié)構(gòu)存儲(chǔ)網(wǎng)卡信息
    ???? int nAdapterIndex = 0;
    ?
    ???? DWORD dwRet = GetAdaptersInfo((PIP_ADAPTER_INFO)&tempChar, &uListSize);//關(guān)鍵函數(shù)
    ?
    ???? if (dwRet == ERROR_BUFFER_OVERFLOW)
    ???? {
    ? PIP_ADAPTER_INFO pAdapterListBuffer = (PIP_ADAPTER_INFO)new(char[uListSize]);
    ? dwRet = GetAdaptersInfo(pAdapterListBuffer, &uListSize);
    ? if (dwRet == ERROR_SUCCESS)
    ? {
    ???? pAdapter = pAdapterListBuffer;
    ???? while (pAdapter)????????????????????????????????????????? ??? // 枚舉網(wǎng)卡然后將相關(guān)條目添加到List中
    ???? {
    ??????? // 網(wǎng)卡名字
    ????????? CString strTemp = pAdapter->AdapterName;????????????????????
    ????????? strTemp = "\\Device\\NPF_" + strTemp;?????????????????????? ?// 加上前綴
    ????????? list.InsertItem(nAdapterIndex,strTemp);?????????????????
    ????????? strcpy(AdapterList[nAdapterIndex].szDeviceName,strTemp);
    ????????? // IP
    ????????? strcpy(AdapterList[nAdapterIndex].szIPAddrStr,
    ???????????????????????????????????????????????? pAdapter->IpAddressList.IpAddress.String );
    ????????? list.SetItemText(nAdapterIndex,1,AdapterList[nAdapterIndex].szIPAddrStr);
    ????????? // MAC
    ????????? formatMACToStr( AdapterList[nAdapterIndex].szHWAddrStr, pAdapter->Address );
    ????????? list.SetItemText(nAdapterIndex,2,AdapterLis[nAdapterIndex].szHWAddrStr);
    ????????? // 網(wǎng)卡編號(hào)
    ????????? AdapterList[nAdapterIndex].dwIndex = pAdapter->Index;?????????
    ?
    ????????? pAdapter = pAdapter->Next;
    ????????? nAdapterIndex ++;
    ????????? }
    ???? delete pAdapterListBuffer;
    ???? }
    }
    }
    ?
    2)獲取ARP條目列表
    // ARP條目信息
    typedef struct tagARPInfo????????????
    {
    ???? char szIPAddrStr[16];??????????? ? // IP
    ???? char szHWAddrStr[18];???????????? // MAC
    ???? DWORD dwType;???????????????????? // 類型
    }INFO_ARP, *PINFO_ARP;
    ?
    ?
    /**********************************************************************
    *??? Name & Params::
    *???????????? AddARPInfoToList
    *???????????? (
    *????????????????? CListCtrl& list :?????????? ? CARPPlayerDlg傳入的list句柄
    *????????????????? const short nAdapterIndex :?? 用戶選中的網(wǎng)卡編號(hào)
    *???????????? )
    *??? Purpose:
    *???????????? 讀入系統(tǒng)的ARP緩存列表,.并添加到對(duì)話框中
    *??? Remarks:
    *???????????? 用到了IpHelper api GetIpNetTable
    *???????????? 而且用到了WinSock的api,所以要包含<WinSock2.h>
    *****************************************************************/
    void AddARPInfoToList(CListCtrl& list,const short nAdapterIndex)
    {
    ???? char tempChar;
    ???? DWORD dwListSize = 1;
    ???? DWORD dwRet;
    ???? in_addr inaddr;
    ???? list.DeleteAllItems();
    ?
    ???? dwRet = GetIpNetTable((PMIB_IPNETTABLE)&tempChar, &dwListSize, TRUE);? // 關(guān)鍵函數(shù)
    ???? if (dwRet == ERROR_INSUFFICIENT_BUFFER)
    ???? {
    ???????? PMIB_IPNETTABLE pIpNetTable = (PMIB_IPNETTABLE)new(char[dwListSize]);
    ???????? dwRet = GetIpNetTable(pIpNetTable, &dwListSize, TRUE);
    ???????? if (dwRet == ERROR_SUCCESS)
    ???????? {
    ????????????? for (int i=0; i<(int)pIpNetTable->dwNumEntries; i++)
    ????????????? {
    ????????????????? // IP
    ?????????????????? inaddr.S_un.S_addr = pIpNetTable->table[i].dwAddr;
    ?????????????????? strcpy( ARPList[i].szIPAddrStr, inet_ntoa(inaddr) );??
    ?????????????????? // MAC
    ?????????????????? formatMACToStr( ARPList[i].szHWAddrStr, pIpNetTable->table[i].bPhysAddr );
    ?????????????????? // Type
    ?????????????????? ARPList[i].dwType = pIpNetTable->table[i].dwType;????????
    ?
    ?????????????????? if (AdapterList[nAdapterIndex].dwIndex != pIpNetTable->table[i].dwIndex)???????????????????? ????????????????????????????????? continue;
    ?
    ?????????????????? list.InsertItem(i,ARPList[i].szIPAddrStr);
    ?????????????????? list.SetItemText(i,1,ARPList[i].szHWAddrStr);
    ?????????????????? switch(ARPList[i].dwType) {?????????? // 根據(jù)type的值來(lái)轉(zhuǎn)換成字符顯示
    ?????????????????? case 3:
    ?????????????????????? list.SetItemText(i,2,"Dynamic");
    ?????????????????????? break;
    ?????????????????? case 4:
    ?????????????????????? list.SetItemText(i,2,"Static");
    ?????????????????????? break;
    ?????????????????? case 1:
    ?????????????????????? list.SetItemText(i,2,"Invalid");
    ?????????????????? default:
    ?????????????????????? list.SetItemText(i,2,"Other");
    ?????????????????? }
    ????????????? }
    ???????? }
    ???????? delete pIpNetTable;
    ???? }
    }
    ??????? 這樣一來(lái),我們基本上大功告成了,其他還有一些東西在這里就不講了,大家可以下載我的代碼看看就好了。
    ??????? 下面我們來(lái)用ARP包玩一些小把戲 ^_^。
    posted on 2007-02-16 15:45 飛鳥(niǎo) 閱讀(450) 評(píng)論(0)  編輯  收藏 所屬分類: VC
    主站蜘蛛池模板: 中文字幕乱码免费视频| 久久久久亚洲AV无码网站| 99国产精品永久免费视频| 一级一级毛片免费播放| 亚洲精品V天堂中文字幕| 亚洲美女大bbbbbbbbb| 亚洲精品无码午夜福利中文字幕| 四虎永久免费观看| 成年女人视频网站免费m| jjizz全部免费看片| 日韩内射激情视频在线播放免费| 精品免费久久久久国产一区 | 中出五十路免费视频| 亚洲AV永久无码精品一福利 | 香蕉97超级碰碰碰免费公| 久久精品电影免费动漫| 国产视频精品免费视频| 一级日本高清视频免费观看 | 超清首页国产亚洲丝袜| 亚洲高清无在码在线无弹窗 | 免费A级毛片无码专区| 美女被cao网站免费看在线看| jizz18免费视频| 亚洲国产成人AV在线播放 | 狠狠入ady亚洲精品| 亚洲看片无码在线视频| 亚洲伊人久久大香线蕉啊| 亚洲成a人片毛片在线| 亚洲最新中文字幕| 亚洲午夜精品一区二区公牛电影院| 亚洲美女自拍视频| 亚洲中文字幕无码av在线| 亚洲AV无码乱码在线观看代蜜桃| 亚洲国产美女精品久久| 亚洲1区1区3区4区产品乱码芒果 | 插B内射18免费视频| 国产成人无码a区在线观看视频免费 | 国产在线观看免费不卡| 国产伦一区二区三区免费| 亚洲av无码国产精品色在线看不卡 | 亚洲欧洲在线观看|