Ⅰ. 概要
Androidの悪意のあるコード分析に必要な概念について解説します。APKファイルを逆コンパイルした際のコード分析方法について、AndroidManifest.xmlの構成を中心に説明します。また、ADBを使った実習を通して、Androidデバイスと接続し、Linuxベースのディレクトリ構造について簡単に説明します。
Ⅱ. Androidマルウェアの解析に必要な基礎知識
'jadx-gui'のようなツールを使用してAndroidアプリケーション(APK)ファイルを逆コンパイルする場合、その構造を把握することが重要です。コードの分析を通じて、脆弱性を特定するためです。APKファイルの構造を簡単に見ていきましょう。

jadx-gui プログラムを使用したサンプル APKファイルの逆コンパイル後の構造そうです。どこかで見たことがあるかもしれません。Javaで開発経験のある方なら、馴染みがあるかもしれません。JavaをベースにしたAndroidアプリであるため、Androidアプリも オブジェクト指向プログラミング (OOP)このアプリケーションは、オブジェクト指向プログラミングのJavaのクラス構造を持っています。開発者が作成したコードを完全に再現しているわけではありませんが、コードの分析には十分な情報を提供します。「com.metasploit.stage」は、このアプリケーション全体のパッケージを指し、その中にa~gのクラスがそれぞれ異なる機能を担当しています。 MainActivity、MainBroadcastReceiver、MainServiceこれは、以前に投稿されたAndroidアプリのコンポーネントの役割を果たしています。ただし、実際には、このような名前のクラスがどのような役割を担っているのか、明確な名前を使用しない可能性は高いです。開発の過程では、明確な名前を使用していたかもしれませんが、実際に、このデコンパイルによってコードを分析できることを開発チームも認識しているため、 実用化(アプリの公開)段階では、セキュリティのため、隠蔽されます。
リソースディレクトリこのアプリケーションで使用される、テキストや画像などの静的なデータが存在する場合 META-INF、AndroidManifest.xml、Classes.dex、Resources.arscMETA-INFは、アプリケーションの署名に使用される公開鍵を含む認証書です。 AndroidManifest.xmlこのファイルには、パッケージ情報や権限アプリの構成要素(Activity、BroadcastReceiverなど)に関する情報が含まれています。また、`Classes.dex`は、上記のソースコードをクラスごとに整理し、バイトコードに変換した後、dex形式で最適化したものです。最後に、`Resources.arsc`には、コンパイルされたリソース(文字列、デザインなど)が含まれています。

次に、コード分析のために確認すべき点を一つずつ見ていきましょう。まず、上記の画像は AndroidManifest.xml です。これは、Android アプリケーションを構成するコンポーネントのリストと、権限に関する情報やハードウェアに関する情報が含まれています。このファイルを最初に確認するのは、アプリケーション全体の役割を把握するためです。ただし、これだけでは全てを理解することはできません。なぜなら、特定のアプリケーションには、実際に使用されていない権限に関する情報が含まれている可能性があるからです。これは、現在インストールされている Android 携帯電話が実際に使用されているかどうかを判断するために行われます。一般的には 利用許可 項目を追加しながら確認していくと、 アプリの読み込み時に、Bluetoothのオン/オフ、ネットワーク接続の確認、傾きセンサーの利用などを行い、それらの状態を確認することで、問題の特定を試みます。 これは、悪意のあるアプリだけでなく、一般的なユーザー向けのアプリにも同様の理由で、アクセス許可を構成する場合があります。
※ すべてのAndroidアプリケーションは、パッケージ名が重複することはできません。これは、LinuxベースのAndroidオペレーティングシステムにおいて、パッケージ名とPIDを使用してプロセスを管理するためです。写真に示されているパッケージ名が「com.metasploit.stage」である場合、通常は「com.」で始まるものの、必ずしもそうである必要はありません。

まず、「android:targetSdkVersion」について簡単に説明します。これは、アプリケーションの実行に必要な最小バージョンです。Javaのバージョンを確認する際に、JARファイルを実行する際に必要な情報と同様に、アプリケーションの実行や動作には、このバージョン情報を満たす必要があります。「uses-permission」の部分を見てみると、正確な意味は分かりにくいかもしれませんが、簡単に英語に翻訳すると、Androidシステムでどのような権限を使用するか分かるのではないでしょうか。つまり、この部分は、アプリケーションの実行に必要な必須のデータやハードウェアなどについて、権限を使用することを明示しています。この部分が事前に定義されていることで、Androidのオペレーティングシステムが確認後、実際にそのハードウェアやデータを利用できるようになります。
※ アプリケーションのインストール時、または使用時に、許可を求めることはよくあることです。これは、開発者が責任を負うのではなく、ユーザーに責任を負わせるもので、この点は理解しておけば問題ありません。

アプリケーションの機能、受信、サービスに関する部分 Androidコンポーネント「intent」とは、どのような構成になっているのかを定義する部分であり、詳細についてはまだ学習が必要です。しかし、「intent」は、過去の投稿で言及したように、具体的な例を挙げると… android.intent.category.LAUNCHERこれは、アプリへのアクセスをユーザーに促すために表示されるアイコンを指します。コンポーネントについて簡単に説明し、次に進みましょう。 活動これは、ユーザーが見るインターフェース(UI)です。 放送受信機これは、内部イベントの処理を目的としています。 サービスこれは、バックグラウンドでの作業に関わる部分であり、ここでは説明しない。コンテンツプロバイダーが共有データを提供する部分について説明する。例えば、受信側の部分について説明する。 android.intent.action.BOOT_COMPLETEDこれにより、スマートフォンが起動した後、アプリを起動できるようになります。
※ Android 端末は、様々な起動方法があります。アプリのアイコンをタップして起動したり、通知メッセージ、バックグラウンドでの音楽再生、インターネット広告のクリックなどを経由して、クパングループやカカオトークなどのアプリにアクセスすることも可能です。そのため、アプリのコードを分析する際には、起動プロセスから分析を始めることもあります。
Ⅲ. ADB 研修
ADB(Android デバッグブリッジ)これは、Android向けのデバッグツールと考えることができます。このツールを活用することで、デバイスの内部構造を確認したり、複数のアプリケーションの中から悪意のあるアプリを特定したりする作業を、Windows上で行うことができます。
SDKプラットフォーム ツール リリースノート | Android 開発者 | Android 開発者
こちらからダウンロードできます。
Android デバッグブリッジ (adb) | Android 開発者 | Android 開発者
使用方法に関する詳細な情報は、こちらで確認できます。
簡単なコマンドを紹介します。
指示 | 説明 |
adbデバイスの一覧 | PCに接続されたデバイスおよびエミュレーターの接続リストを確認し、「adb kill-server」を使用して接続を終了する。 |
adb install [apkfilename.apk] | デバイスにAPKファイルをインストールする |
adb で [パッケージ名] をアンインストール | デバイスにインストールされているパッケージの削除 |
adb push [PC上のパス] [Android上のパス] | PCに保存されているファイルをデバイスにコピーする |
adb pull [Androidのパス] | デバイスに保存されているファイルをPCにコピーする |
adb ターミナル | 接続されたデバイスのシェルを実行 |
adb logcat | 接続されたデバイスのログ監視 |
adb 127.0.0.1:62001 に接続 | 127.0.0.1 の 62001 ポートへの adb 接続 |
adb shell pm list パッケージ | 接続されているデバイスにインストールされているすべてのパッケージの一覧を確認する |
adb shell pm 権限一覧 | 接続されているデバイスへのアプリケーションの権限リスト |
ADBを用いた実習を行うには、Androidデバイスが必要なため、Nox Playerをインストールして実施しました。
ノックスアプリプレーヤー - PCで、安全かつ快適にモバイルゲームをプレイしましょう。
最後に、ダウンロードしたADBファイルのパスを環境変数として登録することで、どこからでも簡単に利用できるようにしました。
方法は、「設定」→「システム」の項目から設定する。

この情報に基づいて、設定画面に進んでください。そこには、より高度な設定項目が表示されますので、クリックしてください。

環境要因が存在します。入室後、

まず、そのパスをクリックし、「新規作成」を選択した後、ADBファイルのパスをそのまま入力すれば完了です。
それでは、ADBコマンドを使ってデバイスに接続を試みましょう。(ただし、事前にNoxを起動しておくことをお勧めします。)

「adb devices」と入力すると、デバイスが表示されません。次に、現在実行されているNoxを見つけます。

タスクリストは、現在実行中のプロセスの一覧を表示し、findstrコマンドは特定の文字列に一致する結果のみを出力します。netstat -anoは、現在接続されているすべてのサーバーのIPアドレスとポート番号を表示します。その中から、Noxの場合は62001番ポートで接続されていることを確認できます。

最後に、この方法で接続を試み、正常に接続できると、adb shellを通じてLinuxのシェルが起動する様子を確認できます。もし、接続を解除したい場合は、シェルからログアウトした後、adb kill-serverコマンドで接続を初期化できます。
※ 覚えておくべきディレクトリ /data/app, /data/data, /system/vendor/lib, /proc, /storage/emulated/0これらのディレクトリが存在します。 * `/data`: アプリケーション共有ディレクトリで、一般的なデータやAPKファイルなどが格納されます。 * `/system`: システム設定ファイルに関連する部分です。 * `/proc`: プロセスに関連するディレクトリです。 リ눅スのファイル構造をイメージしてください。最後に、`/storage` はSDカードを意味します。個人のユーザー情報の場合、Linuxでは `/home/ユーザー名` ディレクトリのように、ユーザーアカウントディレクトリに保存されます。これは、他の一般ユーザーがアクセスできないようにするためのものです。
ログイン