目次
はじめに
APK(Application Package)ファイルとは、Androidで使用されるアプリケーションの専用フォーマットです。
Androidの端末上で実行されるアプリケーションは、この形式で構成されています。
今回は、このAPKファイルの構造やダウンロードの方法、解析方法をまとめてみました。
APKファイルのダウンロード
まずは、解析したいアプリケーションのAPKファイルを入手するところから始めます。考えられる方法は3つあります。
- rootを取得したAndroid端末からパソコンへ、APKファイルを転送する
- APK Downloaderを利用してAPKファイルをGooglePlayから直接ダウンロードする
- APK Mirrorを利用してアプリのAPKをダウンロードする
1の方法は、rootを取得してあるAndroid端末が手元にあれば一番安全で確実な方法です。ただし、rootの取得は、端末を壊す危険性があるので、今回は利用しません。
2の方法は、筆者が試したところ、危ない広告が表示されたり、そもそもAPKファイルをダウンロードすることができなかったため、これも却下です。
3の方法は、GooglePlayから取得したAPKファイルをミラーしてくれているサイトで、過去のバージョン等もダウンロードすることが可能です。なおかつ手間がかからないので、APK MirrorからAPKファイルをダウンロードするのがおすすめです。
APK Mirrorの利用方法
APK Mirrorを開き、トップページのSearchの部分に検索したいアプリの名前を英語で入力してください。例えばポケモンGOのAPKファイルをダウンロードする場合は、pokemon go と入力してください。
あとは、リリースされたバージョンごとにリスト表示されるので、ダウンロードしたいバージョンを選択すればダウンロードすることができます。
APKファイルの構造
APKファイルの実態は、ZIP形式のアーカイブです。 PCなどでAPKファイルの拡張子を.zip
へ変更することで解凍することができます。解凍されたファイルは以下のような構成になっています。
assets
lib
META-INF
res
AndroidManifest.xml
classes.dex
resources.arsc
assets
バイナリ形式のファイル群が格納されます。ZIPファイル、テキストファイルなどがこのディレクトリに格納されます。
lib
コンパイル済みのコードがアーキテクチャ別に格納されます。
armeabi
:ARM用のコンパイル済みコードarmeabi-v7a
:Android用(ARMv7)用のコードarm64-v8a
:ARM64ビット用のコードx86
:x86アーキテクチャ用のコードx86_64
:x64アーキテクチャ用のコードmips
:MIPS用コードのコード
META-INF
APKファイルのチェックサム(SHA-1)や、アクセス権限のリスト、res
ディレクトリやassets
ディレクトリに格納されているファイルのチェックサムなどを記録したファイルが格納されます。
res
APKファイルに埋め込まれたリソースファイルが格納されます。Androidでアプリケーションをインストールしたときに表示されるアイコンの画像ファイルなどが含まれます。
AndroidManifest.xml
APKファイルのタイトルや、バージョン情報などが記録されています。拡張子が.xml
となっていますが、バイナリ形式で記録されているため、テキストエディタ等で開いても内容はわかりません。
classes.dex
コンパイル済みのJavaコードです。APKファイルを解析する上で一番重要なファイルです。
resources.arsc
バイナリ形式のXMLファイルなどのプリコンパイル済みファイルです。
APKファイルの解析
上記のファイル形式を踏まえて、APKファイルを解析するには、以下の手順を踏む必要があります。
- APKファイルの解凍
classes.dex
の展開- 2で展開されたJARファイルの解凍
- 3で解凍した
.class
ファイルのデコンパイル - 4で展開された
.java
ファイルの解析
準備
Windowsでも展開することが可能ですが、Linux系OSで展開したほうが楽なので、今回は仮想マシンにUbuntuをインストールして展開します。
ここからは、仮想マシン上での作業となります。
まずは、Javaがインストールされていない場合は、インストールしておきます。
sudo apt-get update
sudo apt-get default-jre
java -version
dex2jarのインストール
下記のサイトからdex2jarをダウンロードして解凍しておきます。
dex2jar - Github
classes.dex
の展開
以下のコマンドを実行すると、classes.dex
ファイルを.jar
ファイルに変換することができます。
cd dex2jar-2.1-SNAPSHOT
./d2j-dex2jar.sh classes.dex
展開されたJARファイルはZIP形式なので、アーカイバで解凍することができます。
解凍したファイルの中の、.class
ファイルをデコンパイルすることで、実際のコードを読むことが可能です。
jadのインストール
下記サイトからjadをダウンロードして解凍しておきます。
JAD Java Decompiler Download Mirror
.class
ファイルの展開
以下のコマンドを実行すると、.class
ファイルを.java
ファイルに変換することができます。
cd jadi58e.linux.static
./jad -s java -d [保存先のパス] -r [.classファイルへのパス]
あとは、生成された.java
ファイルのコードを解析していくことで、どんな処理をしているかを確認することができます。