読者です 読者をやめる 読者になる 読者になる

clock-up-blog

go-mi-tech

逆コンパイルにより apk から Java ソースコードを生成する

Android Java

概要

Android のアプリケーション本体であるところの apk ファイルから、そのアプリケーションを構成している元のソースコードに近いものを復元したい。逆コンパイルを用いて実現する。

Android KitKat Hacks ―プロが教えるテクニック & ツール

Android KitKat Hacks ―プロが教えるテクニック & ツール

環境について

Windows 環境からの接続を試したが、他の環境でも同様の手順が使えるはず。

今回用いる apk ファイル

以下を実験に用います。

実は本物の元ソースもあります。逆コンパイルにより生成した java ファイルと見比べてみると良い。

環境準備

JRE準備

コマンドプロンプト上で java コマンドが実行できるようにしておくこと。

作業場所を確保する

新しいフォルダを適当な場所に作り、そこを作業場所とする。
今回は C:\decompiler とする。

dex2jar 入手

.apk ファイルを .jar ファイルに変換するツール。

unzip 入手

ZIP形式のファイルを解凍するツール。今回は .jar ファイルの解凍に用いる。

jad 入手

.class ファイルを解析し逆コンパイルを行い、.java ファイルを生成するツール。

apk 入手

今回解析する apk を入手し、C:\decompiler に設置する。

できあがった環境

f:id:kobake:20150301012039p:plain

この中のファイルのうち、今回は以下を使う。

  • C:\decompiler\
    • dex2jar-0.0.9.15\dex2jar.bat
    • unzip-5.51-1-bin\bin\unzip.exe
    • jad158g.win\jad.exe
    • Reversi.apk

作業手順

.apk → .jar

.apk 形式を .jar 形式に変換する。

> cd C:\decompiler
> dex2jar-0.0.9.15\d2j-dex2jar.bat Reversi.apk
dex2jar Reversi.apk -> Reversi-dex2jar.jar

.jar → .class(複数)

.jar 形式を unzip により解凍し、複数の .class ファイルを得る。

> unzip-5.51-1-bin\bin\unzip.exe Reversi-dex2jar.jar -d classes
Archive:  Reversi-dex2jar.jar
   creating: classes/android/
  …
  inflating: classes/com/mysamp/reversi/BuildConfig.class
  inflating: classes/com/mysamp/reversi/MainActivity$2.class
  inflating: classes/com/mysamp/reversi/MainActivity.class
  …

classes フォルダ内に、フォルダ階層付きで .class ファイルが展開される。

.class(複数) → .java(複数)

それぞれの .class 形式について、jad により逆コンパイルを行い、.java ファイルを生成する。

> jad158g.win\jad.exe -d ./sources -s java -r classes/**/*.class
Parsing classes/android\…/AnimatorRes.class... Generating ./sources\…\AnimatorRes.java
Parsing classes/android\…/AnimRes.class... Generating ./sources\…\AnimRes.java
 
Parsing classes/…/BuildConfig.class... Generating ./sources\…\BuildConfig.java
Parsing classes/…/MainActivity.class...………... Generating ./sources\…\MainActivity.java
…

sources フォルダ内に、フォルダ階層付きで、.java ファイルが生成される。

これで逆コンパイルが完了した。

結果を見てみる

.java ファイルがいくつか生成されていることが確認できる。
f:id:kobake:20150301014629p:plain

中身。まぁそこそこ読める。
f:id:kobake:20150301014838p:plain:w400

おしまい

用法用量を守ってお使いください。

});