簡體   English   中英

如何在 MacOS 上檢索 libpcap 函數給出的 TCP 數據包信息?

[英]How to retrieve TCP packet informations given by libpcap functions on MacOS?

我正在嘗試使用 libpcap 函數在 MacO 上進行數據包嗅探。 我正在使用在互聯網上找到的顯示如何使用 libpcap 的代碼,問題是這是 linux 的代碼,而我在 macos 上。 所以我在將不同的 struct iphdr/struct tcphdr 等從 Linux 翻譯到 MacOs 時遇到了很多問題。 我成功了 struct iphdr 和 struct ethhdr,但我無法翻譯 struct tcphdr。

這是 Linux 上的 struct tcphdr:

struct tcphdr {
   25     __be16  source;
   26     __be16  dest;
   27     __be32  seq;
   28     __be32  ack_seq;
   29 #if defined(__LITTLE_ENDIAN_BITFIELD)
   30     __u16   res1:4,
   31         doff:4,
   32         fin:1,
   33         syn:1,
   34         rst:1,
   35         psh:1,
   36         ack:1,
   37         urg:1,
   38         ece:1,
   39         cwr:1;
   40 #elif defined(__BIG_ENDIAN_BITFIELD)
   41     __u16   doff:4,
   42         res1:4,
   43         cwr:1,
   44         ece:1,
   45         urg:1,
   46         ack:1,
   47         psh:1,
   48         rst:1,
   49         syn:1,
   50         fin:1;
   51 #else
   52 #error  "Adjust your <asm/byteorder.h> defines"
   53 #endif  
   54     __be16  window;
   55     __sum16 check;
   56     __be16  urg_ptr;
   57 };

這是一個用於 MacOS 的:

struct tcphdr {
    unsigned short  th_sport;   /* source port */
    unsigned short  th_dport;   /* destination port */
    tcp_seq th_seq;         /* sequence number */
    tcp_seq th_ack;         /* acknowledgement number */
#if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN
    unsigned int    th_x2:4,    /* (unused) */
            th_off:4;   /* data offset */
#endif
#if __DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN
    unsigned int    th_off:4,   /* data offset */
            th_x2:4;    /* (unused) */
#endif
    unsigned char   th_flags;
#define TH_FIN  0x01
#define TH_SYN  0x02
#define TH_RST  0x04
#define TH_PUSH 0x08
#define TH_ACK  0x10
#define TH_URG  0x20
#define TH_ECE  0x40
#define TH_CWR  0x80
#define TH_FLAGS    (TH_FIN|TH_SYN|TH_RST|TH_ACK|TH_URG|TH_ECE|TH_CWR)

    unsigned short  th_win;     /* window */
    unsigned short  th_sum;     /* checksum */
    unsigned short  th_urp;     /* urgent pointer */
};

問題是我不知道在哪里可以找到 MacOs 結構中 Linux 結構中存在的 ack/doff/urg 等字段? 有人可以告訴我從哪里獲得這些信息嗎? 我在 C 語言中的理解程度並不高,無法理解不同的定義。

TCP 報頭的結構由RFC 793及以后的規范定義; 它們不是由 Linux 或 Windows 或 BSD/macOS 或...定義的。

Tcpdump 過去依賴於操作系統的結構,但是當不同的操作系統和不同的操作系統版本具有不同的標頭時,這會導致問題,因此它現在在其自己的源代碼中有一個 BSD 標頭的副本。

如果您正在使用最初為 Linux 編寫的代碼,您可能只想將 Linux 標頭復制到您自己的程序中,然后只需替換

#if defined(__LITTLE_ENDIAN_BITFIELD)

#if __DARWIN_BYTE_ORDER == __DARWIN_LITTLE_ENDIAN

並更換

#elif defined(__BIG_ENDIAN_BITFIELD)

#elif __DARWIN_BYTE_ORDER == __DARWIN_BIG_ENDIAN

Linux 代碼包含在 GNU 公共許可證 (GPL) 版本 2 中,因此如果您包含它,您的代碼也必須包含在該許可證中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM