文档介绍:网络安全编程技术
第3讲:数据包的捕获与分析
1/58
本讲编程训练目标
编程实现一个协议分析器。该协议分析器将包含以下几部分功能:
数据采集——网络数据包;
网数据帧头部的全部信息;
解析IP数据包的头部信息;
解析TCP和UDP包的头部信息;
2
主要内容
用原始Socket抓包
进行协议分析
使用开发工具包WinPcap抓包
3
1. 用原始Socket抓包流程
创建原始Socket
获取一个需要监听网络接口的ip地址,并绑定(必须要显示绑定)
设置网卡为混杂模式
开始循环接收数据
关闭Socket
4
关键代码1:创建原始Socket
SnifferSocket = socket(, SOCK_RAW, IPPROTO_IP);
if (Result == SOCKET_ERROR)
{
printf("socket failed with error %d\n", WSAGetLastError());
return 0;
}
5
原始socket的特点
应用程序可以收到目标是其它主机的包
应用程序会收到ip包
如果设置IP_HDRINCL 选项,可以手动设置发送的ip包的头部
不能拦截数据,因为系统采用的是拷贝的方式
由于安全原因,在xp-sp2,windows 7中原始socket的使用有限制:
不能发送tcp包
不能使用伪造的原ip地址
6
关键代码2:绑定到一个本地IP地址
Result = gethostname(Name, 255);
pHostent = (struct hostent*)malloc(sizeof(struct hostent));
pHostent = gethostbyname(Name);
SOCKADDR_IN sock;
= ;
= htons(5555);
memcpy(&, pHostent->h_addr_list[0], pHostent->h_length);
Result = bind(SnifferSocket, (PSOCKADDR) &sock, sizeof(sock));
想想看这里端口号有没有意义,这个值合不合适
一定是第一个接口吗?
7
获取本地接口的更好方法
SOCKADDR_IN input;
char remoteip[]="";//可以是任意地址
short remoteport=80;
char buf[1024];
= ;
= inet_addr(remoteip);
= htons(remoteport);
Result = WSAIoctl (SnifferSocket, SIO_ROUTING_INTERFACE_QUERY, &input, sizeof(input), buf, 1024, &dwBytesRet, NULL, NULL);
SOCKADDR_IN *lpIf = (SOCKADDR_IN *)buf;
=lpIf->sin_addr;
8
关键代码3:设置为混杂模式
u_long InOutParam=1;
Result =ioctlsocket(SnifferSocket, SIO_RCVALL, &InOutParam);
参数InOutParam表示命令SIO_RCVALL 的输入参数
WSAIoctl是相应的Winows扩展函数,更复杂,更强大。
9
以太网卡的工作模式
网卡的MAC地址(48位)
通过ARP来解析MAC与IP地址的转换
用ipconfig/ifconfig可以查看MAC地址
正常情况下,网卡应该只接收这样的包
MAC地址与自己相匹配的数据帧
广播包
网卡完成收发数据包的工作,两种接收模式
混杂模式:不管数据帧中的目的地址是否与自己的地址匹配,都接收下来
非混杂模式:只接收目的地址相匹配的数据帧,以及广播数据包(和组播数据包)
为了监听网络上的流量,必须设置为混杂模式
10