Android一键反编译apk脚本

629 阅读2分钟

本文章结合apktool + dex2jar命令,写一个脚本,让开发者更无脑反编译。

所以使用方法和原理之类,略带过。


Apktool

下载apktool

ibotpeaches.github.io/Apktool/ins…

官网其实已经写得挺清楚

image.png

apktool用法

  • 把脚本保存为apktool(很多时候,mac保存文本时,会自动追加拓展名txt)
  • jar改名为apktool.jar
  • 脚本&jar复制到/usr/local/bin/
  • chmod -x 修改文件权限
  • 执行命令反编译apk(apktool d *.apk

(笔者下载2.6.1版本)


dex2jar

下载dex2jar

github.com/pxb1988/dex…

  • 下载后解压

image.png

笔者下载的是2.1版本

dex2jar用法

  • 1.修改脚本d2j_invoke.shd2j_invoke.bat
java -Xms512m -Xmx1024m
修改为
java -Xms8g -Xmx8g

以防dex太大报错out of memory

  • 2.把apk解压,里面有classes.dex等dex文件
  • 3.dex2jar命令:sh dex2jar.sh *.dex

一键脚本

按上面步骤,把下载文件放到/反编译/目录(目录名随便起)。 放需要反编译的apk到目录里

image.png

先上脚本代码,把下面代码保存为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查看

image.png

  • /app-release-unsigned_apktool_decompile放apktool反编译的文件

image.png

  • 备份顾名思义,备份apktool源文件

清理文件

如果使用完了,多余文件(例如反编译的文件)想清理。 执行sh decompile.sh clear即可