数据包嗅探jpcap

时间:2013-04-25 05:25:26

标签: java libpcap tcpdump packet-sniffers jpcap

我在java中借助jpcap库在以太网(eth0)上嗅探数据包...所以,在我的项目中我有一个JpcapCaptor ......

    //Open an interface with openDevice(NetworkInterface intrface, int snaplen, boolean promics, int to_ms)
        JpcapCaptor captor=JpcapCaptor.openDevice(devices[index], 65535, false, 20);
        captor.setFilter("icmp", true);
        captor.loopPacket(-1, new PacketPrinter()); 

然后我有Packet打印机打印出一组嗅探包...

    public class PacketPrinter implements PacketReceiver {
@Override
public void receivePacket(Packet packet) {
    InputStream is = new ByteArrayInputStream(packet.data);
    try {
        String sstr = IOUtils.toString(is, "UTF-8");
        System.out.println("STRING " + sstr);
    } catch (IOException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    }
       String ss;
    try {
        ss = new String(packet.data, "UTF-8");
        System.out.println("STRING " + ss);
    } catch (UnsupportedEncodingException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } 
} 

但是有一个问题...... packet.data 是一个byte [] ...并且控制台将其打印为

    STRING W�xQ��       !"#$%&'()*+,-./01234567
    STRING W�xQ��       !"#$%&'()*+,-./01234567
    STRING W�xQ��       !"#$%&'()*+,-./01234567 

据我所知,这是因为编码问题???决定这个问题的解决方案是什么?

1 个答案:

答案 0 :(得分:1)

  

据我所知,这是因为编码问题?

这可能是正确的。也可能是你试图变成字符串的东西根本不是文本。实际上,如果这是一个你已经嗅过的原始网络数据包,那么保证一些数据包(IP / ICMP数据包标头)将不会是文本。

  

这个问题的解决方案是什么?

解决方案是了解您正在尝试解码的内容以及是否适当对其进行解码,就好像它是编码文本一样。如果没有,您需要以不同方式解码/显示它...取决于相关RFC对您尝试显示的数据包的说明。