動かざることバグの如し

近づきたいよ 君の理想に

apkをデコンパイルしてjavaソースコードを解析する

やりたいこと

拾ってきた野良apkをデコンパイルしてJavaソースコードを解析したい

apkの仕組み

Androidアプリのパッケージ形式

APK(Android Package)ファイルは、Androidアプリを配布・インストールするためのパッケージ形式だ。アーカイブファイルであり、ZIP形式で複数のファイルやディレクトリを含んでいる。

Javaからapkができるまで

Androidアプリ開発では、Java(もしくはKotlin)でソースコードを記述する。このソースコードは、コンパイルされてDEX(Dalvik Executable)バイトコードに変換される。DEXバイトコードは、AndroidのDalvikまたはART仮想マシンで実行可能な形式だ。

apkファイルはこのDEXバイトコードを含んでおり、その他にアプリのリソース(画像、レイアウトファイルなど)、マニフェストファイル(アプリの情報が記述されたファイル)などが含まれる。

つまり、開発者がJavaで記述したソースコードは、コンパイル過程を経てDEXバイトコードに変換され、他のリソースファイルとともにapkファイルにパッケージングされるわけだ。

デコンパイルツール

色々探した結果、apk2javaってやつがシンプルで良かった

duo-labs/apk2java: Automatically decompile APK's using Docker

Dockerfile見るとわかるが実際にはdex2jarを使っておりただのラッパーに過ぎない。

ちょっとDockerfileの構成が古かったのでリライトした

使い方

まずデコンパイルしたいapkをtarget.apkだとしてカレントディレクトリに配置し、以下実行

docker run --rm -v ./:/app thr3a/apk2java:latest /app/target.apk

するとディレクトリが作成されてその中に大量のjavaが生成される。

デコンパイル後のコードの見方

デコンパイルされたJavaソースコードは、元のコードと完全に同じではない。これは、コンパイルの過程で情報が一部失われるためだ。特に、変数名やメソッド名などは難読化されていることが多い。

しかし、コードの構造やロジックは概ね把握できるため、アプリの動作を解析する上では十分役に立つ。

難読化への対応

難読化されたコードを解析する際には、Javaの逆コンパイラやデバッガなどを活用する。これらのツールを使えば、コードをステップ実行したり、変数の値を確認したりすることができるため、解析が容易になる。

注意点

デコンパイルは、著作権法に触れる可能性があるため、注意が必要だ。 解析する際には、アプリの開発者に許可を得るか、個人利用の範囲内にとどめるようにしよう。