ポン酢ブログ(β)

The harder you work, the luckier you get. - Gary Player

pcapをパースする(その2・ARP編)

pcapをパースする(その1・ヘッダ編) - ポン酢ブログ(β)で、pcapのパースをしてみたので今回はARPのパースをやってみます。

実はARPのパケットをパースするためには、まずEthernetをパースする必要があります。今後パケットをパースする際にEthernetが読めないとなんともならないので、今回はまずEthernetフレームを読んでいきます。

Ethernetを読む

いわゆるL2・データリンク層と呼ばれる部分になります。Wikipediaを読むのが一番はやいかなと思います。 今回の実装部分はこちらにあります。今回は簡略化するためにオプションは実装せず、基本的なDestination, Source, Typeをパースしました。

ascii.jp

Typeが0x0806ならARP0x0800なら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に実装しました。(ここ)これでベンダーをひけるようになったりして便利になりました。