繁体   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