Network Security Experiment: Packet Sniffing and Sppofing Lab
实验由网络安全
课程布置, 来自SeedProject
- 难度:中等
- 类别:探索
- 环境:WSL2 kali GUN/Linux
Programming with Libcap - Sniffing the network from our own applicaiton by Luis Martin Garcia.
IP SPOOFING with BSD RAW SOCKETS INTERFACE 实验没有提供spoofing参考,这里找到一个
对于单一的字节(a byte),大部分处理器以相同的顺序处理位元(bit),因此单字节的存放方法和传输方式一般相同。
对于多字节数据,如整数(32位机中一般占4字节),在不同的处理器的存放方式主要有两种。以内存中0x0A0B0C0D的存放方式为例:
有些处理器体系是Little-Endian,有些是Big-Endian,还有的可以配置。
为了在互联网上可以统一标准的传输数据,定义了NBO
网络传输一般采用Big-Endian,。IP协议中定义Big-Endian为网络字节序。
Berkeley套接字定义了一组转换函数,用于无符号16和32bit整数在网络序和本机字节序之间的转换。htonl
,htons
用于本机序转换到网络序;ntohl
,ntohs
用于网络序转换到本机序。
因为x86是Little-Endian,所以在抓包时要进行处理:
- 用转换函数
#include <arpa/inet.h>
- 在定义结构体时定义为
u_char
数组,单字节没有读取问题,然后注意整个数组的读取顺序
- 初始化网络接口
Network Interface
- 设定
Fliter
- 抓包
- 包处理
- 关闭网络接口
- 结束抓包
两个reference都使用pcap_lookupdev
但是,它已经过时。
我们可以使用pcap_findalldev
来代替,函数原型如下:
int pcap_findalldev(pcap_if_t **devices, char *errbuf);
一般使用流程
pcap_if_t *devices, *temp;
if (pcap_findalldev(&devices, errbuf) == -1) {
puts(errbuf);
return -1;
}
for (temp = devices; temp != NULL; temp = temp->next)
printf("Found Device %s\n", temp->name);
char *device = devices->name // 使用默认interface
- 参数1:指向pcap_if_t 数组的指针的地址,实际返回一个链表头
- 参数2:错误信息
- 返回值:-1代表失败, 其他则代表成功