ARP報文發送的可視化實現

来源:http://www.cnblogs.com/xmyttxs/archive/2016/10/07/5936437.html
-Advertisement-
Play Games

一、安裝VS2013,下載wpdpack,為VS2010配置WinpCap環境: ⑴首先在View中選擇Property Manager,然後展開工程,再展開Debug|Win32 ,接著右擊 Mircrosoft.Cpp.Win32.user選擇Properties(此處設置全局有效) ⑵之後分三 ...


一、安裝VS2013,下載wpdpack,為VS2010配置WinpCap環境:

  ⑴首先在View中選擇Property Manager,然後展開工程,再展開Debug|Win32 ,接著右擊 Mircrosoft.Cpp.Win32.user選擇Properties(此處設置全局有效)

  ⑵之後分三步:

  ①設置環境目錄

    在VC++ Directiories中 Include Directories和Library Directories中添加路徑。

    假如將wpdpack放到c盤。則:

    Include Directories:c:/wpdpack/Include;

    Library Directories:c:/wpdpack/Lib;

    註意分號!

  ②設置編譯條件

    C/C++下Preprocessor(預處理器)的Preprocessor Definitions(預處理定義)

    添加WPCAP;HAVE_REMOTE;

    註意分號,每個預定義符用“;”分開。

  ③設置鏈接器

    Linker(鏈接器)下的Input(輸入)中的Additional Dependencies(附加依賴項)中添加:

    wpcap.lib;ws2_32.lib;(註意分號)

二、使用mfc實現可視化界面:

    目的視圖:

  

    1、新建項目:

      選擇Visual C++ -> MFC -> MFC應用程式 –>修改項目名稱test1 -> 下一步 –> 選擇基於對話框 -> 完成

  2、相關視圖介紹:

      ①解決方案資源管理器:可以看見所有的頭文件和源(.cpp)文件,此程式只需用到test1Dlg.cpp和test1Dlg.h。另外MFC中main函數被封裝起來了,並且我們也並不需要知道main函數在哪,因為我們希望實現的功能通常是觸發某個控制項,這個控制項的觸發函數為我們實現,並不需要將代碼寫到main函數內。

      ②類視圖:在類視圖中,我們可以看到三個類,此處只需要用到Ctest1Dlg,點擊類名,可以在下方很方便的找到類中的函數和變數。

      ③屬性管理器:在為VS配置全局環境時會用到。

      ④資源視圖:在test1 -> test1.rc -> Dialog -> IDD_TEST1_DIALOG可以看見自己設計的可視化界面。

      ⑤屬性:處理控制項時,在此處修改控制項的屬性。

    3、相關控制項的使用:

      ①靜態文本框Static Text:caption修改文字內容

      ②編輯框Edit Control:Read Only設置是否只讀

    ③IP地址編輯框IP Address Control:用法與普通編輯框一樣,只不過讀取內容時可以使用GetAddress()函數。

    ④組合框Combo Box:Type分為三種:簡易(Simple)組合框、下拉式(Dropdown)組合框和下拉列表式(Drop List)組合框,這裡選擇Drop List。

三、詳細設計:

  1.ARP發送中重要方法:

  填充ARP包方法的流程圖:

    

四、添加函數:

  1、 更改各控制項ID,並給部分空間增加變數。Combo Box的預設ID更改為IDC_NIC_COMBO,增加控制項變數m_comboNic;目的MAC地址的編輯框ID設為IDC_DESTI_MACADDRESS_EDIT,添加控制項變數為m_editDesti;目的IP地址的編輯框ID設為IDC_DESTI_IPADDRESS,添加控制項變數為m_ipaddressSesti;源MAC地址的編輯框ID設為IDC_SOURCE_MACADDRESS_EDIT,添加控制項變數為m_editSource;源IP地址的編輯框ID設為IDC_SOURCE_IPADDRESS,添加控制項變數為m_ipaddressSource;結果顯示編輯框ID設為IDC_RESULT_EDIT,添加控制項變數為m_editResult。

  2、 依據ARP包的結構定義結構體,並將需要引入的頭文件、結構體和相關常量的定義寫入test1Dlg.h文件中。

#include "stdafx.h"

#include <pcap.h>

#define ETH_ARP         0x0806  //乙太網幀類型表示後面數據的類型,對於ARP請求或應答來說,該欄位的值為x0806
#define ARP_HARDWARE    1  //硬體類型欄位值為表示乙太網地址
#define ETH_IP          0x0800  //協議類型欄位表示要映射的協議地址類型值為x0800表示IP地址
#define ARP_REQUEST     1   //ARP請求
#define ARP_RESPONSE       2      //ARP應答

//14位元組乙太網首部
struct EthernetHeader
{
    u_char DestMAC[6];    //目的MAC地址 6位元組
    u_char SourMAC[6];   //源MAC地址 6位元組
    u_short EthType;         //上一層協議類型,如0x0800代表上一層是IP協議,0x0806為arp  2位元組
};

//28位元組ARP幀結構
struct ArpHeader
{
    unsigned short hdType;   //硬體類型
    unsigned short proType;   //協議類型
    unsigned char hdSize;   //硬體地址長度
    unsigned char proSize;   //協議地址長度
    unsigned short op;   //操作類型,ARP請求(1),ARP應答(2),RARP請求(3),RARP應答(4)。
    u_char smac[6];   //源MAC地址
    u_char sip[4];   //源IP地址
    u_char dmac[6];   //目的MAC地址
    u_char dip[4];   //目的IP地址
};

//定義整個arp報文包,總長度42位元組
struct ArpPacket {
    EthernetHeader ed;
    ArpHeader ah;
};

 

  3、 在Ctest1Dlg::OnInitDialog()中寫入初始化的界面的代碼。

  

/* 獲取本機設備列表 */
    if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
    {
        m_comboNic.AddString(_T("Error in pcap_findalldevs!"));
        exit(1);
    }

    /* 列印列表 */
    for (d = alldevs; d; d = d->next)
    {
        ++i;
        if (d->description)
            m_comboNic.AddString(LPCTSTR(CString(d->name)));
        else
            m_comboNic.AddString(_T("(No description available)"));
    }

    if (i == 0)
    {
        m_comboNic.AddString(_T("No interfaces found! Make sure WinPcap is installed."));
        return -1;
    }
    // 預設選擇第一項
    m_comboNic.SetCurSel(0);
    //目的MAC地址編輯框中預設顯示"00-00-00-00-00-00"
    SetDlgItemText(IDC_EDIT1, _T("00-00-00-00-00-00"));

 

  4、 在確認按鈕的響應函數內添加以下代碼:

// 獲取組合框控制項的列表框中選中項的索引   
    inum = m_comboNic.GetCurSel();
    /* 跳轉到選中的適配器 */
    for (d = alldevs, i = 0; i<= inum - 1; d = d->next, i++);
    /* 打開設備 */
    if ((adhandle = pcap_open(d->name,          // 設備名
        65536,            // 65535保證能捕獲到不同數據鏈路層上的每個數據包的全部內容
        PCAP_OPENFLAG_PROMISCUOUS,    // 混雜模式
        1000,             // 讀取超時時間
        NULL,             // 遠程機器驗證
        errbuf            // 錯誤緩衝池
        )) == NULL)
    {
        m_editResult.SetWindowText(_T("Unable to open the adapter. \rIt is not supported by WinPcap"));
        /* 釋放設備列表 */
        pcap_freealldevs(alldevs);
        exit(-1);
    }

    unsigned char sendbuf[42]; //arp包結構大小,42個位元組
    BYTE IPByte[4];
    m_ipaddressSesti.GetAddress(IPByte[0], IPByte[1], IPByte[2], IPByte[3]);
    BYTE IPByte2[4];
    m_ipaddressSource.GetAddress(IPByte2[0], IPByte2[1], IPByte2[2], IPByte2[3]);

    CString str;
    char *c;
    BYTE mac[7] = { 0 };//源MAC地址
    m_editSource.GetWindowText(str);//獲取字元串
    c = cs2ca(str);    //CString轉為char*
    sscanf_s(c, "%h2x-%h2x-%h2x-%h2x-%h2x-%h2x", &mac[0], &mac[1], &mac[2], &mac[3], &mac[4], &mac[5]);

    EthernetHeader eh;
    ArpHeader ah;
    if (IsDlgButtonChecked(IDC_RADIO1) == 1) {
        //請求報文
      .....//相應代碼
} else if (IsDlgButtonChecked(IDC_RADIO2) == 1) { //應答報文  .....//相應代碼
} //構造一個ARP請求 memset(sendbuf, 0, sizeof(sendbuf)); //ARP清零 memcpy(sendbuf, &eh, sizeof(eh)); memcpy(sendbuf + sizeof(eh), &ah, sizeof(ah)); //如果發送成功 if (pcap_sendpacket(adhandle, sendbuf, 42) == 0) { m_editResult.SetWindowText(_T("\nPacketSend succeed\n")); } else { m_editResult.SetWindowText(_T("\nPacketSendPacket in getmine Error\n")); } /* 釋放設備列表 */ pcap_freealldevs(alldevs);

 

  其中主要遇到的困難是,如何獲取三個編輯框中用戶輸入的地址,將這種Cstring格式的地址轉為u_char格式的字元數組。IP ADDRESS CONTROL可以使用其函數GetAddress(IPByte[0], IPByte[1], IPByte[2], IPByte[3]);獲得。而MAC地址的編輯框獲得的字元串就不太好轉換了。碰過好多好多坑,試過好多好多方法之後,最終找到一種可行的方法:先把Cstring字元串利用函數轉換為char*型,再使用sscanf將每兩位代表十六進位的字元存在BYTE mac[7]數組中,但是貌似在vs2015中無法使用這個方法。

四、運行效果:

     

    

 

    

    

 

 傳送門:

  1.雞啄米VS2010/MFC教程

  2.WinPcap實戰(一)——發送ARP

  3.用sscanf轉換MAC字元串為BYTE數組時遇到的問題

 

 

 

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 這篇文章主要講述 IIS 8 部署免費 HTTPS 。 HTTPS 是互聯網 web 大勢所趨。TaSaid 最近把機房從香港遷移到青島,趁著這次機會,觀望並折騰了幾天,在遷移中順便完成了 HTTPS 的部署。 ...
  • 剛接到這樣的任務時,沒有感覺到任何壓力,不就是給移動端應用提供數據嗎?那邊發來參數,這邊處理數據,返回JSON。做網站開發時經常使用ajax請求後臺數據,不就是這麼回事嗎。於是,在確認完需求後就開始幹了,很快,進入聯調階段,這個時候各種問題來了,忙得不可開交。吃一塹,長一智,項目結束後總結了下,大致 ...
  • 虛方法和抽象方法都可以供派生類重寫,它們之間有什麼區別呢? 1. 虛方法必須有實現部分,併為派生類提供了覆蓋該方法的選項 抽象方法沒有提供實現部分,抽象方法是一種強制派生類覆蓋的方法,否則派生類將不能被實例化。如: //抽象方法 public abstract class Animal { publ ...
  • 一、獲取文件夾列表 /// /// 獲取文件夾下的文件列表 /// /// string Path:文件夾路徑(@"C:\") /// string SearchPattern:擴展名過濾(" .txt") /// bool SearchChild:為False不搜索子目錄,為True搜索子目錄 / ...
  • 在asp.net mvc項目里,用戶需要開拓幾個活動版面,並以側欄的方式呈現在首頁右側,幾個活動時間不一致,為避免瀏覽者在活動未開放之時進入未開放的服務頁面。因此不僅需要在活動代碼中加入限制功能,也需要在前臺取消不合時宜的頁面的展示。 ...
  • 第一部分:程式集(System.Reflection.Assembly) 1.獲取Assembly對象 方法1:調用Assembly的以下4個靜態方法Get...()之一: GetAssembly(Type t) GetCallingAssembly() ——返回調用當前方法的方法所在的程式集 Ge ...
  • 欲練神功,引刀自宮。為了避免記憶體管理的煩惱,Java咔嚓一下,把指針砍掉了。當年.Net也追隨潮流,咔嚓了一下,化名小桂子,登堂入室進了皇宮。康熙往下麵一抓:咦?還在?——原來是假太監韋小寶。 打開unsafe選項,C 指針就biu的一下子蹦出來了。指針很強大,沒必要拋棄這一強大的工具。誠然,在大多 ...
  • 題目鏈接 http://acm.hdu.edu.cn/showproblem.php?pid=5925 Problem Description TanBig, a friend of Mr. Frog, likes eating very much, so he always has dreams ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...