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

来源:互联网 发布:现代年轻人社交数据 编辑:程序博客网 时间:2024/05/22 06:22

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



package shuju;

  import java.io.*;

  import java.lang.Integer;

class shuju {

public static void main(String[] args){

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

try {

     DataInputStream instr=new DataInputStream(new BufferedInputStream(new FileInputStream(fileName)));

byte [] array=new  byte [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数据报");

    }

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

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

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

            for(int i=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(int i=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(int i=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(int i=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));

    

    

    }

    

    }

    else if(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));

    }

    else if(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");

}

}

 

 

 

 

private static String byte2hex(byte[] array,int x ,int y) {

String hs = ""

       String stmp = ""

       for (int n=x; n<y ; n++) { 

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

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

               hs = hs + "0" + stmp; 

           } else { 

               hs = hs + stmp; 

           } 

       } 

       return hs.toUpperCase(); 

   }  

 

 

 

public static String byte2hex(byte[] array) { 

       String hs = ""

       String stmp = ""

       for (int n = 0; n < array.length; n++) { 

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

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

               hs = hs + "0" + stmp; 

           } else { 

               hs = hs + stmp; 

           } 

       } 

       return hs.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

 

 

 

 

 

 

 

 

 

0 0
原创粉丝点击