APKファイルのダウンロードとファイル構造、解析方法のまとめ

はじめに

APK(Application Package)ファイルとは、Androidで使用されるアプリケーションの専用フォーマットです。

Androidの端末上で実行されるアプリケーションは、この形式で構成されています。

今回は、このAPKファイルの構造やダウンロードの方法、解析方法をまとめてみました。

APKファイルのダウンロード

まずは、解析したいアプリケーションのAPKファイルを入手するところから始めます。考えられる方法は3つあります。

  1. rootを取得したAndroid端末からパソコンへ、APKファイルを転送する
  2. APK Downloaderを利用してAPKファイルをGooglePlayから直接ダウンロードする
  3. 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ファイルを解析するには、以下の手順を踏む必要があります。

  1. APKファイルの解凍
  2. classes.dexの展開
  3. 2で展開されたJARファイルの解凍
  4. 3で解凍した.classファイルのデコンパイル
  5. 4で展開された.javaファイルの解析

準備

Windowsでも展開することが可能ですが、Linux系OSで展開したほうが楽なので、今回は仮想マシンにUbuntuをインストールして展開します。

ここからは、仮想マシン上での作業となります。

まずは、Javaがインストールされていない場合は、インストールしておきます。

sudo apt-get update
sudo apt-get default-jre
java -version

dex2jarのインストール

下記のサイトからdex2jarをダウンロードして解凍しておきます。

dex2jar - Github

https://github.com/pxb1988/dex2jar/releases/download/2.1-nightly-26/dex-tools-2.1-20150601.060031-26.zip

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

http://varaneckas.com/jad/jad158e.linux.static.zip

.classファイルの展開

以下のコマンドを実行すると、.classファイルを.javaファイルに変換することができます。

cd jadi58e.linux.static
./jad -s java -d [保存先のパス] -r [.classファイルへのパス]

あとは、生成された.javaファイルのコードを解析していくことで、どんな処理をしているかを確認することができます。