APK に classes.dex を統合するには?(deodex)
大体のファームウェアでは、CRB Android Kitchen を使えばできますが、有料だし、なんなら正常に deodex 出来ないものもあります。
今回の記事では、smali と baksmali を使用しますが、検索してすぐ出てくるような記事とはやり方が異なります。
それで出来たらこの記事書く意味無いので...
では、解説していきます。
前提
- JDK17 及び Linux
Windows でも PowerShell を使えばできますが、再現が面倒なので書きません。 -
smali と baksmali
https://bitbucket.org/JesusFreke/smali/downloads/ -
dex2jar
https://github.com/pxb1988/dex2jar
コマンド化して直接実行できるようにしたください。
今回使用するファームウェアは、MTK製の Android 7.0 です。
知る人ぞ知る、TAB-A04-BR3 です(笑)
また、VDEX については無知なので無理です。
解説
フレームワーク
classes.dex化したい人は、APKの手順を参照してください。
まず、framework フォルダ内を全てコピーします。
そして、oatフォルダ内にある全てのアーキテクチャを確認します。
アーキテクチャ毎に順番に smali 化します。
例えば、oat の中が、arm と arm64 の場合、
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
更に、jadx や decompiler.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 にあるアーキテクチャのOATとARTをコピーします。
アーキテクチャが複数ある場合は順番に行ってください。
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