-
Notifications
You must be signed in to change notification settings - Fork 0
/
demangle.py
78 lines (69 loc) · 2.06 KB
/
demangle.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
import subprocess
import re
asmTemplate = """
.section .text
.global {func}
{func}:
bl {func}
"""
regex = re.compile(r"multiply-defined:(?:.*?)'(.*)'(?:.*?)in", re.DOTALL)
ass = ["../bfbbdecomp/tools/mwcc_compiler/2.7/mwasmeppc.exe"]
ld = ["../bfbbdecomp/tools/mwcc_compiler/2.7/mwldeppc.exe"]
subTypes = [
("char", "int8"),
("short", "int16"),
("int", "int32"),
("long long", "int64"),
("unsigned char", "uint8"),
("unsigned short", "uint16"),
("unsigned int", "uint32"),
("unsigned long long", "uint64"),
("float", "float32"),
("double", "float64"),
("long", "long32"),
("unsigned long", "ulong32"),
]
subTypes.sort(key=lambda x: -len(x[0]))
def defuckify(name):
lines = name.splitlines()
data = []
for l in lines:
while l[0] == '#':
l = l.replace('#', '', 1)
res = l.strip()
data.append(res)
res = " ".join(data).strip()
#res = res.replace(",", ", ")
return res
def escapeName(functionName):
sub = [
('<', '_esc__0_'),
('>', '_esc__1_'),
('@', '_esc__2_'),
('\\', '_esc__3_'),
(',', '_esc__4_'),
('-', '_esc__5_')
]
for s in sub:
functionName = functionName.replace(s[1], s[0])
return functionName
def demangleFunction(functionName):
#print("DEMANGLE:", functionName)
if functionName != escapeName(functionName):
return None
#functionName = escapeName(functionName)
asm = asmTemplate.replace("{func}", functionName)
open("test1.s", "w").write(asm)
open("test2.s", "w").write(asm)
subprocess.run(ass + ["test1.s"])
subprocess.run(ass + ["test2.s"])
process = subprocess.Popen(ld + ["test1.o", "test2.o"], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = process.communicate()
output = out.decode("utf-8")
#print(output)
name = regex.findall(output)
if len(name) == 0:
return None
name = defuckify(name[0])
return name
#print(demangleFunction("zSaveLoad_CardCheckSpaceSingle_doCheck__FP17st_XSAVEGAME_DATAi"))