java 二进制报文头_用Java读二进制报文、做报文分析软件

本文展示了如何使用Java读取二进制报文并进行分析,包括以太网帧、IP数据报、UDP和TCP报文的详细字段解析。
摘要由CSDN通过智能技术生成

用Java读二进制报文、做报文分析软件.分析抓包中的各个字段的含义。

packageshuju;

importjava.io.*;

importjava.lang.Integer;

classshuju {

publicstaticvoidmain(String[] args){

String fileName="D:\\报文1.bin";

try{

DataInputStream instr=newDataInputStream(newBufferedInputStream(newFileInputStream(fileName)));

byte[] array=newbyte[instr.available()];

instr.read(array);

instr.close();

System.out.print(byte2hex(array));

System.out.println();

System.out.println();

System.out.println();

System.out.println("以太网帧分析");

System.out.print("目标硬件地址:");

System.out.println(byte2hex(array,0,6));

System.out.print("源硬件地址:");

System.out.println(byte2hex(array,6,12));

if(byte2hex(array,12,14).equals("0800"))

{

System.out.println("帧类型是IP数据报");

}

elseif(byte2hex(array,12,14).equals("0806")){

System.out.println("帧类型是ARP数据报");

System.out.print("源IP地址:");

for(inti=28;i<31;i++){

System.out.print(Integer.parseInt(byte2hex(array,i,i+1),16));

System.out.print(":");

}

System.out.print(Integer.parseInt(byte2hex(array,31,32),16));

System.out.println();

System.out.print("目的IP地址:");

for(inti=38;i<41;i++){

System.out.print(Integer.parseInt(byte2hex(array,i,i+1),16));

System.out.print(":");

}

System.out.print(Integer.parseInt(byte2hex(array,41,42),16));

}

else{

System.out.println("帧类型是的代码是"+byte2hex(array,12,14));

}

System.out.println("IP数据报分析");

System.out.println("version4");

System.out.println("总长度: "+Integer.parseInt(byte2hex(array,17,18),16));

System.out.println("生存时间:"+Integer.parseInt(byte2hex(array,23,24),16));

System.out.print("源IP地址:");

for(inti=26;i<29;i++){

System.out.print(Integer.parseInt(byte2hex(array,i,i+1),16));

System.out.print(":");

}

System.out.print(Integer.parseInt(byte2hex(array,29,30),16));

System.out.println();

System.out.print("目的IP地址:");

for(inti=30;i<33;i++){

System.out.print(Integer.parseInt(byte2hex(array,i,i+1),16));

System.out.print(":");

}

System.out.print(Integer.parseInt(byte2hex(array,33,34),16));

System.out.println();

System.out.println();

System.out.println();

if(byte2hex(array,23,24).equals("11"))

{

System.out.println("此报文是UDP报文");

System.out.print("源端口号:");

System.out.println(Integer.parseInt(byte2hex(array,34,36),16));

System.out.print("目的端口号:");

System.out.println(Integer.parseInt(byte2hex(array,36,38),16));

System.out.print("确认号:");

System.out.println(byte2hex(array,40,42));

System.out.print("数据长度:");

System.out.print(Integer.parseInt(byte2hex(array,38,40),16));

if(Integer.parseInt(byte2hex(array,36,38),16)==53){

System.out.println("封装的是DNS报文");

System.out.println("封装的长度:");

System.out.println(Integer.parseInt(byte2hex(array,38,40),16));

}

}

elseif(byte2hex(array,23,24).equals("06")){

System.out.println("此报文是TCP报文");

System.out.print("源端口号:");

System.out.println(Integer.parseInt(byte2hex(array,34,36),16));

System.out.print("目的端口号:");

System.out.println(Integer.parseInt(byte2hex(array,36,38),16));

System.out.print("确认号:");

System.out.println(byte2hex(array,40,42));

System.out.print("窗口大小:");

System.out.println(Integer.parseInt(byte2hex(array,48,50),16));

System.out.print("检验和:");

System.out.println(Integer.parseInt(byte2hex(array,50,52),16));

System.out.print("紧急指针:");

System.out.println(Integer.parseInt(byte2hex(array,52,54),16));

}

elseif(byte2hex(array,23,24).equals("01")){

System.out.println("此报文是ICMP报文");

System.out.println("校验和:");

}

else{

System.out.println("此报文协议号为:"+byte2hex(array,23,24));

}

}

catch(IOException eof){

System.out.println("Problem reading input");

}

}

privatestaticString byte2hex(byte[] array,intx ,inty) {

String hs ="";

String stmp ="";

for(intn=x; n

stmp = (java.lang.Integer.toHexString(array[n] & 0XFF));

if(stmp.length() == 1) {

hs = hs +"0"+ stmp;

}else{

hs = hs + stmp;

}

}

returnhs.toUpperCase();

}

publicstaticString byte2hex(byte[] array) {

String hs ="";

String stmp ="";

for(intn = 0; n 

stmp = (java.lang.Integer.toHexString(array[n] & 0XFF));

if(stmp.length() == 1) {

hs = hs +"0"+ stmp;

}else{

hs = hs + stmp;

}

}

returnhs.toUpperCase();

}

}

报文一:

以太网帧分析

目标硬件地址:0026820FD1AF

源硬件地址:3822D69DC48A

帧类型是IP数据报

IP数据报分析

version4

总长度: 190

生存时间:17

源IP地址:192:168:4:1

目的IP地址:10:116:181:0

此报文是UDP报文

源端口号:53

目的端口号:49626

确认号:1ECA

数据长度:170

报文二:

以太网帧分析

目标硬件地址:3822D69DC48A

源硬件地址:0026820FD1AF

帧类型是IP数据报

IP数据报分析

version4

总长度: 60

生存时间:1

源IP地址:10:116:181:0

目的IP地址:211:138:121:109

此报文是ICMP报文

校验和:

19480

报文三:

以太网帧分析

目标硬件地址:FFFFFFFFFFFF

源硬件地址:6CC26B091170

帧类型是ARP数据报

源IP地址:10:116:177:133

目的IP地址:10:116:0:254IP数据报分析

version4

总长度: 0

生存时间:194

源IP地址:17:112:10:116

目的IP地址:177:133:0:0

此报文协议号为:C2

报文四:

以太网帧分析

目标硬件地址:0026820FD1AF

源硬件地址:3822D69DC48A

帧类型是IP数据报

IP数据报分析

version4

总长度: 52

生存时间:6

源IP地址:112:25:24:135

目的IP地址:10:116:181:0

此报文是TCP报文

源端口号:80

目的端口号:47548

确认号:17D4

窗口大小:5840

检验和:50627

紧急指针:0

报文五:

以太网帧分析

目标硬件地址:3822D69DC48A

源硬件地址:0026820FD1AF

帧类型是IP数据报

IP数据报分析

version4

总长度: 47

生存时间:6

源IP地址:10:116:181:0

目的IP地址:112:25:24:135

此报文是TCP报文

源端口号:47548

目的端口号:80

确认号:DC57

窗口大小:4380

检验和:59903

紧急指针:0

Python可以通过多种方式解析二进制报文协议。下面我将介绍使用Python解析二进制报文协议的一般步骤。 首先,我们需要了解二进制报文协议的结构和字段定义。二进制报文通常由多个字段组成,每个字段可能有不同的数据类型和大小。我们需要根据协议规范,按照字段的顺序和大小将二进制报文解析为可的数据。 其次,我们可以使用Python内置的struct模块来处理二进制数据。struct模块提供了一组函数,用于将二进制数据解析为Python数据类型,并支持不同的字节顺序和数据对齐方式。 还有另一种流行的方法是使用第三方库,如construct或bitstring。这些库提供了更便捷的方式来定义报文结构,并且支持更丰富的数据类型和字段处理选项。 在解析报文时,我们需要按照字段的顺序逐个解析。可以使用字符串切片、struct.unpack或第三方库提供的相应函数来解析字段的二进制数据。解析后的数据可以保存在Python的变量中,以便后续处理或展示。 最后,我们需要根据解析后的数据,根据协议规范进一步处理。这可能包括数据转换、校验和错误处理等。根据具体需求,我们可以使用Python提供的数据处理和计算库来进行进一步的处理。 总结起来,使用Python解析二进制报文协议的一般步骤包括:了解协议结构和字段定义、选择合适的解析方式,按字段顺序逐个解析二进制数据,处理解析后的数据,并根据协议规范进行进一步的处理。以上是一个简单的解析二进制报文协议的示例,具体的解析过程可能因协议的复杂性而有所差异。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值