0

pcap4j sendPacket

The target IP cannot capture the corresponding message.

    PcapHandle pcapHandle = Pcaps.openOffline("D:\\GTP.pcap");
    PcapNetworkInterface device = Pcaps.getDevByName("\\Device\\NPF_{32B17C2A-F521-4721-90CA-C57DF0024F01}");
    int snapshotLength = 65536;
    int readTimeout = 50;
    PcapHandle handle = device.openLive(snapshotLength, PcapNetworkInterface.PromiscuousMode.PROMISCUOUS, readTimeout);
    String str=null;
    while (true){
        Packet packet = pcapHandle.getNextPacket();
        if(packet==null){
            break;
        }
        EthernetPacket ethernetPacket = packet.get(EthernetPacket.class);
        EthernetPacket.EthernetHeader header = ethernetPacket.getHeader();
        GtpV1Packet gtpPacket = packet.get(GtpV1Packet.class);
        Packet innerPacket = gtpPacket.getPayload();
        byte[] rawData = innerPacket.getRawData();
        byte[] newRawData = Arrays.copyOfRange(rawData, 4, rawData.length);
        IpV4Packet newPacket = IpV4Packet.newPacket(newRawData, 0, newRawData.length);
        if (newPacket.contains(IpPacket.class)) {
            IpV4Packet ipPacket = newPacket.get(IpV4Packet.class);
            InetAddress src = ipPacket.getHeader().getSrcAddr();
            InetAddress dst = ipPacket.getHeader().getDstAddr();
            if(StringUtil.isEmpty(str)){
                str=src.getHostAddress();
            }
            IpV4Packet.Builder builder = ipPacket.getBuilder();
            Inet4Address srcAddr=null;
            Inet4Address dstAddr=null;
            if(src.getHostAddress().equals(str)){
                srcAddr=(Inet4Address) InetAddress.getLocalHost();
            }else{
                srcAddr=(Inet4Address) InetAddress.getByName(ip);
            }
            if(dst.getHostAddress().equals(str)){
                dstAddr=(Inet4Address)InetAddress.getLocalHost();
            }else {
                dstAddr=(Inet4Address) InetAddress.getByName(ip);
            }
            builder.srcAddr(srcAddr);
            builder.dstAddr(dstAddr);
            EthernetPacket.Builder eb = new EthernetPacket.Builder();
            eb.dstAddr(header.getDstAddr())
                    .srcAddr(header.getSrcAddr())
                    .type(EtherType.IPV4)
                    .payloadBuilder(builder)
                    .paddingAtBuild(true);
            EthernetPacket build = eb.build();
            handle.sendPacket(build);
        }
    }
Progman
  • 16,827
  • 6
  • 33
  • 48

0 Answers0