嗅探局域网:Jpcap Java程序似乎只能捕获我的数据包

时间:2019-06-12 14:47:16

标签: java networking local sniffing jpcap

我必须创建一个嗅探学校本地网络的程序。我选择使用Java,发现可以使用jpcap捕获数据包。 因此,我想遵循jpcap的github中提供的示例之一,看来我只能找到自己的数据包。

就像我说的那样,我已经看过代码并选择了我的wifi接口。该程序正在捕获数据包,我将所有源IP地址都放在一个文本文件中以运行一些测试。我还创建了一个哈希映射,该哈希映射是我执行arp -a时找到的IP地址的。从我在线阅读的内容来看,该命令向您显示了网络中的IP地址。我创建了一个布尔值设置为false,然后继续运行遍历文本文件的循环,并查看该IP地址是否在hashMap中:if地址之一出现在哈希图中,布尔值将更改为true,这意味着我设法捕获了一些东西。 运行测试后,布尔值错误。

这是示例代码

   ``public class PacketCaptor {
        private static final int INFINITE = -1;
        private static final int PACKET_COUNT = INFINITE; 
      /*
          private static final String HOST = "203.239.110.20";
          private static final String FILTER = 
          "host " + HOST + " and proto TCP and port 23";
      */

      private static final String FILTER = 
        // "port 23";
        "";

      public static void main(String[] args) {

        try {
          if(args.length == 1){
              PacketCaptor sniffer = new PacketCaptor(args[0]);
          } else {
        System.out.println("Usage: java Sniffer [device name]");
        System.out.println("Available network devices on your machine:");
        String[] devs = PacketCapture.lookupDevices();

        for(int i = 0; i < devs.length ; i++)
          System.out.println("\t" + devs[i]);
          }
        } catch(Exception e) {
          e.printStackTrace();
          }

      }

      public PacketCaptor(String device) throws Exception {
        // Initialize jpcap
        PacketCapture pcap = new PacketCapture();
        System.out.println("Using device '" + device + "'");
        pcap.open(device, true);
        //pcap.setFilter(FILTER, true);
        pcap.addPacketListener(new PacketHandler());

        System.out.println("Capturing packets...");
        pcap.capture(PACKET_COUNT);
      }
    }


    class PacketHandler implements PacketListener 
    {
        WritingClass writing = new WritingClass();

      public void packetArrived(Packet packet) {
        try {
          // only handle TCP packets

          if(packet instanceof TCPPacket) {
        TCPPacket tcpPacket = (TCPPacket)packet;
        byte[] data = tcpPacket.getTCPData();

        String srcHost = tcpPacket.getSourceAddress();
        String dstHost = tcpPacket.getDestinationAddress();
        String isoData = new String(data, "ISO-8859-1");

        System.out.println(srcHost+" -> " + dstHost + ": " + isoData);
        String datas = srcHost+"|"+dstHost+"|";

        writing.write(datas, this.writing.getFileName());

          }
        } catch( Exception e ) {
          e.printStackTrace();
        }
      }

有人可以帮我弄清楚为什么它不起作用吗? 非常感谢您的帮助

1 个答案:

答案 0 :(得分:0)

之所以无法捕获更多数据包,是因为您需要处于混杂模式或原始模式的接口,我建议您使用适当的嗅探器(例如Wireshark)来检查是否有其他未发送给您的数据包可以被捕获。如果不是,则意味着您需要应用mitm方法,因为您处于通勤网络中。为了便于使用,wifi上的代码应该足以在监控模式下用作接口(请检查aircrack-ng套件)。 在基于GNU / Linux的Debian系统中,可以使用命令iw dev wlan0 interface add mon0 type monitor(来自无线工具包)