简单网络嗅探器编写--------java

功能设计:

在设计之初,本设计被期望实现下面功能:

①有一个对用户友好的操作界面,使用户对软件上手快和操作简单;

②能对网卡进行选择,选择用户自己需要进行监听抓包的网卡;

③能够侦听所有进出本主机的数据包,完整显示数据包网络层和传输层的头信息。比如,对IP头而言,需要显示版本、头长度、服务类型、数据包长度、标识、DF/MF标志、段内偏移、生存期、协议类型、源目的IP地址、选项内容,并且要求显示数据的实际含义;

④能够设置过滤规则,比如说侦听来源于指定IP地址的数据;

⑤显示接受到的TCP数据包的全部实际内容,并且要考虑一个TCP包划分为多个IP包传输的情况;

⑥功能验证手段,比如说,在运行网络嗅探器的同时,执行标准的Ping、Telnet和浏览网页等操作,检查网络嗅探器能否返回预期的结果。

具体实现:

1.选择网卡进行抓包:

(1)通过JpcapCaptor类的getDevices()函数获取主机的网卡信息:

public static NetworkInterface[] getDevices() {

           NetworkInterface[] devices = JpcapCaptor.getDeviceList();

               return devices;

}

(2)将每个网卡添加到“网卡”菜单的菜单项中:

menuFile1 = new JMenu(" 网卡  ");

               NetworkInterface[] devices = new NetworkCard().getDevices();

               item = new JMenuItem[devices.length];

               for (int i = 0; i < devices.length; i++) {

                      item[i] = new JMenuItem(i + ": " + devices[i].name + "("

                                     + devices[i].description  + ")");

                      menuFile1.add(item[i]);

(3)对每个菜单项添加指定的动作侦听器,进行监听,当用户点击此处时将该网卡设为抓包网卡,并打开线程,使用JpcapCaptor.openDevice()打开网络接口,用captor.getPacket()进行抓包:

①添加动作侦听器:

item[i].addActionListener(

                      new CardActionListener(devices[i]));

②动作响应:

public void actionPerformed(ActionEvent e) {

       allpackets.setDevice(device);

       allpackets.setFilter("");

       Thread myThread = new Thread(allpackets);

       myThread.start();   //开启抓包线程

}

③开始抓包:

Packet packet;

try {

       JpcapCaptor captor = JpcapCaptor.openDevice(device, 65535,true, 20);

       //System.out.println(device.name);

       while(!this.flag){

               long startTime = System.currentTimeMillis();

               while (startTime + 600 >= System.currentTimeMillis()) {

                      //captor.setFilter(FilterMess, true);

                      packet = captor.getPacket();

2.对捕获包进行分析

(1)分析:通过调用jpcap库中相应API对捕获的包进行分析,如:IPanalyze()、ICMPanalyze()等,并将分析的结果按一定格式进行封装。

(2)简要信息显示:将捕获的包添加到packetlist中,通过showTable()按一定格式显示出来。

public static void showTable(Packet packet){

String[] rowData = getObj(packet);

tablemodel.addRow(rowData);

}

(3)详细信息显示:该包分析的结果按一定格式显示出来,如:分为IP头部分、上层协议部分等。

(4)保存至本地:添加动作侦听器,监听“保存到本地”按钮。当用户点击此处时,调用FileOutputStream的API将文件保存至D盘。

save.addActionListener( 

                                     new ActionListener(){ 

                                            public void actionPerformed(ActionEvent e3) { 

                                                   String text = info.getText();

                                                   int name = (int)System.currentTimeMillis();

                                                   try { 

                                                          FileOutputStream fos = new FileOutputStream("d://"+name+".txt");  

                                                          fos.write(text.getBytes()); 

                                                          fos.close(); 

                                                   } catch (Exception e) {  

                                                          e.printStackTrace(); 

                                                   }

                                            } 

                                     });

3.统计数量与暂停抓包

(1)数量统计:对包进行过滤时,每次有一个包符合过滤规则,就让count+1,然后用text.setText(String.valueOf(allpackets.count))把它显示到相应的按钮上。

count = 0;

packetlist.clear();

for(Packet p : bak) {

       if(TestFilter(p)) {

               packetlist.add(p);

               showTable(p);

               count++;

       }

 

if(packet!=null&&TestFilter(packet)){

                             count++;

//                           System.out.println(packet);

                             packetlist.add(packet);

                             bak.add(packet);

                             showTable(packet);

                      }

(2)暂停抓包:设置一个动作侦听器,当动作发生时,将标记值flag的值设置为true,使得抓包的循环结束,从而起到暂停抓包的作用。

endButton = new JButton("结束");

endButton.addActionListener(

               new ActionListener() {

                      @Override

                      public void actionPerformed(ActionEvent e) {

                             allpackets.setFlag(true);

                      }

               }

               );

4.对捕获的包进行过滤

(1)设置相应的过滤按钮,如协议(tcp、udp、icmp)、源IP、目的ip等,并设置相应的动作侦听器。

sipButton = new JButton(" 源IP ");

sipButton.addActionListener( 

               new ActionListener(){ 

(2)当动作发生时,将过滤的值设置到PacketCapture类的allpackets对象相应的值上,并清除当前显示的值。

public void actionPerformed(ActionEvent e) { 

       String fsip = JOptionPane.showInputDialog("请输入源IP,以筛选数据包:"); 

       allpackets.setFilter("sip "+fsip);

       while(tableModel.getRowCount()>0){

               tableModel.removeRow(tableModel.getRowCount()-1);

       }

       allpackets.clearpackets();

}

(3)由于抓包时有进行备份,所以清除packetlist的数据时并不会导致原有的数据丢失;接着将备份列表bak与过滤则进行对比,如果符合规则,则将其添加到packetlist,并将其显示出来。

public void clearpackets(){

       count = 0;

       packetlist.clear();

       for(Packet p : bak) {

               if(TestFilter(p)) {

                      packetlist.add(p);

                      showTable(p);

                      count++;

               }

       }

}

(4)过滤规则:通过设置的过滤值,让过滤值与packet(捕获的包)相应的值进行对比,如果相等,则符合规则。

public static boolean TestFilter(Packet packet){

       if(FilterMess.contains("sip")){

               String sip = FilterMess.substring(4, FilterMess.length());

               if(new PacketAnalyze(packet).packetClass().get("源IP").equals(sip)){

                      return true;

               }

       }else if(FilterMess.contains("dip")){

               String dip = FilterMess.substring(4, FilterMess.length());

               if(new PacketAnalyze(packet).packetClass().get("目的IP").equals(dip)){

                      return true;

               }

       }else if(FilterMess.contains("ICMP")){

               if(new PacketAnalyze(packet).packetClass().get("协议").equals("ICMP")){

                      return true;

               }

       }

       else if(FilterMess.contains("UDP")){

               if(new PacketAnalyze(packet).packetClass().get("协议").equals("UDP")){

                      return true;

               }

       }else if(FilterMess.contains("TCP")){

               if(new PacketAnalyze(packet).packetClass().get("协议").equals("TCP")){

                      return true;

               }

       }else if(FilterMess.contains("keyword")){

               String keyword = FilterMess.substring(8, FilterMess.length());

               if(new PacketAnalyze(packet).packetClass().get("数据").contains(keyword)){

                      return true;

               }

       }else if(FilterMess.equals("")){

               return true;

       }

       return false;

}

具体代码:https://download.csdn.net/download/weixin_40789841/12116012

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章