如何使用 jnetpcap 从 ICMP 数据包中获取 IP 地址
How to get IP address from ICMP packets using jnetpcap
我正在使用 jnetpcap 分析 pcap 文件。遇到IP就知道怎么获取地址了 header
if(packet.hasHeader(ip)&&packet.hasHeader(tcp)&&tcp.flags_SYN())
{
sIP = packet.getHeader(ip).source();
sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);
但是当我有 ICMP header 时,我不知道如何获取地址。我试过这个
else if(packet.hasHeader(icmp))
{
sIP=packet.getHeader(icmp).source();
sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);
但显然,它是无效的。有任何想法吗?提前谢谢你
更新:我用过
if(packet.hasHeader(ip, 1)) {
sIP=ip.source();
sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);}
但是我得到一个错误:
外交官的线程 "main" java.lang.NullPointerException 中出现异常。Ex2.main(Ex2.java:83)
第 83 行包含命令:
sIP=packet.getHeader(ip,1).source();
我尝试采纳 Mark 的建议,并添加了
System.out.println(packet.getState().toDebugString());
我意识到程序卡在了第三个数据包上,所以我尝试获取第四个数据包中的内容。这是我得到的:
JMemory: JMemory@4b8838class org.jnetpcap.packet.JPacket$State: size=240 bytes
JMemory: owner=packet.JScanner.class(size=136528/offset=35128)
JPacket.State#004: sizeof(packet_state_t)=120
JPacket.State#004: sizeof(header_t)=40 and *3=120
JPacket.State#004: pkt_header_map=0x16
JPacket.State#004: pkt_flags=0x0
JPacket.State#004: pkt_header_count=3
JPacket.State#004: pkt_wirelen=62
JPacket.State#004 : [ Protocol(ID/Flag) | Start | Prefix | Header | Gap | Payload | Postfix ]
JPacket.State#004[0]: [ ETHERNET( 1/0800) | 0 | 0 | 14 | 0 | 48 | 0 ]
JPacket.State#004[1]: [ IP4( 2/0800) | 14 | 0 | 20 | 0 | 28 | 0 ]
JPacket.State#004[2]: [ TCP( 4/0800) | 34 | 0 | 28 | 0 | 0 | 0 ]
它对你说了什么吗?
您好,正确的用法是使用 packet.hasHeader(ip, 1)。这将获得 IPv4 的第二个实例并将其与数据包绑定。另请注意,您对 getHeader 的使用是多余的。如果 header 存在,hasHeader 会自动将 header 绑定到数据包。
即
if(packet.hasHeader(ip, 1)) {
sIP=ip.source();
sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);
}
为了帮助可视化和调试目的并准确查看哪些 header 已被剖析并存储在数据包状态 table 使用以下代码片段转储内容:
System.out.println(packet.getState().toDebugString());
希望对您有所帮助。
您仍在使用不存在的 getHeader 实例 1(即在第 4 个数据包中)。同样,我建议您改用 hasHeader。结果相同,但当 header 实例不存在时不会抛出空异常。如果您还需要 ICMP header 然后将它们组合在一个 if() 语句中:
if(packet.hasHeader(ip, 1) && packet.hasHeader(icmp)) {
sIP = ip.source();
}
我正在使用 jnetpcap 分析 pcap 文件。遇到IP就知道怎么获取地址了 header
if(packet.hasHeader(ip)&&packet.hasHeader(tcp)&&tcp.flags_SYN())
{
sIP = packet.getHeader(ip).source();
sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);
但是当我有 ICMP header 时,我不知道如何获取地址。我试过这个
else if(packet.hasHeader(icmp))
{
sIP=packet.getHeader(icmp).source();
sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);
但显然,它是无效的。有任何想法吗?提前谢谢你
更新:我用过
if(packet.hasHeader(ip, 1)) {
sIP=ip.source();
sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);}
但是我得到一个错误:
外交官的线程 "main" java.lang.NullPointerException 中出现异常。Ex2.main(Ex2.java:83)
第 83 行包含命令:
sIP=packet.getHeader(ip,1).source();
我尝试采纳 Mark 的建议,并添加了
System.out.println(packet.getState().toDebugString());
我意识到程序卡在了第三个数据包上,所以我尝试获取第四个数据包中的内容。这是我得到的:
JMemory: JMemory@4b8838class org.jnetpcap.packet.JPacket$State: size=240 bytes
JMemory: owner=packet.JScanner.class(size=136528/offset=35128)
JPacket.State#004: sizeof(packet_state_t)=120
JPacket.State#004: sizeof(header_t)=40 and *3=120
JPacket.State#004: pkt_header_map=0x16
JPacket.State#004: pkt_flags=0x0
JPacket.State#004: pkt_header_count=3
JPacket.State#004: pkt_wirelen=62
JPacket.State#004 : [ Protocol(ID/Flag) | Start | Prefix | Header | Gap | Payload | Postfix ]
JPacket.State#004[0]: [ ETHERNET( 1/0800) | 0 | 0 | 14 | 0 | 48 | 0 ]
JPacket.State#004[1]: [ IP4( 2/0800) | 14 | 0 | 20 | 0 | 28 | 0 ]
JPacket.State#004[2]: [ TCP( 4/0800) | 34 | 0 | 28 | 0 | 0 | 0 ]
它对你说了什么吗?
您好,正确的用法是使用 packet.hasHeader(ip, 1)。这将获得 IPv4 的第二个实例并将其与数据包绑定。另请注意,您对 getHeader 的使用是多余的。如果 header 存在,hasHeader 会自动将 header 绑定到数据包。
即
if(packet.hasHeader(ip, 1)) {
sIP=ip.source();
sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);
}
为了帮助可视化和调试目的并准确查看哪些 header 已被剖析并存储在数据包状态 table 使用以下代码片段转储内容:
System.out.println(packet.getState().toDebugString());
希望对您有所帮助。
您仍在使用不存在的 getHeader 实例 1(即在第 4 个数据包中)。同样,我建议您改用 hasHeader。结果相同,但当 header 实例不存在时不会抛出空异常。如果您还需要 ICMP header 然后将它们组合在一个 if() 语句中:
if(packet.hasHeader(ip, 1) && packet.hasHeader(icmp)) {
sIP = ip.source();
}