我正在创建一个小型数据包嗅探器程序并使用 pcap API 来实现这一点。目前,我基于源端口或目标端口 80 (http) 的数据包进行嗅探。使用文档 - https://www.tcpdump.org/pcap.html,使用 pcap_loop 例程处理返回的数据包,该例程接受会话处理程序指针、要嗅探的数据包数量、get_packet 回调例程和其他参数可以设置为 NULL.
pcap_loop(ppcap,-1,get_packet,NULL);
运行数据包嗅探的接口是 wlp2s0。在文档的末尾,它说明了包含以下内容的数据包的结构:
以太网头(??不知道为什么有以太网头,因为没有使用以太网协议) IP头 TCP头 有效载荷 在处理传入数据包的 get_packet 例程中,我有以下实现:
void get_packet(u_char *args, const struct pcap_pkthdr *header,const u_char *packet){
// packet structured in four layers
/*
- Ethernet header
- ip header
- TCP header
- payload (containing data being transmitted)
Each header is assumed to be in contigous memory position on the heap.
∴
ethernet header pointer = packet pointer
ip header pointer = packet pointer + ethernet header size
TCP header pointer = packet pointer + ethernet header size + ip header size
Each pointer is typecasted to its type
*/
printf("GOT PACKET - %s\n\n",packet);
ethernet = (const struct sniff_ethernet *)(packet); // typecasting packet pointer of type u_char to type const struct sniff_ip
ip = (const struct sniff_ip * )(packet + SIZE_ETHERNET); // ip header which is located packet + eth address len (6 bytes), type casted to type const struct sniff_ip
size_ip = IP_HL(ip) *4; // returns size of ip header
if (size_ip < 20) {
// triggered if ip header is less than 20 bytes
return;
}
根据文档定义,返回的 TCP 标头必须至少为 20 个字节,但在运行程序后,TCP 标头返回 4 个字节。我不知道为什么 TCP 标头大小似乎被截断或变形了。我是网络新手,但了解最基本的知识,相信这个项目可以成为一个很好的跳板。