pcap包解析.docx
- 文档编号:23622725
- 上传时间:2023-05-19
- 格式:DOCX
- 页数:41
- 大小:410.33KB
pcap包解析.docx
《pcap包解析.docx》由会员分享,可在线阅读,更多相关《pcap包解析.docx(41页珍藏版)》请在冰豆网上搜索。
pcap包解析
项目A 从pcap文件中析取所有TCP会话与UDP会话
张中秋(U201217502,****************,tel139****8428,1205班)执笔100%签字
摘要:
本项目主要针对的是对于单一网络节点,.pcap文件是二进制格式的网络轨迹(Networktrace)文件,记录了网络通信过程的数据包信息。
csv(commaseparatedvalues)是一种用逗号','分隔的文本文件,类似于excel文件。
.pcap文件是二进制文件,需要从中提取信息并以csv的格式进行存储。
可以使用tshark实现对.pcap文件进行分析。
关键词:
TCP/UDP协议,数据包,文件,IP包
1.引言
要对整个pcap文件进行操作,就必须先对pcap文件进行解析,析取pcap文件中所有的TCP会话和UDP会话。
HTTP使用TCP而不是UDP的原因在于(打开)一个网页必须传送很多数据,而TCP协议提供传输控制,按顺序组织数据,和错误纠正。
所以在做http重组之前,对pcap文件中TCP会话与UDP会话的提取非常的关键。
2.项目问题分析与解决问题的算法
Pcap文件结构:
(1)基本格式:
文件头数据包头数据报数据包头数据报......
(2)文件头:
图1pcap文件头
a、标识位:
32位的,这个标识位的值是16进制的0xa1b2c3d4。
b、主版本号:
16位,默认值为0x2。
c、副版本号:
16位,默认值为0x04。
d、区域时间:
32位,实际上该值并未使用,因此可以将该位设置为0。
e、精确时间戳:
32位,实际上该值并未使用,因此可以将该值设置为0。
f、数据包最大长度:
32位,该值设置所抓获的数据包的最大长度,如果所有数据包都要抓获,将该值设置为65535;例如:
想获取数据包的前64字节,可将该值设置为64。
g、链路层类型:
32位,数据包的链路层包头决定了链路层的类型。
(3)pcap数据包头:
图2pcap数据包头
a、时间戳,包括:
秒计时:
32位,一个UNIX格式的精确到秒时间值,用来记录数据包抓获的时间,记录方式是记录从格林尼治时间的1970年1月1日00:
00:
00到抓包时经过的秒数;
微秒计时:
32位,抓取数据包时的微秒值。
b、数据包长度:
32位,标识所抓获的数据包保存在pcap文件中的实际长度,以字节为单位。
c、数据包实际长度:
所抓获的数据包的真实长度,如果文件中保存不是完整的数据包,那么这个值可能要比前面的数据包长度的值大。
(4)pcap数据:
即Packet(通常就是链路层的数据帧)具体内容,长度就是Caplen,这个长度的后面,就是当前PCAP文件中存放的下一个Packet数据包,也就是说:
PCAP文件里面并没有规定捕获的Packet数据包之间有什么间隔字符串,下一组数据在文件中的起始位置。
我们需要靠第一个Packet包确定。
(5)读取时进制转换问题:
packagePcapFinally;
importjava.util.List;
publicclassPcap{
privatePcapHeaderheader;
privateList
publicPcapHeadergetHeader(){
returnheader;
}
publicvoidsetHeader(PcapHeaderheader){
this.header=header;
}
publicList
returndata;
}
publicvoidsetData(List
this.data=data;
}
publicvoidottString(){
System.out.println("datapartcount="+data.size());
}
}
packagePcapFinally;
importjava.io.BufferedWriter;
importjava.io.FileWriter;
importjava.io.IOException;
importjava.io.PrintWriter;
publicclassPcapData{
publicstaticStringsource_adrress;
//数据包头文件
publicstaticinttime_s;//时间戳(秒)
publicstaticinttime_ms;//时间戳(微秒)
publicstaticintpLength;//抓包长度
publicstaticintlength;//实际长度
publicstaticbyte[]content;//数据
publicStringtai;//以太网帧14字节不作处直接读取十四个字节
//ip包
publicStringversion_ihl;//ip包中的版本号家包头长度1字节
publicStringtos;//服务类型8字节
publicShorttotalLen;//总长度2字节
publicShortidentification;//用于柱状数据包的标识符2字节
publicShortflags_fOffset;//控制表示+数据偏移2字节
publicStringtimeToLive;//生命周期1字节
publicstaticStringprotocol;//协议类型1字节
privateshortheaderChc;//头校验码2字节
publicstaticStringsource_address;//原地址4字节
publicstaticStringdes_address;//目的地址4字节
privateStringoptions_padding;//4字节、/根据version_ihl中的地位数,确定ip的位数
//tcp结构
publicstaticStringsource_port;//源端口2字节
publicstaticStringdes_port;//目的端口2字节
privateStringseq_number;//序号大小端原因,高低位4个8bit的存放顺序是反的,intel使用小端模式4字节
privateStringack_number;//确认号,大小端原因,高低位4个8bit的存放顺序是反的,intel使用小端模式4字节
privateStringinfo_ctrl;//DataOffset(4bits),Reserved(6bits),Controlbits(6bits),intel使用小端模式2字节
privateStringwindow;//窗口2字节
privateStringchecksum;//校验和2字节
privateStringurgent_pointer;//紧急指针2字节
//udp结构
publicStringusour_port;//源端口2字节
publicStringudes_port;//目的端口2字节
privateStringulength;//udp长度2字节
privateStringucrc;//udp校验码2字节
publicintgetTime_s(){
returntime_s;
}
publicvoidsetTime_s(inttime_s){
this.time_s=time_s;
}
publicintgetTime_ms(){
returntime_ms;
}
publicvoidsetTime_ms(inttime_ms){
this.time_ms=time_ms;
}
publicintgetpLength(){
returnpLength;
}
publicvoidsetpLength(intpLength){
this.pLength=pLength;
}
publicintgetLength(){
returnlength;
}
publicvoidsetLength(intlength){
this.length=length;
}
publicbyte[]getContent(){
returncontent;
}
publicvoidsetContent(byte[]content){
this.content=content;
}
publicStringgetiTai(){
returntai;
}
publicvoidsetiTai(Stringtai){
this.tai=tai;
}
publicStringgetVersion_ihl(){
returnversion_ihl;
}
publicvoidsetVersion_ihl(Stringversion_ihl){
this.version_ihl=version_ihl;
}
publicStringgetTos(){
returntos;
}
publicvoidsetTos(Stringtos){
this.tos=tos;
}
publicshortgetTotalLen(){
returntotalLen;
}
publicvoidsetTotalLen(shorttotalLen){
this.totalLen=totalLen;
}
publicshortgetIdentification(){
returnidentification;
}
publicvoidsetIdentification(shortidentification){
this.identification=identification;
}
publicshortgetFlags_fOffset(){
returnflags_fOffset;
}
publicvoidsetFlags_fOffset(shortflags_fOffset){
this.flags_fOffset=flags_fOffset;
}
publicStringgetTimeToLive(){
returntimeToLive;
}
publicvoidsetTimeToLive(StringtimeToLive){
this.timeToLive=timeToLive;
}
publicStringgetProtocol(){
returnprotocol;
}
publicvoidsetProtocol(Stringprotocol){
this.protocol=protocol;
}
publicshortgetHeaderChc(){
returnheaderChc;
}
publicvoidsetHeaderChc(shortheaderChc){
this.headerChc=headerChc;
}
publicStringgetSource_address(){
returnsource_address;
}
publicvoidsetSource_address(Stringsource_address){
this.source_address=source_address;
}
publicStringgetDes_adress(){
returndes_address;
}
publicvoidsetDes_adress(Stringdes_address){
this.des_address=des_address;
}
publicStringgetOptions_padding(){
returnoptions_padding;
}
publicvoidsetOptions_padding(Stringoptions_padding){
this.options_padding=options_padding;
}
publicStringgetSource_port(){
returnsource_port;
}
publicvoidsetSource_port(Stringsource_port){
this.source_port=source_port;
}
publicStringgetDes_port(){
returndes_port;
}
publicvoidsetDes_port(Stringdes_port){
this.des_port=des_port;
}
publicStringgetSeq_number(){
returnseq_number;
}
publicvoidsetSeq_number(Stringseq_number){
this.seq_number=seq_number;
}
publicStringgetAck_number(){
returnack_number;
}
publicvoidsetAck_number(Stringack_number){
this.ack_number=ack_number;
}
publicStringgetInfo_ctrl(){
returninfo_ctrl;
}
publicvoidsetInfo_ctrl(Stringinfo_ctrl){
this.info_ctrl=info_ctrl;
}
publicStringgetWindow(){
returnwindow;
}
publicvoidsetWindow(Stringwindow){
this.window=window;
}
publicStringgetChecksum(){
returnchecksum;
}
publicvoidsetChecksum(Stringchecksum){
this.checksum=checksum;
}
publicStringgetUrgent_pointer(){
returnurgent_pointer;
}
publicvoidsetUrgent_pointer(Stringurgent_pointer){
this.urgent_pointer=urgent_pointer;
}
publicStringgetUsour_port(){
returnusour_port;
}
publicvoidsetUsour_port(Stringusour_port){
this.usour_port=usour_port;
}
publicStringgetUdes_port(){
returnusour_port;
}
publicvoidsetUdes_port(Stringudes_port){
this.udes_port=udes_port;
}
publicStringgetUlength(){
returnulength;
}
publicvoidsetUlength(Stringulength){
this.ulength=ulength;
}
publicStringgetUcrc(){
returnucrc;
}
publicvoidsetUcrc(Stringucrc){
this.ucrc=ucrc;
}
privateStringcontent2Str(byte[]content){
char[]chars=newchar[content.length];
for(inti=0;i chars[i]=(char)content[i]; } returnString.valueOf(chars); } publicvoidttString()throwsIOException{ System.out.println("time_s="+this.time_s); System.out.println("\ntime_ms="+this.time_ms); System.out.println("\npLength="+this.pLength); System.out.println("\nlength="+this.length); System.out.println("\ncontent="+content2Str(this.content)); System.out.println("\niTai="+this.tai); System.out.println("\nversion_ihl="+this.version_ihl); System.out.println("\ntos="+this.tos); System.out.println("\ntotal_length="+this.totalLen); System.out.println("\nidentification="+this.identification); System.out.println("\nflags_offset="+this.flags_fOffset); System.out.println("\ntimeToLive="+this.timeToLive); System.out.println("\nprptocol="+this.protocol); System.out.println("\nHeaderChecksum="+this.headerChc); System.out.println("\nsource_address="+this.source_address); System.out.println("\nDes_address="+this.des_address); System.out.println("\noption_padding="+this.options_padding); System.out.println("\nsour_port="+this.source_port); System.out.println("\ndes_port="+this.des_port); System.out.println("\nseq_numer="+this.seq_number); System.out.println("\nack_number="+this.ack_number); System.out.println("\ninfo_ctrl="+this.info_ctrl); System.out.println("\nwindow="+this.window); System.out.println("\nchecksum="+this.checksum); System.out.println("\nurgent_pointer="+this.urgent_pointer); System.out.println("\n##########################"); } publicStringooString(){ StringBuilders=newStringBuilder(); s.append("time_s=").append(this.time_s); s.append("\ntime_ms=").append(this.time_ms); s.append("\npLength=").append(this.pLength); s.append("\nlength=").append(this.length); s.append("\ncontent=").append(this.content); s.append("\niTai=").append(this.tai); s.append("\nversion_ihl=").append((this.tai)); System.out.println("\nversion_ihl="+this.version_ihl); System.out.println("\ntos="+this.tos); System.out.println("\ntotal_length="+this.totalLen); System.out.println("\nidentification="+this.identification); System.out.println("\nflags_offset="+this.flags_fOffset); System.out.println("\ntimeToLive="+this.timeToLive); System.out.println("\nprptocol="+this.protocol); System.out.println("\nHeaderChecksum="+this.headerChc); System.out.println("\nsource_address="+this.source_address); System.out.println("\nDes_address="+this.des_address); System.out.println("\noption_padding="+this.options_pad
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- pcap 解析