【问题标题】:How to get IP address from ICMP packets using jnetpcap如何使用 jnetpcap 从 ICMP 数据包中获取 IP 地址
【发布时间】:2017-06-03 08:42:22
【问题描述】:

我正在使用 jnetpcap 来分析 pcap 文件。遇到IP头就知道怎么获取地址了

if(packet.hasHeader(ip)&&packet.hasHeader(tcp)&&tcp.flags_SYN())
        {       
        sIP = packet.getHeader(ip).source();
        sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP);

但是当我有 ICMP 标头时,我不知道如何获取地址。我试过这个

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

但我得到了一个错误:
Diplomatiki.Ex2.main(Ex2.java:83) 处的线程“main”java.lang.NullPointerException 中的异常

第 83 行包含命令:

 sIP=packet.getHeader(ip,1).source();

我试着听从马克的建议,并补充道

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 ]

它对你说了什么吗?

【问题讨论】:

  • 更新:我认为我取得了一些进展,但仍然没有得到任何东西。至少代码是有效的。我用 sIP=packet.getHeader(ip,1).source();

标签: ip-address pcap icmp jnetpcap


【解决方案1】:

您好,正确的用法是使用 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); }

为了帮助可视化和调试目的并准确查看哪些标头已被剖析并存储在数据包状态表中,请使用以下代码 sn-p 转储内容:

System.out.println(packet.getState().toDebugString());

希望这会有所帮助。

【讨论】:

  • 嘿,我是马克。感谢你的回复。正如您在上面的评论中看到的那样,我已经使用了 if(packet.hasHeader(ip, 1)) 但我收到一个错误:在 Diplomatiki.Ex2.main(Ex2.java: 83) ..第 83 行是:sIP=packet.getHeader(ip,1).source();在出错之前我只收到 3 个数据包。我试过你的建议,我得到了第四个数据包的内容。但我看不出有什么奇怪的。请参阅上面的错误。
【解决方案2】:

您仍在使用不存在的 getHeader 实例 1(即在第 4 个数据包中)。同样,我建议您改用 hasHeader。结果相同,但当标头实例不存在时不会抛出空异常。如果您还需要 ICMP 标头,则将它们组合在一个 if() 语句中:

if(packet.hasHeader(ip, 1) && packet.hasHeader(icmp)) { sIP = ip.source(); }

【讨论】:

  • 我试过了。我仍然一无所获。我运行 System.out.println(packet.getState().toDebugString());看看有什么问题,我没有得到任何标题
  • JMemory: JMemory@440000class org.jnetpcap.packet.JPacket$State: size=120 bytes JMemory: owner=packet.JScanner.class(size=136528/offset=131328) JPacket.State#1643 : sizeof(packet_state_t)=120 JPacket.State#1643: sizeof(header_t)=40 and *0=0 JPacket.State#1643: pkt_header_map=0x0 JPacket.State#1643: pkt_flags=0x1 JPacket.State#1643: pkt_header_count= 0 JPacket.State#1643:pkt_wirelen=60 JPacket.State#1643:[协议(ID/标志)|开始 |前缀 |页眉 |差距 |有效载荷 |后缀]
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-28
  • 1970-01-01
  • 1970-01-01
  • 2020-05-03
  • 2010-12-21
相关资源
最近更新 更多