MasaのITC Life

夢は起業家!全てにおいて凡人だけど頑張ることだけはいっちょ前!

プログラミング

Raw SocketでARPパケットをキャプチャする

投稿日:2019年6月6日 更新日:

ARPパケットにターゲットを絞って、パケットキャプチャしていこうと思います。

ARPパケットを扱うには、linuxで定義されているether_arp構造体とarphdr構造体を使用します。そのためには"netinet/if_ether.h"と"net/if_arp.h"をインクルードする必要があります。

ether_arp構造体は/usr/include/netinet/if_ether.hに定義されています。


arphdr構造体は /usr/include/net/if_arp.hに定義されています。

初見では少し分かりにくいかもしれません。

ARPは、ehternet/IP以外にも対応しています。規格によって、アドレスバイト数が異なります。なのでarphdrという汎用的な構造体でアドレス以外のパラメータを定義して、そしてethernet/IP用にアドレスが定義された構造体がether_arpです。


構造体の中身を見てみると、ether_arp構造体の最初に、struct arphdr がさらに定義されています。その次にアドレスが宣言されています。このarphdr構造体は、ARPパケットのアドレス以外のパラメータ(オペレーションコードなど)をメンバに持ちます。arphdr構造体に#ifから#end ifの間に、アドレスが定義されている感じがしますが、実際にアクセスは出来ないです。なのでアドレスは、規格に対応した形で別に定義してあげる必要があります。

ether_arp構造体をさらに見てみると、arp_hrd構造体がes_hrdという名前で宣言されています。そして、#defineでes_hrdのメンバ"ar_hrd"へのアクセスをarp_hrdで定義するとしています。これでether_arp構造体には、arp_hrdというメンバが定義されているかのようになります。

つまり、実際にコードを書くときはarphdr構造体を気にすることなく、ether_arp構造体だけで全てのパラメータを触れるようになります。

ARPパケットをキャプチャするコードは以下のようになります。

 

ハードタイプやオペレーションコードの名前を返す関数などは一応書かなくても大丈夫です。しかしその際は、例えばハードタイプの値だけが表示されるだけです。あくまで、その値が何を示すかということを表示しているだけなので、名前と値の対応を覚えている方は必要ないかと思います。

実際に動かすとこんな感じです。


最後まで読んでいただきありがとうございました。

-プログラミング

Copyright© MasaのITC Life , 2023 All Rights Reserved Powered by STINGER.