本文章结合apktool + dex2jar命令,写一个脚本,让开发者更无脑反编译。
所以使用方法和原理之类,略带过。
Apktool
下载apktool
ibotpeaches.github.io/Apktool/ins…
官网其实已经写得挺清楚
apktool用法
- 把脚本保存为
apktool(很多时候,mac保存文本时,会自动追加拓展名txt) - jar改名为
apktool.jar - 脚本&jar复制到
/usr/local/bin/ chmod -x修改文件权限- 执行命令反编译apk(
apktool d *.apk)
(笔者下载2.6.1版本)
dex2jar
下载dex2jar
- 下载后解压
笔者下载的是2.1版本
dex2jar用法
- 1.修改脚本
d2j_invoke.sh、d2j_invoke.bat
java -Xms512m -Xmx1024m
修改为
java -Xms8g -Xmx8g
以防dex太大报错out of memory
- 2.把apk解压,里面有
classes.dex等dex文件 - 3.dex2jar命令:
sh dex2jar.sh *.dex
一键脚本
按上面步骤,把下载文件放到/反编译/目录(目录名随便起)。
放需要反编译的apk到目录里
先上脚本代码,把下面代码保存为decompile.sh放到/反编译/:
# 各种目录
apkPath=$(ls *.apk | head -1)
apkName=${apkPath/.apk}
apktoolDecompileDir="${apkName}_apktool_decompile"
apkUnzipDir="${apkName}_unzip"
# ---------- 清理 ----------
# 修改分隔符IFS
OLDIFS=$IFS
IFS=$'\n'
# 遍历删除所有目录(除备份目录)
for file in $(ls)
do
if [[ -d $file && $file != "备份" ]];then
echo $file
rm -rf $file
fi
done
if [ "$1" == "clear" ];then
exit 0
fi
# ---------- 备份 ----------
# 备份已存在 or 备份目录空
if [[ ! -d "备份" || $(ls -A "备份") == "" ]];then
echo "正在备份..."
mkdir "备份"
cp apktool*.jar "备份/"
cp apktool.* "备份/"
else
echo "已有备份"
fi
#exit 0
# --------------------
# 先让用户输入密码
echo "请输入密码"
sudo echo
# 纠正apktools文件名,并赋值到系统目录
mkdir /usr/local/bin/
mv apktool*.jar apktool.jar
sudo mv apktool.jar /usr/local/bin/
# 有可能apktool或apktool.txt
mv apktool.* apktool
sudo mv apktool /usr/local/bin/
sudo chmod +x /usr/local/bin/apktool*
# 看看apktool目录对不对
echo "which is apktool: "
echo $(which is apktool)
echo "-------"
# 解压dex2jar
unzip -o dex2jar-*.zip
# 找到d2j-dex2jar.sh路径
dex2jar=$(find . -name d2j-dex2jar.sh)
dex2Dir=${dex2jar///d2j-dex2jar.sh}
d2j_invoke="$dex2Dir/d2j_invoke.sh"
# dex2jar目录下文件权限
sudo chmod +x $dex2Dir/*
# 修改jvm配置
echo "$(sed 's/Xms512m/Xms8g/g' $d2j_invoke)" > $d2j_invoke
echo "$(sed 's/Xmx2048m/Xmx8g/g' $d2j_invoke)" > $d2j_invoke
echo dex2Dir=$dex2Dir
# 解压apk
unzip -d "$apkUnzipDir" -o $apkPath
# apktool反编译
apktool d $apkPath -o $apktoolDecompileDir
# dex -> jar
echo PWD=$PWD
for dex in $apkUnzipDir/*.dex
do
echo dex文件=$dex
sh $dex2jar $dex
done
# ls classes*-dex2jar.jar
mkdir dex2jar
# 把dex2jar反编译文件,移到指定目录
mv classes*-dex2jar.jar ./dex2jar
# 清理文件
rm -rf $apkUnzipDir
#rm -rf $dex2Dir
执行命令sh decompile.sh
执行完后,会多了/dex2jar、/app-release-unsigned_apktool_decompile、备份 几个目录。
/dex2jar放反编译dex文件的jar,可以用jd-gui查看
/app-release-unsigned_apktool_decompile放apktool反编译的文件
备份顾名思义,备份apktool源文件
清理文件
如果使用完了,多余文件(例如反编译的文件)想清理。
执行sh decompile.sh clear即可