Intellidroidは、特定の動作につながるコールパスを抽出し、実行時にこれらのパスを正確に実行するAndroidアプリケーションの分析ツールです。一連のターゲット動作が与えられた場合、静的解析コンポーネントはアプリケーションのコールグラフを横断して、これらの動作へのパスを見つけます。また、パスの制約を抽出します。パスの制約は、これらのパスをトリガーできる入力値を決定するために使用されます。動的コンポーネントは、抽出されたパス/制約を取り、入力値をAndroidデバイスに注入し、ターゲットの動作をトリガーします。
詳細については、紙とスライド(NDSS 2016)を参照してください。
「フレームワーク分析」は静的分析を実行して、Androidフレームワークの制約を生成します。現在、「アパナリシス」コンポーネントによって生成されたアプリケーション制約に追加できるように、出力フレームワークの制約を提供しています。
「アパナリシス」ディレクトリには、Androidアプリケーションの制約を生成するコードが保持されます。
| ディレクトリ | 説明 |
|---|---|
| プリプロース | ツールに渡す前に、APKファイルを抽出および前処理するスクリプト。 |
| SRC | ソースコードファイル。 |
| libs | 必要なWALAライブラリを含む依存関係。 1 |
| アンドロイド | AOSPバージョン4.4.2_R2から、Androidフレームワークファイル(分析する)をコンパイルしました。 |
1 Intellidroidのパフォーマンスを改善するために、Walaのコールグラフ生成にわずかな変更を加えました。変更されたソースコードはここにあります。
このプロジェクトでは、Gradleビルドシステムを使用しています。出力ファイルはbuild/ディレクトリにあります。 Gradlewスクリプトは、Gradleが既にインストールされていないマシンのラッパーです。開発マシンに既にGradleが含まれている場合は、以下のコマンドで./gradlewをgradleに置き換えることで、独自のインストールを使用できます。 Gradleが依存関係を自動的にダウンロードできるように、コードを初めてコンパイルするときにネットワーク接続が必要です。
androidディレクトリに含まれるAndroidフレームワークファイルは、JDK 1.6を使用してコンパイルされましたが、Preprocessingスクリプトで使用されるapktoolにはJDK 1.7が必要です。 JDK 1.7を使用することをお勧めします。必要に応じて、 androidディレクトリのファイルを交換して、AOSPまたはJDKのさまざまなバージョンを試すことができます。
分析するターゲットAPKファイルは、最初にpreprocessフォルダーのスクリプトを使用して前処理する必要があります。結果のディレクトリ(APKファイルと抽出されたリソースを含む)を静的分析に渡すことができます。
プリプロセシングスクリプトは、APKTOOLとDAREを使用してAPKパッケージを抽出します。独自の抽出ツールを使用できますが、Intellidroidが特定のアプリケーションのByteCodeファイルとマニフェストファイルを見つけることができるように、アプリ分析コードを変更する必要がある場合があります。
./preprocess/PreprocessAPK.sh <APK file>
./preprocess/PreprocessDataset.sh <directory of APK files>
./gradlew build
./IntelliDroidAppAnalysis -o <output directory> <preprocessed app directory>
他のコマンドラインオプションを表示するには、実行してください。
./IntelliDroidAppAnalysis --help
出力ディレクトリは、アプリ情報JSONファイルとZ3制約ファイルを保存するために使用されます。指定されていない場合、これらのファイルは./pathOutputに保存されます。出力ファイルは、コールパスを識別し、これらのパスをトリガーするための入力データを生成するために、 IntelliDroidDynamicClientツールによって使用されます。
出力ディレクトリで作成されたappInfo.jsonとconstraintX_X.pyファイルは、動的クライアントに必要ですが、あまり読み取れません。 -yフラグを使用して、パス/制約結果のより読みやすい(ただし出力が多い)バージョン(stdoutで印刷)を取得できます。
「DynamicClient」ディレクトリには、Androidデバイスと通信し、目的のイベントをトリガーする入力を送信するPythonプログラムが含まれています。
このプログラムは、Androidデバイスまたはエミュレータがシステムに接続されていることを期待しています。このデバイスは、IntellidroidServiceを含むカスタムAndroid OSを実行している必要があります(これは、このプログラムが送信するコマンドを解釈し、実際のイベントの呼び出しを実行します)。 DynamicClientプログラムは、ポートTCP:12348のソケットを介してデバイスに自動的に接続されます。 adbツールは、接続のセットアップと特定のコマンドの実行に使用され、 PATHから到達可能にする必要があります(これは、Android SDKツールディレクトリをPATH変数に追加するか、DynamicClientを実行する前にAOSPビルド環境を設定することで実行できます。
さらに、DynamicClientは、Python API(Z3-PY)を介してZ3制約ソルバーを使用します。 Pythonバインディングを使用してZ3を構築およびインストールする手順は、こちらから入手できます。
Intellidroidが使用するカスタムAndroid OSは、ベースAOSPソースツリーに適用できる一連のDIFFファイルとして提供されます。 Intellidroidは現在、Android 4.3(AOSP Branch android-4.3_r1 )に実装されています。 Androidをダウンロードして構築する方法については、AOSPドキュメントを参照してください。
正しいAOSPバージョンをダウンロードしてコンパイルしたら、 androidPatchesディレクトリにあるIntellidroidパッチを適用できます。このプロセスを自動化するのに役立つpatch.shおよびunpatch.shファイルが提供されます。パッチを適用した後、AOSPを再構築します(2回makeする必要があることがわかりました。それ以外の場合は、エミュレーターの特定のファイルが一貫していません)。 make update-apiとともにMake- makeを実行する必要がある場合があります。構築されたら、 logcatを使用して、デバイスが起動するときにIntelliDroidServiceクラスがシステムサービスとして開始されることを確認できます。
cd androidPatches
./patch.sh <path to AOSP directory>
./IntelliDroidDynamicClient.py
HELP (コマンドの説明を取得)
INSTALL <APK file>
START <directory to app information, generated by IntelliDroidAppAnalysis>
TRIGGER <call path ID to trigger, as specified in appInfo.json>
EXECUTE <command to send to IntelliDroidService> 1に送信しますINFO <info requested from IntelliDroidService> 1から要求された情報CLOSE
KILL
1これらのコマンドは、デバッグ目的のみを目的としています。 IntellidroidServiceが期待する正確なパラメーターを知っている場合にのみ、これらを使用する必要があります。
Taintdroidとの統合はかなり簡単です。 「アパナリシス」コンポーネントの場合、 -tフラグを使用して、ターゲットメソッドの異なるリストを指定します(つまり、提供されたtaintdroidTargets.txtファイル)。
./IntelliDroidAppAnalysis -t taintdroidTargets.txt <preprocessed app directory>
ダイナミックな側面では、こちらの指示に従って、Android 4.3のTaintdroidをダウンロードして構築します。 Taintdroidのビルドが機能することを確認したら、変更されていないAOSPと同じ方法でDynamicClient/androidPatchesのパッチを適用します。
Intellidroidは、最初はトロント大学のMichelle Wongによる修士論文プロジェクトとして開発され、Drave Lieが監督しました。
お問い合わせについては、お問い合わせください。
以下は、Intellidroidにコードを貢献しています。
IntellidroidはMITライセンスの下でリリースされます。