📦

APK に classes.dex を統合するには?(deodex)

2024/06/05に公開

大体のファームウェアでは、CRB Android Kitchen を使えばできますが、有料だし、なんなら正常に deodex 出来ないものもあります。

今回の記事では、smalibaksmali を使用しますが、検索してすぐ出てくるような記事とはやり方が異なります。
それで出来たらこの記事書く意味無いので...

では、解説していきます。


前提

コマンド化して直接実行できるようにしたください。

今回使用するファームウェアは、MTK製の Android 7.0 です。
知る人ぞ知る、TAB-A04-BR3 です(笑)

また、VDEX については無知なので無理です。

解説

フレームワーク

classes.dex化したい人は、APKの手順を参照してください。

まず、framework フォルダ内を全てコピーします。
そして、oatフォルダ内にある全てのアーキテクチャを確認します。
アーキテクチャ毎に順番に smali 化します。

例えば、oat の中が、armarm64 の場合、

cd [FRAMEWORK]
# まずは arm
cp -f arm/* .
cp -f oat/arm/* .
find -maxdepth 1 -name "*.o*" -exec baksmali x {} \;
rm -f *.odex *.oat *.art
# つぎに arm64
cp -f arm64/* .
cp -f oat/arm64/* .
find -maxdepth 1 -name "*.o*" -exec baksmali x {} \;
rm -f *.odex *.oat *.art

これで out フォルダが作成され、各クラスの中に .smali が作成されるはずです。

ただ、さすがに smali 形式では可読性が壊滅的にゴミなので、これを class 化します。

cd out
find -type f -name "*.smali" | while read -r file; do
  smali a $file
  dex2jar out.dex
  unzip -o -qq out-dex2jar.jar
  rm -f out.dex out-dex2jar.jar
done

更に、jadxdecompiler.com 等でデコンパイル出来るようにしたいので、1つのファイルにまとめます。
ただ、.smali が邪魔なので削除します。

find -type f -name "*.smali" -exec rm -f {} \;

消したら統合します

zip framework -r *

これで framework.zip (android.jar) が出来ます。

後はこれを デコンパイルツールに投げれば終わりです。

APK

APKの場合もほぼ同じです。

Launcher3/
├── Launcher3.apk
└── oat
    └── arm64
        └── Launcher3.odex

このような構造の場合、APK と ODEX を framework にコピーします。
そして、framework にあるアーキテクチャのOATARTをコピーします。
アーキテクチャが複数ある場合は順番に行ってください。

cp -f [APK] [FRAMEWORK]
cp -f [ODEX] [FRAMEWORK]
cd [FRAMEWORK]
cp -f arm64/* .

smali 化します

baksmali x [ODEX]

class 化します

cd out
find -type f -name "*.smali" | while read -r file; do
  smali a $file
  dex2jar out.dex
  unzip -o -qq out-dex2jar.jar
  rm -f out.dex out-dex2jar.jar
done
find -name "*.smali" -exec rm -f {} \;

zip にします

zip classes -r *

ここから手順が異なります。
Android SDK の build-tools に含まれる dx, zipalign, apksigner コマンドを使用します。

dx --dex --output=classes.dex classes.zip

APKに含めたい場合は、

zip [APK] classes.dex
zipalign -pvf 4 [APK] [APK-Aligned]
apksigner --cert [PUBKEY] --key [PRIVKEY] [APK-Aligned]

apksigner の使い方は人によって異なるので各自で署名してください。

Discussion