pcapをパースする(その2・ARP編)
pcapをパースする(その1・ヘッダ編) - ポン酢ブログ(β)で、pcapのパースをしてみたので今回はARPのパースをやってみます。
実はARPのパケットをパースするためには、まずEthernetをパースする必要があります。今後パケットをパースする際にEthernetが読めないとなんともならないので、今回はまずEthernetフレームを読んでいきます。
Ethernetを読む
いわゆるL2・データリンク層と呼ばれる部分になります。Wikipediaを読むのが一番はやいかなと思います。 今回の実装部分はこちらにあります。今回は簡略化するためにオプションは実装せず、基本的なDestination, Source, Typeをパースしました。
Typeが0x0806
ならARP、0x0800
ならIPv4、・・・のようになっています。このTypeを見るのがキモです。
今回のpcapのパースではEthernetを対象にするので、ここまでとしておきます。
ARPを読む
ARPのパケットフォーマットはRFC 6747に定義されています。ここで実装しました。
ARPはブロードキャストアドレス向けにTarget IPアドレスを入れて送信し、誰かが返答するという流れでアドレスを解決します。実際に実装して、pcapファイルを読ませてみるとそのようになっていることがわかりました。
MagicNumber = 0xa1b2c3d4 VersionMajor = 0x2 VersionMinor = 0x4 ThisZone = 0x0 SigFigs = 0x0 SnapLen = 0x40000 Network = 0x1 Num: 0 TsSec = 0x5daf2125 TsSec (Format) = 2019-10-23T00:32:53+09:00 TsUsec = 0x5b183 InclLen = 0x2a OrigLen = 0x2a Dst=0xffffffffffff, Src=0x<masked>, Type=0x0806 Htype=0x0001 Ptype=0x0800 Hlen=0x06 Plen=0x04 Op=0x0001 SenderMac=0x<masked> SenderMac Company: Intel Corporate SenderIp=0xc0a8030c TargetMac=0x0000000000 TargetMacCompany: XEROX CORPORATION TargetIP=0x00c0a80305 # ここからReply Num: 1 TsSec = 0x5daf2125 TsSec (Format) = 2019-10-23T00:32:53+09:00 TsUsec = 0x67aa8 InclLen = 0x2a OrigLen = 0x2a Dst=0x<masked>, Src=0x<masked>, Type=0x0806 Htype=0x0001 Ptype=0x0800 Hlen=0x06 Plen=0x04 Op=0x0002 SenderMac=0x<masked> SenderMac Company: Apple, Inc. SenderIp=0xc0a80305 TargetMac=0x<masked> TargetMacCompany: Intel Corporate TargetIP=0x83c0a8030c
今回は、それに加えてMACアドレスからベンダーを引けるようなメソッドをutil
に実装しました。(ここ)これでベンダーをひけるようになったりして便利になりました。