• jpcap 分支tcpdump抓包文件遇到的问题以及解决情况


    实现功能:分析tcpdump抓包结果文件,获取出目的地址和源地址,查询ip的归属地

    public static List getpcapIp(String pcapFilePath) {
            List dstIpList= new ArrayList();
            List sourceIpList= new ArrayList();
            JSONObject lisJson = new JSONObject();
            try {
                // 打开pcap文件用于读取
                JpcapCaptor captor = JpcapCaptor.openFile(pcapFilePath);
                // 读取并处理数据包
                Packet packet;
                while ((packet = captor.getPacket()) != null && (null!=captor.getPacket()&&captor.getPacket().len>0)) {
    //                System.out.println("packet instanceof IPPacket: " + (packet instanceof IPPacket));
                    if (packet instanceof IPPacket ) {
                        IPPacket ipPacket = (IPPacket) packet;
                        String dstIp = ipPacket.dst_ip.getHostAddress();
                        String sourceIP = ipPacket.dst_ip.getHostAddress();
                        if (!dstIpList.contains(dstIp) && isValidIPV4ByValidator(dstIp)){
                            dstIpList.add(dstIp);
                        }
                        if (!sourceIP.contains(sourceIP) && isValidIPV4ByValidator(sourceIP)){
                            dstIpList.add(dstIp);
                        }
                       
                    }
                }
                // 关闭pcap文件
                captor.close();
            } catch (Throwable e) {
                e.printStackTrace();
                Log.info(e.getMessage());
            }
            lisJson.put("sourceIP", sourceIpList);
            lisJson.put("dstIP", dstIpList);
            Log.info("distIpList.size: " + dstIpList.size());
    //        Log.info("sourceIpList.size: " + sourceIpList.size());
            return dstIpList;
        }

    遇到的问题:

    1.用while ((packet = captor.getPacket()) != null)时,在windows64 本地编译和调试都没有问题,到cenots7上时一直在循环体不出来,死循环。

    产生原因:当captor.getPacket().len=0时也满足(packet = captor.getPacket()) != null,所以导致一直在while循环体重循环

    解决办法:加上条件(null!=captor.getPacket()&&captor.getPacket().len>0))进行过滤

    2.在centos7跑的时候一直提示JVM crash,执行一段时间后报错如下:

    #
    # A fatal error has been detected by the Java Runtime Environment:
    #
    #  SIGSEGV (0xb) at pc=0x00007fd2a312b603, pid=17034, tid=0x00007fd26f1f7700
    #
    # JRE version: Java(TM) SE Runtime Environment (8.0_181-b13) (build 1.8.0_181-b13)
    # Java VM: Java HotSpot(TM) 64-Bit Server VM (25.181-b13 mixed mode linux-amd64 compressed oops)
    # Problematic frame:
    # V  [libjvm.so+0x6f0603]  jni_GetStaticObjectField+0xc3
    #
    # Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again
    #
    # If you would like to submit a bug report, please visit:
    #   http://bugreport.java.com/bugreport/crash.jsp
    #

    ---------------  T H R E A D  ---------------

    Current thread (0x00007fd218018800):  JavaThread "http-nio-8070-exec-1" daemon [_thread_in_vm, id=17347, stack(0x00007fd26f0f7000,0x00007fd26f1f8000)]

    siginfo: si_signo: 11 (SIGSEGV), si_code: 1 (SEGV_MAPERR), si_addr: 0x0000000000000000

    Registers:
    RAX=0x00007fd2a3a06dfb, RBX=0x00007fd218018800, RCX=0x00007fd29c1cdfd0, RDX=0x00007fd218018ed8
    RSP=0x00007fd26f1f4050, RBP=0x00007fd26f1f40b0, RSI=0x00007fd218018800, RDI=0x00007fd218018800
    R8 =0x00007fd2a3a0b040, R9 =0x00007fd2a3a892cd, R10=0x732f746f7073746f, R11=0x0000000000000000
    R12=0x0000000000000000, R13=0x00007fd26f1f4050, R14=0x00007fd2a3a0fe00, R15=0x00007fd2a3a0b040
    RIP=0x00007fd2a312b603, EFLAGS=0x0000000000010246, CSGSFS=0x0000000000000033, ERR=0x0000000000000004

    解决方法:jpcap.jar和libjpcap.so版本要一致,更新版本后就不报此类错误了,可能之前的版本有bug导致,如果下载一定要配套下载

  • 相关阅读:
    从头造轮子:python3 asyncio之 sleep (4)
    【Redis】.net core Redis事件订阅与发布,基础篇
    Git相关操作
    Splunk HEC token 白名单设置-indexes
    Python爬取数据分析
    理解自动驾驶感知技术
    将颠覆你几十年认知的 6 个逆向思维
    Postman进阶功能
    CSS基础10-单行/多行文本溢出省略
    leetcode:剑指 Offer 17. 打印从1到最大的n位数(python3解法)
  • 原文地址:https://blog.csdn.net/tianshi1017/article/details/140386770