2015-11-13 63 views
0

所以我有一个pcap文件,当我在wireshark中打开此文件时,我看到一些标记参数,其中一个是ssid,我想在屏幕上简单地打印出来。使用jnetpcap从pcap文件读取ssid

我也做了以下内容:

public class PacketHandler implements PcapPacketHandler<Object> { 
    @Override 
public void nextPacket(PcapPacket packet, Object unused) { 
    StringBuilder str = new StringBuilder(); 

    packet.getUTF8String(0, str, packet.getTotalSize()); 
    String rawStringData = str.toString(); 
    System.out.println(rawStringData); 

    String packetAsHex = packet.toHexdump(0, false, true, true); 

    System.out.println(packetAsHex); 
} 

} 

我看到SSID为一个字符串,但它看起来像是没有被正确解码,我非常希望能够获取所有这些标签的参数我请参阅wireshark。

唉我不知道如何做到这一点,是否有人能够把我放在正确的轨道上?

回答

0

什么解码不正确?你期望什么?你看到了什么? 参数不以任何方式“标记”。他们只有一些字节专用于他们。你只需要知道去哪里找。

让我告诉你一个我的旧jnetpcap代码的例子。现在,既然您熟悉jnetpcap,并且我无法真正理解问题所在,我只是向您展示代码的一小部分,并猜测您会得到它的诀窍。

以下代码是我对Beacon Frames的解析。 data是从文件中提取的数据。

 int packet_size = packet.size(); 
     JBuffer packet_buf = packet; 

     byte[] data = packet_buf.getByteArray(0, packet_size); 
     int[] data_int = new int[max_byte_read]; 

     for (int k = 0; k<max_byte_read; k++) { 
      data_int[k] = data[k]&0xFF; 
     } 

     byte[] frame_control = new byte[2]; 
     byte[] duration = new byte[2]; 
     byte[] dest_ip = new byte[6]; 
     byte[] src_ip = new byte[6]; 
     byte[] bss_id = new byte[6]; 
     byte[] seq_ctrl = new byte[2]; 
     byte[] time_stamp = new byte[8]; 
     byte[] beacon_interval = new byte[2]; 
     byte[] capability_info = new byte[2]; 
     byte[] tag_nr = new byte[1]; 
     byte[] tag_len = new byte[1]; 

     if (data_int[0]==0x80) { 
      // It's a beacon 
      System.out.printf("It's a beacon!\n"); 
      frame_control = Arrays.copyOfRange(data, 0, 2); 
      duration = Arrays.copyOfRange(data, 2, 4); 
      dest_ip = Arrays.copyOfRange(data, 4, 10); 
      src_ip = Arrays.copyOfRange(data, 10, 16); 
      bss_id = Arrays.copyOfRange(data, 16, 22); 
      seq_ctrl = Arrays.copyOfRange(data, 22, 24); 
      time_stamp = Arrays.copyOfRange(data, 24, 32); 
      beacon_interval = Arrays.copyOfRange(data, 32, 34); 
      capability_info = Arrays.copyOfRange(data, 34, 36); 
      tag_nr = Arrays.copyOfRange(data, 36, 37); 
      tag_len = Arrays.copyOfRange(data, 37, 38); 

      int ss_id_len = tag_len[0]; 

      byte[] ss_id = new byte[ss_id_len]; 

      ss_id = Arrays.copyOfRange(data, 38, 38+ss_id_len); 

      System.out.printf("SSID: "); 
      for (byte b : ss_id) { 
       int c = b&0xFF; 
       System.out.printf("%s", (char) c);  
      } 
      System.out.println(""); 
     } 
     else { 
      System.out.println("Not a beacon unfortunately"); 
     } 

如果这无助于你,我可以尝试发布一个完整的例子。但是既然这可能是过分的,我现在就坚持下去。