APKファイルの中身をのぞいてみたいこともあります。
でも手順が面倒だとやる気がうせるので一発で逆コンパイルできるようにしてみました。
事前準備
必要なツールのインストール(Macならどれもbrewでインストールできます。)
- dex2jarのインストール
- jadのインストール
- apktoolのインストール
必要なAPKの抽出
- adb pullすればぶっこ抜きできます
# APKの一覧を表示
$ adb shell pm list packages -f
# APKを指定して取得
$ adb pull /data/app/xxxxx.apk
シェルスクリプトの流れ
- 環境チェック(必要なツールがインスト−ルされているか)
- カレントディレクトリのAPKファイルを取得
- 各APKファイルに対して以下を実施
- apktoolでリソースファイルを逆コンパイル
- APKファイルを解凍
- dex2jarでclasses.dexをjarに変換
- jarファイルを解凍
- jadでソースファイルを逆コンパイル
- 各APKファイルに対して以下を実施
- APKファイルと同階層に逆コンパイル済みのディレクトリを配置
- 作業ディレクトリを削除
スクリプト
#!/bin/sh
function checkEnvironment() {
if [[ ! `which d2j-dex2jar` ]]; then
echo 'ERROR: COMMAND d2j-dex2jar does not exist'
exit 1
fi
if [[ ! `which jad` ]]; then
echo 'ERROR: COMMAND jad does not exist'
exit 1
fi
if [[ ! `which apktool` ]]; then
echo 'ERROR: COMMAND apktool does not exist'
exit 1
fi
if [[ -e $WORK_DIR ]]; then
echo "ERROR: WORK_DIR ${WORK_DIR} already exists"
exit 1
fi
}
WORK_DIR=tmp/
APK_FILES=$(find *.apk 2> /dev/null)
JAR_FILE=classes-dex2jar.jar
# 環境チェック
checkEnvironment
# カレントディレクトリのapkファイル毎に逆コンパイル
for APK_FILE in $APK_FILES
do
echo $APK_FILE
#OUTPUT_FOLDER=${APK_FILE:r}_output
OUTPUT_FOLDER=$(basename ${APK_FILE} .apk)
# リソースファイルを逆コンパイル
apktool -s d $APK_FILE -o $OUTPUT_FOLDER
mkdir $WORK_DIR
# apkファイルを解凍
unzip -d $WORK_DIR $APK_FILE
cd $WORK_DIR
# dexをjarに変換
d2j-dex2jar classes.dex
mkdir $WORK_DIR
# jarを解凍
unzip -d $WORK_DIR $JAR_FILE
# ソースファイルを逆コンパイル
jad -8 -d ../$OUTPUT_FOLDER/java -s .java -r $WORK_DIR/**/*.class
cd ../
# 作業ディレクトリ削除
rm -rf $WORK_DIR
done