WinPcapArp の使い方  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ver 0.3 2000/11/20 ver 0.2 2000/08/23 ver 0.1 2000/08/02 江端智一 E-mail:See http://www.kobore.net/mailAddress.gif http://www.kobore.net/ Acknowledgement: ``This product includes software developed by the Politecnico di Torino, and its contributors.'' 謝辞 本ソフトウェア「WinPcapArp」は、イタリア トリノ工科大学で開発された "WinPcap: the Free Packet Capture Architecture for Windows" http://netgroup-serv.polito.it/winpcap/ を使用しております。 WinPcapの開発に携わった全ての皆様に、心より感謝申しあげます。 0. 変更履歴  ̄ ̄ ̄ ̄ ̄ ̄ ver 0.3 2000/11/20 - バグフィックス(誤ったlocal MAC Addressを取得 していた) ver 0.2 2000/08/23 - WinPcapArpに名前を変更 - ローカルホストのMAC Addressも取得できるよう に修正 - arpSendRecvのパラメータに、32ビットIPアドレ スが使えるメソッドを追加 ver 0.1 2000/08/02 初版 1. Copyright  ̄ ̄ ̄ ̄ ̄ ̄ Copyright (c) 2000,2001,2002,2003,2004,2005 Tomoichi Ebata. All rights reserved. 改変を加える場合も、加えない場合も、ソースとバイナリー形式での再配布、 使用は、下記の条件を満たした場合に許諾される。 1. ソースコードでの再配布物には、必ず上記の著作権表示、この条件リスト、 および以下の面責事項を、改変せずにファイルの最初の数行に入れなけれ ばならない。 2. バイナリー形式での再配布は、必ず上記の著作権表示、この条件リスト、 以下の面責事項の複製をドキュメンテーション内、あるいは配布と共にパッ ケージに入れられて提供される他の物の中に入れなければならない。 このソフトウェアは江端智一によって”現状のまま”提供されるものであり、 市場性があり売れる製品であるような含みを持たせ、特定の目的に適う製品で あるかのような、いかなる明示された保証はない。 また、なにか保証があるような含みを持たせた一切の保証の類からの責任も すべて拒否する。 著作者は直接的、非直接的、偶発的、特殊な、典型的、あるいは必然のいか なる場合においても、 いかなる損害に一切責任は負わない。 その損害は以下の内容も含み、しかもそれに限定されない。 代用となる物やサービスの調達、効果・データ・利益の低下、商取引の障害、 また、どのような責務の論理においても、それが契約に関するものであろうと、 厳格な責務であろうと、不正行為(不注意やその他の場合も含む)であろうと、 このソフトウェアを使用することによって生じるそれらの損害の、一切の責任 から著作者は免れている。 たとえ事前にそれらすべての損害への可能性が示唆されていた場合において も同様である。 2. What is "WinPcapArp" ?  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ "WinPcapArp"は、パケットフィルタライブラリ WinPcap http://netgroup-serv.polito.it/winpcap/ を使った、ARPライブラリです。 CArpクラスを用いて、ターゲットIPアドレスのNICのMACアドレスを取得するこ とができます。 3. "WinPcapArp"が前提とする環境  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ WinPcap 2.2 のライブラリが必要になります。 http://netgroup-serv.polito.it/winpcap/install/default.htm よりダウンロードして下さい。 4. 対応プラットフォーム  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ 日本語版および英語版 WindowsNT SP5 で動作を確認しております。 Windows2000でも、問題なく動作すると思います。 Windows9Xは、Adapterの表記方式が異なるため、ソースに若干の手直しが必 要(と言うか、コードの一部を削除するだけ)になると思いますが、動くはずで す。 Windows9Xの対応をしても良いですが、私が疲れていない時に、Visual Studio 6.0をインストールしたWindows9Xマシンを貸して頂き、成功の暁には 誉めて頂くことが条件です。 5. CArp クラス  ̄ ̄ ̄ ̄ ̄ ̄ ̄ CArp::CArp( const char* srcIPAddr, const char* subnetIPAddr, const char* defaultGWAddr, unsigned long waitTime = ARP_WAIT_TIME // 500 ); srcIPAddr ARPを使いたいネットワークに接続している 自ホストNICのIP Address (e.g. "192.168.0.120") subnetIPAddr 上記ネットワークのサブネットマスク (e.g. "255.255.255.0") defaultGWAddr 上記ネットワークのデフォルトゲートウェイアドレ ス (e.g. "192.168.0.1") waitTime ARPの応答待ち時間を指定します。デフォルトは 500msです。 bool CArp::arpSendRecv( const char* ipAddr, char* macAddr ); ipAddr ターゲットNICのIPアドレス(入力) (e.g. "192.168.0.15") macAddr ターゲットNICのMACアドレス(出力) (e.g. "00:50:56:ED:88:34") ただし、ターゲットNICがサブネット内にない場合には、デフォルト ゲートウェイのNICのMACアドレスを返します。 ARPの応答待ち時間を越えた場合、CArp::arpSendRecv()は、エラーリ ターンします。 bool CArp::arpSendRecv( __u32 hostTypeIPAddr32, char* mac_ethAlen ); hostTypeIPAddr32 ターゲットNICのIPアドレス(32ビットホストバイ ト順(入力) (e.g. "3295805967") macAddr ターゲットNICのMACアドレス(出力) ":"を省略した値がchar[6]分出力されます。 ただし、ターゲットNICがサブネット内にない場合には、デフォルト ゲートウェイのNICのMACアドレスを返します。 ARPの応答待ち時間を越えた場合、エラーリターンします。 char* CArp::getLastMessage() 最後に実施したメソッドの結果の内容を表示します。 bool CArp::isArpVaild() CArpのインスタンスの生成の成否を調べます。 6. その他  ̄ ̄ ̄ ̄ ̄ コンストラクタで、インスタンス化に失敗すると、それ以後のメソッドは全 部無視されます。 インスタンス化の成否は、CArp::isArpVaild()で確認して下さい。 7. サンプルプログラム  ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ ̄ サンプルプログラムを以下に示します。 // ArpTest.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include "../Arp.h" void main(void) { WSADATA Data; int status = WSAStartup(MAKEWORD(1,1), &Data); // CArp arp("15.2.117.196","255.255.248.0","15.2.112.1"); // CArp arp("15.2.117.197","255.255.248.0","15.2.112.1"); CArp arp("zen2","255.255.248.0","15.2.112.1"); // CArp arp("192.168.0.2","255.255.255.0","192.168.0.2"); printf("%s\n\n",arp.getLastMessage()); if (arp.isArpVaild() == false) return; char macAddr[18]; #if 0 arp.arpSendRecv("192.168.0.1",macAddr); printf("%s %s\n","192.168.0.1",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("192.168.0.2",macAddr); printf("%s %s\n","192.168.0.2",macAddr); printf("%s\n\n",arp.getLastMessage()); #endif //0 arp.arpSendRecv("zen1",macAddr); printf("%s %s\n","zen1",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("zen2",macAddr); printf("%s %s\n","zen2",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("zen2",macAddr); printf("%s %s\n","zen2",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("zen3",macAddr); printf("%s %s\n","zen3",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("zen5",macAddr); printf("%s %s\n","zen5(3295805967)",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv(ntohl(inet_addr("15.2.114.196")),macAddr); printf("%s %s\n","zen5(3295805967)",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("zen6",macAddr); printf("%s %s\n","zen6",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("zen7",macAddr); printf("%s %s\n","zen7",macAddr); printf("%s\n\n",arp.getLastMessage()); #if 0 arp.arpSendRecv("15.2.114.196",macAddr); printf("%s %s\n","15.2.114.196",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("15.2.114.190",macAddr); printf("%s %s\n","15.2.114.190",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("15.2.112.197",macAddr); printf("%s %s\n","15.2.112.197",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("192.168.0.1",macAddr); printf("%s %s\n","192.168.0.1",macAddr); printf("%s\n\n",arp.getLastMessage()); arp.arpSendRecv("192.168.0.2",macAddr); printf("%s %s\n","192.168.0.2",macAddr); printf("%s\n\n",arp.getLastMessage()); #endif //0 }