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);
}
}