[英]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.