logo
code:Haemophilus influenzae

ここに書かれていることは無保証です。同じことを行って問題が発生しても、 龍義は責任をとりません。

2006年10月12日

戻る

cygwin で ssldump をコンパイルするぞ

cygwin のインストール

cygwin のインストールについては、方々で解説されているので、省略。 気をつけることは、 gcc などの開発系のものもインストールすることと、 ssl の解読を行うので openssl-devel を入れておく。

参考:
cygwin
http://www.cygwin.com/

winpcap の準備

ssldump は libpcap が必要である。が、 Windows では winpcap となる ので、 winpcap の開発パックのダウンロードを行う。最新版の WpdPack_3_1.zip を ダウンロードして、解凍を行う。

cd src/winpcap
wget http://www.winpcap.org/install/bin/WpdPack_3_1.zip
unzip WpdPack_3_1.zip

ライブラリの名前が libwpcap.a となっているので、 libpcap.a に変更する。 これは ssldump の configure と Makefile を直しても良いのだが、面倒なので、 名前を変えてしまう。

cd WpdPack/Lib
cp libwpcap.a libpcap.a

winpcap 周りは終了。

参考:
winpcap の開発パック
http://www.winpcap.org/devel.htm

ssldump のダウンロードと解凍

ssldump をダウンロードして、解凍する。

cd src/ssldump
wget http://www.rtfm.com/ssldump/ssldump-0.9b3.tar.gz
tar xvfz ssldump-0.9b3.tar.gz
cd ssldump-0.9b3

configure はまだ行わない。

参考:
ssldump
http://www.rtfm.com/ssldump/

include ファイルのコピー

cygwin で持っていないヘッダがあるので、 include ファイルの コピーを行う。私はコピー元として Linux 2.6 を使ったが、 Linux 2.4 やその他の OS から持ってきた場合は、他のファイルが必要になるかもしれない。

mkdir include
mkdir include/net
mkdir include/netinet
mkdir include/linux
scp toyota@kashyyyk:/usr/include/netinet/if_ether.h ./include/netinet/
scp toyota@kashyyyk:/usr/include/linux/if_ether.h ./include/linux/
scp toyota@kashyyyk:/usr/include/net/ethernet.h ./include/net/
scp toyota@kashyyyk:/usr/include/netinet/tcp_seq.h ./include/netinet/

Linux 環境を持っていない人は、 kernel をダウンロードしたりして、 コピーを行う。

参考:
The Linux Kernel Archives
http://www.kernel.org/

ファイルの修正

修正するファイルは3つ。以下に diff の結果をつける。

diff -cr ssldump-0.9b3/base/pcap-snoop.c ssldump-0.9b3r/base/pcap-snoop.c
*** ssldump-0.9b3/base/pcap-snoop.c     Tue Sep 10 06:02:58 2002
--- ssldump-0.9b3r/base/pcap-snoop.c    Thu Oct 12 11:43:18 2006
***************
*** 49,55 ****

  #include <pcap.h>
  #include <unistd.h>
- #include <net/bpf.h>
  #ifndef _WIN32
  #include <sys/param.h>
  #endif
--- 49,54 ----
***************
*** 65,70 ****
--- 64,70 ----

  #include <net/if.h>
  #include <netinet/if_ether.h>
+ #include <net/ethernet.h>
  #include "network.h"
  #include <r_common.h>
  #include <r_time.h>
diff -cr ssldump-0.9b3/base/tcppack.c ssldump-0.9b3r/base/tcppack.c
*** ssldump-0.9b3/base/tcppack.c        Tue Sep 10 06:02:58 2002
--- ssldump-0.9b3r/base/tcppack.c       Wed Oct 11 19:04:53 2006
***************
*** 50,60 ****
  #ifndef _WIN32
  # include <sys/socket.h>
  # include <arpa/inet.h>
- # ifndef LINUX
- #  include <netinet/tcp_seq.h>
- # else
  #  define SEQ_LT(x,y) ((int)((x)-(y))<0)
- # endif
  #else
  # include <winsock2.h>
  # define SEQ_LT(x,y) ((int)((x)-(y))<0)
--- 50,56 ----
diff -cr ssldump-0.9b3/ssl/ssldecode.c ssldump-0.9b3r/ssl/ssldecode.c
*** ssldump-0.9b3/ssl/ssldecode.c       Sat Aug 17 10:33:17 2002
--- ssldump-0.9b3r/ssl/ssldecode.c      Thu Oct 12 11:37:23 2006
***************
*** 49,54 ****
--- 49,55 ----
  #include "ssl.enums.h"
  #ifdef OPENSSL
  #include <openssl/ssl.h>
+ #include <openssl/md5.h>
  #include <openssl/hmac.h>
  #include <openssl/evp.h>
  #include <openssl/x509v3.h>
***************
*** 131,136 ****
--- 132,138 ----
      ssl_decode_ctx *d=0;
      int r,_status;

+       SSL_library_init();
      SSLeay_add_all_algorithms();
      if(!(d=(ssl_decode_ctx *)malloc(sizeof(ssl_decode_ctx))))
        ABORT(R_NO_MEMORY);
最低限の変更であるので、必要に応じて、別途 patch 等を適用する。

参考:
2006年8月3日の tech diary
http://www.tatsuyoshi.net/toyota/tech/20060803/index.html

make する

configure と make を行う。まずは、 configure から。オプションで、 winpcap のライブラリとヘッダを指定する。

./configure --with-pcap-inc=‾/src/wpcap/WpdPack/Include --with-pc-lib=‾/src/wpcap/WpdPack/Lib

できた Makefile を修正する。Makefile の INCLUDES に -I./include を 追加する。これで make の実行。
これで、実行ファイルができるが、エラーが出た場合は、適宜変更する。

実行

上記でできた ssldump.exe を実行すれば、動作する。しかし、2つの 問題がある。

1.デバイス名の表示がおかしい
2.デバイスの指定がむずかしい

の2つである。最初のデバイス名の表示に関しては、 UNICODE 中に ¥0 を含むために、デバイス名の表示が ¥ だけになってしまう ことがあるのである。これは、気にしなければ問題ない。
2つ目の問題に関しては、少々厄介で、デバイスが複数あるときに、 デバイス名がわからないのである。私は、この問題に関しては ethereal を使うことで解決している。ethereal を使用して、 デバイス名を見て、指定を行っている。デバイス名は、

./ssldump.exe -i "¥Device¥NPF_{00000000-0000-0000-0000-000000000000}"

のような感じになる。もちろん、 0 の部分は16進数の数字が入っている。

参考:
ethereal
http://www.ethereal.com/

by Tatsuyoshi
since 2003