1

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

しかし、エラーが発生しました:
Exception in thread "main" java.lang.NullPointerException atdiplotiki.Ex2.main(Ex2.java:83)

行 83 には、次のコマンドが含まれています。

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

私はマークのアドバイスを打ってみました、そして追加しました

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

プログラムが 3 番目のパケットでスタックしていることに気付いたので、4 番目のパケットの内容を取得しようとしました。これは私が得たものです:

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 ]

それはあなたに何かを言いますか?

4

2 に答える 2

1

こんにちは、正しい使い方は、packet.hasHeader(ip, 1) を使用することです。これにより、IPv4 の 2 番目のインスタンスが取得され、それがパケットにバインドされます。また、getHeader の使用は冗長であることに注意してください。hasHeader は、ヘッダーが存在する場合、ヘッダーをパケットに自動的にバインドします。

すなわち if(packet.hasHeader(ip, 1)) { sIP=ip.source(); sourceIP = org.jnetpcap.packet.format.FormatUtils.ip(sIP); }

視覚化およびデバッグの目的で、どのヘッダーが分析され、パケット状態テーブルに格納されているかを正確に確認するには、次のコード スニペットを使用してコンテンツをダンプします。

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

お役に立てれば。

于 2015-05-18T22:37:40.533 に答える
0

getHeader インスタンス 1 が存在しない場所 (つまり、4 番目のパケット) でまだ使用しています。繰り返しますが、代わりに hasHeader を使用することをお勧めします。同じ結果ですが、ヘッダー インスタンスが存在しない場合は null 例外をスローしません。ICMP ヘッダーも必要な場合は、単一の if() ステートメントでそれらを結合します。

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

于 2015-05-20T10:12:49.460 に答える