首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> VC >> 關於VC++

WinPcap 實作自定義 ARP 封包發送:突破 Socket 層限制,直達數據鏈路層

     編輯:關於VC++

背景:為什麼需要 WinPcap?

標準 Socket (CSocket) 最低只能到 SOCK_RAW (IP 層),無法構造/接收數據鏈路層 (MAC/ARP) 封包。WinPcap 提供 pcap.dll + packet.dll,讓應用層直接存取網卡驅動,實現完整封包控制。

核心 API 速查

函式用途
pcap_findalldevs列舉所有網卡裝置
pcap_open_live開啟網卡,設定混雜模式、快照長度、超時
pcap_sendpacket發送原始封包
pcap_freealldevs釋放裝置列表
pcap_close關閉網卡控制代碼

封裝類別設計

  • CHex:十六進制資料操作輔助 (運算子重載 <<, AddTwoByte, AddUINT 等)
  • CYGPcap:WinPcap API 薄封裝
  • CYGEdit:編輯控制項增強
  • CResize:視窗大小自適應

ARP 封包格式 (以太網 + ARP)

【以太網頭】 14 Bytes
  目的 MAC (6) | 來源 MAC (6) | 類型 0x0806 (2)

【ARP 負載】 28 Bytes
  硬體類型 1 (2) | 協議類型 0x0800 (2) | 硬體長度 6 (1) | 協議長度 4 (1)
  操作碼 1=請求/2=回應 (2)
  發送方 MAC (6) | 發送方 IP (4)
  目的 MAC (6) | 目的 IP (4)

發送 ARP 核心代碼


void CNetArpDlg::OnBtnSendArp() {
    if (!UpdateData()) return;
    static int nPkt = 0;
    CHex pkt(64);
    CString dstMac; m_edDst >> dstMac;
    DWORD ip;

    try {
        if (dstMac.GetLength()!=12 || m_strSrc.GetLength()!=12) throw "MAC 長度錯誤";

        // 以太網頭
        pkt << dstMac;           // 目的 MAC
        pkt << m_strSrc;         // 來源 MAC
        pkt.AddTwoByte(0x0806);  // Type = ARP

        // ARP 負載
        pkt.AddTwoByte(0x0001);  // Hardware: Ethernet
        pkt.AddTwoByte(0x0800);  // Protocol: IPv4
        pkt.AddOneByte(0x06);    // MAC 長度
        pkt.AddOneByte(0x04);    // IP 長度
        pkt.AddTwoByte(m_nArpType+1); // Opcode: 1=Request, 2=Reply

        pkt << m_strSrc;         // Sender MAC
        m_IPSender.GetAddress(ip);
        pkt.AddUINT(ip);         // Sender IP

        pkt.Add("\x00\x00\x00\x00\x00\x00", 6); // Target MAC (請求時全0)
        m_IPTarget.GetAddress(ip);
        pkt.AddUINT(ip);         // Target IP

        // 回應包補齊填充 (視實際需求)
        if (m_nArpType == 1) pkt.Add("\x00...\x00", 18);

        m_pcap.SendPacket(pkt);
        m_edShow << "發送第" << ++nPkt << "包" << endl << pkt << endl << endl;
    } catch (char* err) { AfxMessageBox(err); }
}

編譯前準備

  1. 安裝 WinPcap 開發包 (含 pcap.h, pcap.lib)
  2. 更新 VC6 Platform SDK 至較新版本
  3. 專案設定 → Link → Additional Dependencies 加入 pcap.lib ws2_32.lib

結語

作者初次接觸 WinPcap,代碼難免疏漏,歡迎大神指正。完整專案源碼隨文提供。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved