首页 > 解决方案 > 嗅探局域网:Jpcap java 程序似乎只捕获我的数据包

问题描述

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

就像我说的,我查看了代码并选择了我的 wifi 接口。该程序正在捕获数据包,我将所有源 IP 地址放在一个文本文件中以运行一些测试。我还创建了一个哈希图,其中包含我在执行 arp -a 时找到的 IP 地址。根据我在网上阅读的内容,此命令向您显示网络中的 IP 地址。我创建了一个设置为 false 的布尔值,然后我继续运行一个循环遍历文本文件并查看 IP 地址是否在 hashMap 中:如果其中一个地址出现在哈希图中,布尔值将更改为 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();
        }
      }

谁能帮我弄清楚为什么它不起作用?非常感谢你的帮助

标签: javanetworkinglocalsniffingjpcap

解决方案


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


推荐阅读