【Android】APKのデコンパイルまとめ

公開日: : 最終更新日:2014/04/20 Android, Hack, 備忘録 , ,

AndroidのプロジェクトをパッケージングしたAPKファイルをデコンパイル(Javaのソースコードを復元)する方法について、備忘録として記しておきます。。。

 

APKJavaを復元するわけですが、いくつかステップを踏む必要があります。流れを以下に示します。

  1. APKファイルからdexファイルを取り出す。
  2. dexファイルからjarファイルを復元する。
  3. jarファイルからclassファイルを取り出す。
  4. classファイルからJavaファイルを復元する。

ちょっとめんどくさそうだけど、APKファイル、jarファイルはただzip圧縮されたものなので、zip解凍するだけなのです。。。
その他の工程も、ツールを用いてそれぞれ「dexファイル→jarファイル」、「classファイル→Javaファイル」へと復元するだけ。すぐできちゃいます。

ということで順に見ていきます。。。

1.APKファイルからdexファイルを取り出す。

APKファイルはzip圧縮されたものなので、zip解凍します。(Windowsの場合、拡張子をzipに書き換えないと認識してくれないかもしれません。)すると、jarファイルを圧縮したものであるclass.dexが生成されました。これをゴニョゴニョしていきます。

2.dexファイルからjarファイルを復元する。

dexファイルからjarファイルを復元するには、ツール(dex2jar)を利用します。リンク(https://code.google.com/p/dex2jar/downloads/list)からダウンロードし、解凍しておく。

解凍すると、batファイルやshファイルが出てくるが、Windows環境の場合は、「dex2jar.bat」、Mac,Linux環境の場合は「dex2jar.sh」を用いる。今回はWindows環境で試してみる。方法は、dex2jarを実行する際の引数に、先程取り出したclass.dexを指定するだけ。コマンドプロンプトで下記のように打ち込み、実行する。(パスは適宜変更してください。)

D:\hack\dex2jar-0.0.9.15> dex2jar.bat sample/classes.dex

すると、classes.dexファイルからclasses_dex2jar.jarファイルがclass.dexと同じディレクトリに生成されます。

dex2jar version: translator-0.0.9.15
dex2jar sample\classes.dex -> sample\classes_dex2jar.jar
Done.

3.jarファイルからclassファイルを取り出す。

生成されたclasses_dex2jar.jarは、classファイル一式をzip圧縮したものなので、1.と同様の手順でzip解凍すればよい。

すると、classファイルが色々入ったネームスペースのディレクトリが生成されます。

4.classファイルからJavaファイルを復元する。

最後に、classファイルからJavaファイルを復元するが、これもツール(JAD Java Decompiler)を用います。リンク(http://varaneckas.com/jad/)より、各自のプラットフォームにあったパッケージをダウンロードし、解凍しておく。

Windowsの場合実行ファイルjad.exeが生成されるはずなので、コマンドプロンプトから、引数を指定してjad.exeを実行する。。。
実行例は下記のようになる。

#> [jad.exeのパス] -8 -d [出力パス] -s .java -r [classファイルパス]
D:\hack\jad/> jad.exe -8 -d ./output -s .java -r sample/com/example/hoge/*.class

各オプションの詳細は下記の通り。

-8: UnicodeからANSIにコンバート
-d: 出力のディレクトリパス指定
-s: 出力ファイルの拡張子指定(デフォルトは.jad)
-r: 変換するクラスファイルパス

実行すると、-dオプションで指定したディレクトリ以下に復号されたjavaファイルが生成されます。

んで生成されたjavaのコードを見てみると、ほぼまんま復元されてます。そして、条件文の箇所がGOTO文になってます。。。

もし難読化処理とかしてなかったら思いッきりもろバレですね。。。ということで難読化の大切さ、ハードコードのよろしくないことも実感されますです。。。

 

GoogleAdsense

関連記事

PHPのextensionが読み込まれない問題…

大したあれではないが、ちょっと詰まったのでメモ。。。 事のぼったんは久々にWordPressを

記事を読む

dordoidくん

【Android】難読化ツールProguard設定まとめ

Android開発環境の1つであるEclipseでは、標準でAndroidプロジェクトの難読化ツール

記事を読む

openssh

SSH CA認証まとめ

SSHでの接続を、CA認証でやってみる。 備忘録として残しておくの。。。 概要 Ope

記事を読む

john the ripper

パスワードクラックツール JOHN THE RIPPER 使い方まとめ

パスワードクラッキングツールである「JOHN THE RIPPER」の使い方を備忘録としてまとめてお

記事を読む

【Androidエラー】Conversion to Dalvik format failed with error 1

Androidにおいて、アプリケーションを作成し終え、いざパッケージをエクスポートっ!!というところ

記事を読む

nerdtree

Vimプラグイン「NERDTree」設定・コマンド備忘録

Vimのプラグインである「NERDTree」について、設定・コマンドを備忘録としてまとめておきます。

記事を読む

hydra

クラックツールHydraでベーシック認証を突破してみる

kali linuxにデフォルトでインストールされているツール「Hydra」を利用して、ベーシック認

記事を読む

Win7, 64bit環境でのcocos2d-x環境構築まとめ

さて、いままでJavaオンリーでゴリゴリとアプリリリースしてきたわけですが、ゲームを作るとなると、ど

記事を読む

android_kitkat

Android4.4(API19)KitKatでのGraphicalLayout,AdMob問題

Androidの新バージョンKitKatがリリースされてもう結構経つが、いまさら我が開発環境でも導入

記事を読む

bash設定ファイルについてまとめてみた

仮想環境を組んだ時に、環境変数が所どころ未設定なことがあった。 環境変数の設定にはbashの設定フ

記事を読む

GoogleAdsense

Message

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください

GoogleAdsense

PAGE TOP ↑