#キッカケ
AndroidのTCPDUMPはtPakcetCaptureが有名なんだけど、せっかくROOT化してるのだし、直に生パケットが欲しかったので設定してみた。※Root化前提です。Root化はググってね。
方法は2通り。
1.AndroidSDKのAVDを立ち上げて、tcpdumpを引っこ抜いて実機に置く。
2.1からビルドする。
##AndroidSDKのAVDから引っこ抜く
簡単。単純にandroid
コマンドからAVDを立ち上げて、adb pull /system/xbin/tcpdump ./
でtcpdumpを引っこ抜く。このとき移し替える実機のOSヴァージョンとエミュのヴァージョンを合わせること。んで、以下の通り実行する。
途中で、remountしてsystem以下を書き込みおkにするので、慎重に行うこと。system以下のファイルから実行権限抜くとAndroidが文鎮化します。文鎮化した場合、fastbootからOSの焼き直しかバックアップファイルからのOS復旧を行う。
$ adb device
$ adb push ./tcpdump /sdcard/tcpdump
$ adb shell
shell@android:/ $ su
root@android:/ # mount -o remount,rw /dev/block/mtdblock0 /system
root@android:/ # ls /system/xbin/tcpdump
root@android:/ # cp /sdcard/tcpdump /system/xbin/tcpdump
root@android:/ # ls -l /system/xbin/tcpdump
-rw-rw-r-- root root 652964 2013-10-26 11:46 tcpdump
root@android:/ # chmod 755 /system/xbin/tcpdump
root@android:/ # ls -l /system/xbin/tcpdump
ls -l /system/xbin/tcpdump
-rwxr-xr-x root root 652964 2013-10-26 11:46 tcpdump
ちなみに、shell@android -> root@androidにするのが面倒というか、直にadb shell tcpdumpを叩きたい場合は、
$ adb root
$ adb remount
でリマウントさせるか、adbd-Insecure-v2.00.apkを使って常時Rootにする(後者の方がプログラム組むとき楽)。
実行は
$ adb -s 015d3f18d124061a shell tcpdump -s 0 -vv -w /sdcard/test.pcap
のように行う。
$ adb -s 015d3f18d124061a shell tcpdump -s 0 -vv -w ./test.pcap
$ tcpdump: test.pcap: Read-only file system
上記のように直接ホストに保存するように叩くと怒られる。
ただ普段、AVDを使わずに実機やらkvmやらvirtualboxやらを使ってるとめっちゃ面倒な方法。
##1からビルドする。
こちらはUSB Sniffing with tcpdumpを参照
###Building tcpdump以下の通りにやる
まずAndroid NDKからAndroid-ndkを落としてくる。その後、
$ chmod a+x android-ndk-r10c-darwin-x86_64.bin
$ ./android-ndk-r10c-darwin-x86_64.bin
で解凍する(ちょっと長い)。次にBuild-tcpdump.tar.gzをダウンロードする。解凍するとbuild-tcpdump
がでてくる。次にbashに変えて、以下を実行する。
$ export NDK=/path/to/android-ndk-r10d
$ sh build-tcpdump
で終わり。なお、build-tcpdumpの中にAPIを設定する部分があるので、適宜変変更する。4.x系のみ掲載しておく。今回は17で作ってみた。あとは、前述のcommand
と同操作。
Android 4.0.x==14 Ice Cream Sandwich
Android 4.0.3==15 Ice Cream Sandwich MR1
Android 4.1.x==16 Jelly Bean
Android 4.2.x==17 Jelly Bean MR1
Android 4.3==18 Jelly Bean MR2
Android 4.4==19 KitKat
###Building manually from source
フルでビルド。後でやってみる。