- 1、本文档共17页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
信息安全实践第十次作业 网络嗅探器
四 川 大 学 计 算 机 学 院、软 件 学 院
实 验 报 告
班级:第 周
信息安全产品开发实践? 实验时间 2013.11.15 实验目的 使用Libpcap库捕获局域网中的IP包,要求:
1、打印数据包的源与目的物理地址;
2、打印源IP与目的IP地址;
3、打印出上层协议类型;
4、如果上层协议为TCP或UDP协议,打印目的与源端口信息;
5、如果上层协议为TCP或UDP协议,将数据以16进制与ASCII的两种方式同时打印出来,不可打印字符以‘.’代替 实验环境 虚拟机 Red Hat Enterprise Linux-VMware Workstation? 实验内容(算法、程序、步骤和方法) 在实验之前,必须先弄懂整个嗅探器工作流程,这对编写主函数很有帮助:
使用pcap_lookupdev()函数查找网络设备pcap_open_live()函数网络设备捕获数据包 (接上)
实验内容(算法、程序、步骤和方法)
#includestdio.h
#includestring.h
#includesys/types.h
#includesys/time.h
#includesys/socket.h
#includenetinet/in.h
#includenetinet/in_systm.h
#includenetinet/ip.h
#includenetinet/if_ether.h
#includenetinet/tcp.h
#includenetinet/udp.h
#includepcap.h
#includenetdb.h
#includetime.h
#includesys/time.h
#includectype.h
#define DEFAULT_SNAPLEN 1518 //被pcap捕捉的最大字节数
//打印16进制和ascii
void print(u_char*payload,int len,int offset,int maxlen)
{
printf(%.5d ,offset); //打印偏移量(宽度为5)
int max=maxlen; //数据包的有效载荷和长度
int i;
for(i=0;i16;i++) //打印16个字节的16进制payload
{
if((len-i)0) //还没打完
{
printf(%.2x ,payload[max-(len-i)]);
}
else //已打完,最后一个后面有空格
{
printf( );
}
}
printf( );
for(i=0;i16;i++) //打印16个字节的asciipayload
{
if(isprint(payload[max-(len-i)])) //为可打印字符
{
printf(%c,payload[max-(len-i)]);
}
else //打印不出来的用.表示
{
printf(.);
}
}
}
//打印数据包
void print_data(u_char *payload,int len)
{
int line_width=16; //一行16个字节
int len_rem=len; //剩余长度
int maxlen=len; //数据包的有效载荷和长度
int offset=0; //偏移量
while(1)
{
if(len_remline_width) //最后一次打印
{
if(len_rem==0) //已打印完
break;
else { //还没打印完
print(payload,len_rem,offset,maxlen); //调用print函数,传入payload地址、剩余长度、偏移量和数据包的有效载荷和长度
offset=offset+len_rem; //偏移量后移
printf(\n);
break;
}}
else //不是最后一次打印
{
print(payload,len_rem,offset,maxlen); //调用print函数,传入payload地址、剩余长度、偏移量和数据包的有效载荷和长度
offset=offset+16; //偏移量后移(由于非最后一次打印,所以固定打16个字节 - 偏移量后移16个字节)
printf(\n);
}
len_rem=len_rem-line_width; //剩余长度减少
}
}
//打印mac地址
void print_mac(u_char* macadd){
文档评论(0)