-
Notifications
You must be signed in to change notification settings - Fork 15
/
decomp_helper.py
132 lines (124 loc) · 3.57 KB
/
decomp_helper.py
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
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
import os,pyperclip
def del_all(pn:str):
if os.path.isdir(pn):
for fn in os.listdir(pn):
fn = os.path.join(pn,fn)
del_all(fn)
try:
os.rmdir(pn)
except Exception:
pass
return
try:
os.remove(pn)
except Exception:
pass
def move_all(pn_from,pn_to):
for fn in os.listdir(pn_from):
fn_from = os.path.join(pn_from,fn)
fn_to = os.path.join(pn_to,fn)
if os.path.exists(fn_to) and os.path.isdir(fn_from):
move_all(fn_from,fn_to)
try:
os.rmdir(fn_from)
except Exception:
pass
continue
try:
os.rename(fn_from,fn_to)
except Exception:
continue
glb_jar_list = []
def decomp_dex(fn,pn_dex2jar):
pn,name = os.path.split(fn)
name,_ = name.rsplit('.',1)
fn_to = os.path.join(pn,f'{name}.jar')
os.chdir(pn_dex2jar)
cmd = f'd2j-dex2jar.bat -o "{fn_to}" "{fn}"'
print(cmd)
os.system(cmd)
if os.path.exists(fn_to):
glb_jar_list.append(fn_to)
os.remove(fn)
def decomp_apk(fn_from,pn_to,pn_apktool,pn_dex2jar):
try:
del_all(pn_to)
os.makedirs(pn_to)
except Exception:
pass
os.chdir(pn_apktool)
cmd = f'apktool.bat d -s -f "{fn_from}" -o {pn_to}'
print(cmd)
os.system(cmd)
unk = os.path.join(pn_to,'unknown')
if os.path.exists(unk):
move_all(unk,pn_to)
os.rmdir(unk)
decomp(pn_to,pn_to,pn_apktool,pn_dex2jar)
def decomp(fn_from,pn_to,pn_apktool,pn_dex2jar):
if os.path.isdir(fn_from):
for fn in os.listdir(fn_from):
t_from = os.path.join(fn_from,fn)
t_to = os.path.join(pn_to,fn)
decomp(t_from,t_to,pn_apktool,pn_dex2jar)
return
pn_from,fn = os.path.split(fn_from)
try:
name,suf = fn.rsplit('.',1)
except Exception:
return
if suf == 'jar':
glb_jar_list.append(fn_from)
return
if pn_to == fn_from:
pn_to = os.path.join(pn_from,f'{name}_{suf}')
if suf == 'apk':
decomp_apk(fn_from,pn_to,pn_apktool,pn_dex2jar)
return
if suf == 'dex':
decomp_dex(fn_from,pn_dex2jar)
if suf == 'smali':
os.chdir(pn_apktool)
cmd = f'smali2java -path_to_smali "{fn_from}"'
print(cmd)
os.system(cmd)
os.remove(fn_from)
return
if suf in {'zip','7z'}:
os.makedirs(pn_to,exist_ok=True)
os.chdir(pn_to)
cmd = f'7z x "{fn_from}"'
print(cmd)
os.system(cmd)
decomp(pn_to,pn_to,pn_apktool,pn_dex2jar)
return
def decomp_jar(fn):
print('-'*48)
print('jar file (copyed):',fn)
pyperclip.copy(fn)
name,_ = fn.rsplit('.',1)
fn_to = name + '.src.zip'
print('save the sources to:',fn_to)
os.system('pause')
if not os.path.exists(fn_to):
print('source ignored')
return
os.remove(fn)
os.makedirs(fn)
os.chdir(fn)
cmd = f'7z x "{fn_to}"'
print(cmd)
os.system(cmd)
os.remove(fn_to)
return fn
def main(apk_from,path_to,pn_apktool,pn_dex2jar):
decomp_apk(apk_from,path_to,pn_apktool,pn_dex2jar)
while glb_jar_list:
t = []
for fn in glb_jar_list:
t.append(decomp_jar(fn))
glb_jar_list.clear()
for fn in t:
if fn is None:continue
decomp(fn,fn,pn_apktool,pn_dex2jar)
os.chdir(path_to)