目的
- tcpdumpで吐き出したトラフィックログ on エミュレーターからホストでリアルタイムで監視したいと言う思いがありました。
- それにはnetcatがいるのですが、実機であればnetcatはプリインストールされています。ただ実機だとパケットキャプチャするとRoot化が必要で、それは嫌だったのでGenymotionですることにしました。
- で、Genymotionにはnetcatがないので、netcatをソースからコンパイルしてインストールすることにしました
- 恐らくnetcat以外でも出来る手順だと思うので、共有させて頂きます
環境
- ホスト: MacOSX
- エミュレータ: Genymotion Nexus6(Lollipop)
手順
GenymotionのCPUアーキテクチャの調査
% adb devices
List of devices attached
192.168.57.101:5555 device
% adb -e shell uname -a
Linux localhost 3.10.0-genymotion-g1d178ae-dirty #1 SMP PREEMPT Mon Apr 27 11:57:12 CEST 2015 i686 GNU/Linux
- Genymotionはx86ベースっぽい
- 実機(ARM)と同じ想定でコンパイルしてもnetcatの実行はできないので注意です。下記のエラーが出ます
- Binary file not executable.
netcatのソースファイルをダウンロード
- ココ
- tarファイルなので解凍する
% tar -xvzf netcat-0.7.1.tar.gz
環境変数SYSROOTを設定
- sysrootはターゲット(エミュレータ)のシステムヘッダやライブラリがあるディレクトリのこと
- ターゲットのAPIレベルとCPUアーキテクチャに該当するディレクトリを設定する
- $NDKはここから落としてきたAndroid NDKのあるディレクトリ
SYSROOT=$NDK/platforms/android-21/arch-x86
toolcahinの設定
- コンパイラが動作している以外のプラットフォーム向けに実行ファイルを生成する機能の事
- NDKファイル内にandroid用の中にある
- 下記を実行する
% cd $NDK/build/tools
% ./make-standalone-toolchain.sh --arch=x86 --platform=android-21 --install-dir=/tmp/android-toolchain --ndk-dir=../../. --system=darwin-x86_64
make-standalone-toolchain.shの各オプション
- --arch: ビルドターゲット(Nexus6 on Genymotionのアーキテクチャ)
- --platform: AndroidのAPIレベル
- --install-dir: toolchainの保存先
- --ndk-dir: $NDK
- --system: toolchainのホストマシン(この場合MacOSXなのでdarwin-x86_64)
コンパイル時の環境変数の設定
- 環境変数を設定して、androidのgccを使うようにする
- CCでi866ベースでコンパイル出来るように指定
export PATH=/tmp/my-android-toolchain/bin:$PATH
export CC=i686-linux-android-gcc
コンパイル
- 解凍したnetcat-0.7.1ディレクトリの中でコンパイル
CFLAGS="-fPIE" LDFLAGS="-pie" ./Configure --host=x86 && make
- ./Configure前にフラグを設定しているが、これはLollipopからはPIE(Position Independent Executable) 以外のネイティブ実行形式がサポート外となったため
- PIE: プロセス空間上のどのアドレスに配置されてもメモリ上のアドレステーブル等を書き換えることなくそのまま実行できる
- 参照
- 設定しないと下記のエラーが実行時に出ます
- error: only position independent executables (PIE) are supported.
実行ファイルチェック
- できた実行ファイルをチェック
% file src/netcat
src/netcat: ELF 32-bit LSB shared object, Intel 80386, version 1 (SYSV), dynamically linked (uses shared libs), not stripped
- ちゃんとIntelベースの32bit実行ファイルになっている
エミュレータにPushして実行テスト
% adb push src/netcat /data/local
% adb shell /data/local/./netcat -vz localhost 12345
localhost [127.0.0.1] 12345: Connection refused
- おしまい
Androidのトラフィックをリアルタイムで見るには?
- こちらに続きを書きましたのでご参照ください
参照
- https://developer.android.com/ndk/guides/standalone_toolchain.html
- http://codeseekah.com/2012/08/07/port-forwarding-an-android-local-port/#more-1296
- https://sites.google.com/site/fudist/Home/vim-nihongo-ban/android-vim-build/android-ndk-cross-compile
- http://stackoverflow.com/questions/24818902/running-a-native-library-on-android-l-error-only-position-independent-executab