反编译APK

APK反编译脚本

同目录下放一个bin文件夹 里边放dex2jar apktool相关文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
# coding=utf-8
import os
import shutil
import sys
import zipfile

reload(sys)
sys.setdefaultencoding('utf8')


def extract_to(z_file, path):
for p in z_file.namelist():
extract(z_file, p, path)


def extract(z_file, filename, path):
try:
if not filename.endswith('/'):
f = os.path.join(path, filename)
dir = os.path.dirname(f)
if not os.path.exists(dir):
os.makedirs(dir)
file(f, 'wb').write(z_file.read(filename))
except BaseException:
pass


file_name_postfix = ["_Jar", "_Res", "_Rar"]
file_name_dict = {}


def reverse_apk():
# 1.反编译APK 获取res AndroidManifest.xml assets资源
# 2.读取APK 解压缩获取相关签名信息
# 3.反编译APK 获取Jar资源文件
if os.path.exists("out"):
shutil.rmtree("out")
os.mkdir("out")
for file_name in os.listdir(os.getcwd()):
if file_name.endswith("apk"):
print file_name

# 创建该项目的输出目录
parent_dir = "out\\" + file_name.replace(".apk", "")
if os.path.exists(parent_dir):
shutil.rmtree(parent_dir)
os.mkdir(parent_dir)

# 创建该项目各个资源的输出路径
for postfix in file_name_postfix:
file_dir = parent_dir + "\\" + file_name.replace(".apk", "") + postfix
if os.path.exists(file_dir):
shutil.rmtree(file_dir)
os.mkdir(file_dir)
file_name_dict[postfix] = parent_dir + "\\" + file_name.replace(".apk",
"") + postfix

# 反编译APK 获取res AndroidManifest.xml assets资源
os.system("bin\\apktool\\apktool.bat d -f " + file_name)
shutil.rmtree(file_name_dict["_Res"])
os.rename(file_name.replace(".apk", ""), file_name_dict["_Res"])

# 读取APK 解压缩获取相关签名信息
try:
z_file = zipfile.ZipFile(file_name, mode='r')
extract_to(z_file, file_name_dict["_Rar"])
for rsa_file_name in os.listdir(file_name_dict["_Rar"] + "\\META-INF"):
if rsa_file_name.endswith("RSA") or rsa_file_name.endswith("rsa"):
os.rename(file_name_dict["_Rar"] + "\\META-INF\\" + rsa_file_name,
file_name_dict["_Rar"] + "\\META-INF\\CERT.p7b")
except BaseException, e:
print e
continue

# 反编译APK 获取Jar资源文件
for dex_file in os.listdir(file_name_dict["_Rar"]):
# 多dex处理
if dex_file.endswith("dex"):
cmd = "bin\\dex2jar\\d2j-dex2jar.bat --force " + file_name_dict[
"_Rar"] + "\\" + dex_file + " -o " + file_name_dict[
"_Jar"] + "\\" + dex_file.replace(".dex", ".jar")
print cmd
os.system(cmd)


# androi反编译
if __name__ == "__main__":
try:
reverse_apk()
except BaseException, e:
print e
raw_input('Press enter to exit...')