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ファイルとして表示してくれる。

アプリのソースコード

f:id:erakuma:20210424200345p:plain
JD-GUIのスクショ

ソースコードを見てみると、クラス、メソッド、変数の名前がアルファベット1文字になっていたり、不要と思われるクラスがいくつも存在したり、難読化されている。 一方、そのままの名前で読めそうな部分もあった。

参考

Android リバースエンジニアリング
Android リバースエンジニアリング 入門
[1] dexファイルってなんだっけ

はじめに

 ブログを開設しました。
 初投稿なので、まずはブログ開設の動機でも書いておこうと思います。

 私は何かをつくるのを好み、それに関して個人的なメモを残しています。このメモは適当に書かれているので、後で読み返しづらいです。そこで、もう少し体裁を整えてブログという形で残し、読み返しやすくしようという考えがあります。
 また、せっかく書いたものを個人で完結させてしまうのはもったいない、と以前から感じていました。普段、自分も誰かしらのブログのお世話になっているので、ほんの少しでもお返しができたらいいなぁと思います。

 今回、とりあえず場を用意しておこうと考え、重い腰を上げて開設に至りました。ブログ開設~初投稿で、"hello, world!"まではできたかなぁという気分です。どの程度続くかも分かりませんが、細々とやっていけたらと思います。
 こんにちは。