bobuhiro11's diary

[android]Androidアプリのデコンパイル

12 Mar 2013
[Android] [apk] [java] [アプリ] [デコンパイル] [ファイル]

Android: Getting source code from an APK file

こちらのページを参考にして,.apkファイル(Androidアプリ)をデコンパイルして,javaファイル,.xmlファイル,リソースファイル抜き取りました.

デコンパイルするアプリはこのアプリを使いました.他人のアプリをデコンパイルするのはまずそうなので,自分のアプリでやってみました. ぱずうぇい - https://play.google.com/store/apps/details?id=net.bobuhiro11.puzzleroad

以下は,その手順です.殆どというか全部そのページの通りです.

Procedure for decoding .apk files, step-by-step method:
.apkをデコードする手順:

Step 1:

Make a new folder and put .apk file in it (which you want to decode). Now rename the extension of this .apk file to .zip (eg.: rename from filename.apk to filename.apk.zip) and save it. Now you get classes.dex files, etc. At this stage you are able to see drawable but not xml and java files, so continue.
新しいフォルダを作り,その中にデコードしたい.apkファイルを入れる.そして,この.apkファイルの拡張子を.zipに変更する.すると,classes.dex等のファイルを手に入れることが出来る.この時点で,drawableを見ることが出来るが,xmlやjavaファイルは見れない.

puzzle_img

Step 2:

Now extract this zip apk file in the same folder (or NEW FOLDER). Now download dex2jar from this linkhttp://code.google.com/p/dex2jar/ and extract it to the same folder (or NEW FOLDER). Now open command prompt and change directory to that folder (or NEW FOLDER). Then write dex2jar classes.dex and press enter. Now you get classes.dex.dex2jar file in the same folder. Then download java decompiler from http://java.decompiler.free.fr/?q=jdgui and now double click on jd-gui and click on open file. Then open classes.dex.dex2jar file from that folder. Now you get class files and save all these class files (click on file then click "save all sources" in jd-gui) by src name. At this stage you get java source but the xml files are still unreadable, so continue.
このzipファイルを同じフォルダに解凍する.そして,dex2jarをhttp://code.google.com/p/dex2jar/からダウンロードし,同じフォルダに解凍する.次に,コマンドプロントを開き,そのフォルダへ移動する.ここで"dex2jar classes.dex"を実行する.すると,同じフォルダに"classes.dex.dex2jar"というファイルができる.次に,http://java.decompiler.free.fr/?q=jdguiからjavaのデコンパイラをダウンロードし,jd-guiを起動し,ダイアログから"classes.dex.dex2jar"を選択する."save all sources"をクリックして,ソースコードを手に入れ,保存する.この時点で,javaソースコードを手に入れることができるが,xmlファイルはまだ読めない.
$ ./dex2jar.sh classes.dex

this cmd is deprecated, use the d2j-dex2jar if possible
dex2jar version: translator-0.0.9.13
dex2jar classes.dex -> classes_dex2jar.jar
Done.

person.class

Step 3:

Now open another new folder and put these files
次に,新しくもう一つのフォルダを開いて,これらのファイルを入れる.
  1. put .apk file which you want to decode .apkファイルを入れる.
  2. download apktool v1.x AND apktool install window using google and put in the same folder "apktool v1.x"をダウンロード,インストールし,おなじフォルダに入れる.
  3. download framework-res.apk file using google and put in the same folder (Not all apk file need framework-res.apk file) goolgeから"framework-res.apk"をダウンロードし,同じフォルダに入れる.(すべてのapkファイルがframework-res.apkを必要なわけではない.)
  4. Open a command window コマンドプロンプトを開く.
  5. Navigate to the root directory of APKtool and type the following command: apktool if framework-res.apk APKtoolのルートディレクトリへ移動して,"apktool if framework-res.apk"を実行する
  6. apktool d "fname".apk ("fname" denotes filename which you want to decode) "apktool d "fname".apk"を実行する.(fnameはデコードしたいファイル名を示す.)
now you get a file folder in that folder and now you can easily read xml files also.
ここで,そのフォルダ内のファイルを手に入れることができ,xmlファイルを簡単に読める.
$ java -jar apktool.jar d PuzzleRoad.apk

I: Baksmaling...
I: Loading resource table...
I: Loaded.
I: Decoding AndroidManifest.xml with resources...
I: Loading resource table from file: /Users/bobuhiro11/Library/apktool/framework/1.apk
I: Loaded.
I: Regular manifest package...
I: Decoding file-resources...
I: Decoding values */* XMLs...
I: Done.
I: Copying assets and libs..

$ cat PuzzleRoad/AndroidManifest.xml
$ cat PuzzleRoad/AndroidManifest.xml

<?xml version="1.0" encoding="utf-8"?>
<manifest android:versionCode="2" android:versionName="2.0" package="net.bobuhiro11.puzzleroad"
  xmlns:android="http://schemas.android.com/apk/res/android">
    <application android:theme="@style/AppTheme" android:label="@string/app_name" android:icon="@drawable/ic_launcher" android:debuggable="true" android:allowBackup="true">
        <activity android:label="@string/app_name" android:name="net.bobuhiro11.puzzleroad.MainActivity" android:screenOrientation="portrait">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:label="@string/app_name" android:name="net.bobuhiro11.puzzleroad.TitleActivity" android:screenOrientation="portrait" />
        <activity android:label="@string/title_activity_select" android:name="net.bobuhiro11.puzzleroad.SelectActivity" />
    </application>
</manifest>


Step 4:

It's not any step just copy contents of both folder(in this case both new folder)to the single one
2つのフォルダの内容を一つにコピーして,

and now enjoy with source code. ソースコードを楽しもうぜ!!

あっさり解析できてしまって驚きです.クラス名,変数名,メソッド名もそのまま見れます.

参考:

Android: Getting source code from an APK file


comments powered by Disqus < GnuPGのメモ .NETアプリのデコンパイル >