やりたいこと
拾ってきた野良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の逆コンパイラやデバッガなどを活用する。これらのツールを使えば、コードをステップ実行したり、変数の値を確認したりすることができるため、解析が容易になる。
注意点
デコンパイルは、著作権法に触れる可能性があるため、注意が必要だ。 解析する際には、アプリの開発者に許可を得るか、個人利用の範囲内にとどめるようにしよう。