Androidアプリのリバースエンジニアリング手順
Androidアプリのソースコードが気になったので、リバースエンジニアリングをしてみた。 手順をまとめた。
関連するファイルの種類
- apk
Androidアプリのパッケージ。Google Playではこのファイル形式でアプリが配信される。 - dex
Java(Kotlin)のファイルをAndroid環境で実行可能な形式に変換圧縮したもの [1] 。 - jar
Javaのファイルをまとめて圧縮したもの。 - class
Javaのコードをコンパイルしたもの 。
手順
実機からapkを取得
AndroidのスマホをPCに接続し、以下のコマンドで実機に入っているパッケージの一覧を取得する。今回は、ヨドバシカメラの電子書籍アプリdolyを見てみることにした。
> adb shell pm list packages ... package:com.yodobashi.doly ...
次に、取り出したいパッケージのパスを取得する。
> adb shell pm path com.yodobashi.doly package:/data/app/com.yodobashi.doly-nPQjQrYSk9EIi7lTI85-GA==/base.apk
そして、取得したパスを指定し、base.apkを実機からコピーする。
> adb pull /data/app/com.yodobashi.doly-nPQjQrYSk9EIi7lTI85-GA==/base.apk /data/app/com.yodobashi.doly-nPQjQrYSk9EIi7lTI85-GA==...lled, 0 skipped. 33.9 MB/s (36025531 bytes in 1.013s)
apkからdexを取り出す
コピーしたbase.apkをbase.zipにリネームし、解凍する。
中に入っているclasses.dexを取り出す。
dexからjarへ変換
d2j-dex2jarを使用し、classes.dexをjarへ変換する。 sourceforgeからDLし、d2j-dex2jar.batを実行する。
> ./d2j-dex2jar.bat ./classes.dex dex2jar ./classes.dex -> .\classes-dex2jar.jar Detail Error Information in File .\classes-error.zip Please report this file to http://code.google.com/p/dex2jar/issues/entry if possible.
エラーが出たようなのでclasses-error.zipを確認すると、summary.txtには以下のように書かれていた。
There are 40 methods fail to translate.
一部変換に失敗したよ、とのことだが、だいたいは変換できたようなので次へ進む。
jar(class)をjavaとして読む
JD-GUIで、変換したjarを開く。すると、jarの中に入っているclassファイルを逆コンパイルして、javaファイルとして表示してくれる。
アプリのソースコード
ソースコードを見てみると、クラス、メソッド、変数の名前がアルファベット1文字になっていたり、不要と思われるクラスがいくつも存在したり、難読化されている。
一方、そのままの名前で読めそうな部分もあった。
参考
Android リバースエンジニアリング
Android リバースエンジニアリング 入門
[1] dexファイルってなんだっけ