deodex化とodex化

Apktoolを使う際、odex化されている場合はまずdeodex化します。


odex化とは

XXXX.apkと一緒にXXXX.odexというファイルがある場合があります。この状態はodex化されている状態でメーカー製のシステムアプリ等でされていることが多いです。
通常、apkファイルはアプリを実行する前に内部のclasses.dexファイルを自動でodex化して実行しています。
あらかじめodex化しておくことで実行速度の高速化や使用するメモリやデータ領域を削減できるメリットがあるそうです。
また、メーカー製アプリの場合はapkファイルを他端末にコピーしても動かないようにするためにodex化を行うこともあるようです。

今回はodex化されているアプリを通常のapkファイルのみの状態に戻し(deodex化)再度odex化を行う方法です。

準備するもの

  1. Apktool等
  2. 前記事で準備したファイル
  3. smali-XXX.jar, baksmali-XXX.jar
  4. oat2dex.jar
  5. dexopt-wrapper
ダウンロードしたsmali-XXX.jar, baksmali-XXX.jarはsmali.jar, baksmali.jarにリネームしておきます。

apktool━━━7za.exe
              ┣━apktool.bat
              ┣━apktool.jar
              ┣━framework
              ┣━baksmali.jar
              ┣━dexopt-wrapper
              ┣━smali.jar
              ┣━XXXX.apk ←展開、再構築したいファイル
              ┗━XXXX.odex

使い方 (Android4.4以下の場合)

deodex化

C:\apktool>java -jar baksmali.jar -x -d framework XXXX.odex
コマンド実行後、XXXX.odexが展開されたファイルがoutフォルダ内に作成されます。
このままclasses.dexに変換します。
C:\apktool>java -jar smali.jar out -o classes.dex
classes.dexが出力されたらapkファイルに追加する。
C:\apktool>7za.exe u -tzip -mx=0 XXXX.apk classes.dex
以上でdeodex化は完了です。通常のapkファイルとして扱えます。必要であればapktoolで展開、再構築を行います。


再odex化
スマートホン内での作成になります。
adb push dexopt-wrapper /data/local/tmp/
C:\apktool>adb push XXXX.apk /data/local/tmp/
C:\apktool>adb shell
$ cd /data/local/tmp
$ chmod 755 dexopt-wrapper
$ ./dexopt-wrapper XXXX.apk XXXX.odex
$ dd if=/system/app/<元々あるXXXX.odex> of=XXXX.odex bs=1 count=20 skip=52 seek=52 conv=notrunc
ddコマンドでファイルの署名部分を移植しているらしい。
これで/data/local/tmp/にXXXX.odexが作成されます。
$ su
# mount -o rw,remount /system
# cp -p XXXX.odex /system/app/XXXX.odex

使い方 (Android5 Lollipopの場合)

前準備

C:\apktool>java -jar oat2dex.jar boot framework/arm/boot.oat

deodex化
C:\apktool>java -jar oat2dex.jar XXXX.odex framework/arm/dex
コマンド実行後、XXXX.dexが出力されるのでclasses.dexにリネームする。
C:\apktool>7za.exe u -tzip -mx=0 XXXX.apk classes.dex
以上でdeodex化は完了です。通常のapkファイルとして扱えます。必要であればapktoolで展開、再構築を行います。


再odex化(できない?)
Lollipopの場合、再odex化の方法は調べても分からなかった。
そのため、編集を行ったapkファイルは今のところdeodexの状態で使うしか方法がないようです。

使い方(Android6以上の場合)

baksmali_v2.1.0以上を使用します。
実際に試す環境がないため省略


Lollipop以上の場合は再度odex化できない(?)やり方があれば教えて欲しいです。



1 件のコメント :

managed it services さんのコメント...

nice blog.