簡單網絡嗅探器編寫--------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

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