Nmap 6.46をAndroid NDKでクロスコンパイルする

Nmapは定番のセキュリティスキャナです。NcatというNetcatもどきが付属しており、僕はこれが欲しくてビルドしました。

http://nmap.org/download.html#source から nmap-6.46.tar.bz2 をダウンロードします。

例によってconfig.subが古いので、libtoolのファイルをコピーしてからconfigureします。

$ tar xvjf nmap-6.46.tar.bz2
$ cd nmap-6.46
$ for i in `find . -name config.guess` ; do cp /usr/local/share/libtool/config/config.guess $i ; done
$ for i in `find . -name config.sub` ; do cp /usr/local/share/libtool/config/config.sub $i ; done
$ CFLAGS=-O2 LDFLAGS=-s ./configure --host=arm-linux-androideabi --prefix=$ANDROID_APP_ROOT/nmap-6.46 --with-pcap=linux --without-liblua --without-zenmap --without-nping
$ patch < patch-eth-bsd.txt
$ make
(liblinearに関するエラーが出る、クロスコンパイル環境への対応が中途半端なため)
$ cd liblinear
$ arm-linux-androideabi-ar rcv liblinear.a linear.o tron.o blas/*.o
$ arm-linux-androideabi-ranlib liblinear.a
$ cd ..
$ make
$ make install

コンパイルエラーを回避するためにconfigureで色々とwithoutにしています。

また、そのままではビルドが通らないので、下記パッチを当てる必要があります。この対応が正しいかは疑問ですが…。

*** nmap-6.46-orig/libdnet-stripped/src/eth-bsd.c	2009-11-09 13:49:32.000000000 +0900
--- nmap-6.46/libdnet-stripped/src/eth-bsd.c	2014-05-31 16:08:21.000000000 +0900
***************
*** 18,24 ****
--- 18,29 ----
  #include <net/route.h>
  #include <net/if_dl.h>
  #endif
+
+ #ifdef HAVE_NET_BPF_H
  #include <net/bpf.h>
+ #else
+ #define BIOCSETIF	_IOW('B',108, struct ifreq)
+ #endif
  #include <net/if.h>

  #include <assert.h>

installed files

bin/ncat
bin/nmap
share/man/*/man1/nmap.1
share/man/man1/ncat.1
share/man/man1/ndiff.1
share/man/man1/nmap.1
share/nmap/*