-
Notifications
You must be signed in to change notification settings - Fork 1
/
ArgumentsUnifier.py
108 lines (95 loc) · 3.51 KB
/
ArgumentsUnifier.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
#Arguments unifier
#@author dzik
#@category Diablo 2
#@keybinding
#@menupath
#@toolbar
import json
from ghidra.util.exception import CancelledException, InvalidInputException
from ghidra.program.model.listing import VariableFilter
from ghidra.program.model.symbol import SourceType
from ghidra.util.exception import DuplicateNameException
from ghidra.app.services import DataTypeManagerService
# thanks weiry6922
def exportParamName(param):
if "(" in param:
#print("Skippping function parameter")
return None, None
elif not " " in param:
#print("Skipping function pointer")
return None, None
elif "unsigned" in param:
sig, strc, name = param.split(" ")
elif "signed" in param:
sig, strc, name = param.split(" ")
elif "const" in param:
sig, strc, name = param.split(" ")
else:
strc, name = param.split(" ")
return strc, name
# thanks weiry6922
def getDataTypeManagerByName(name):
tool = state.getTool()
service = tool.getService(DataTypeManagerService)
dataTypeManagers = service.getDataTypeManagers()
for manager in dataTypeManagers:
managerName = manager.getName()
if name in managerName:
return manager
return None
# thanks weiry6922
def findDataTypeByNameInDataManager(nameDT, nameDTM):
manager = getDataTypeManagerByName(nameDTM)
allDataTypes = manager.getAllDataTypes()
while allDataTypes.hasNext():
dataType = allDataTypes.next()
dataTypeName = dataType.getName()
if dataTypeName.startswith(nameDT):
return dataType
return None
# thanks weiry6922
def findDataTypeByName(name):
dt = findDataTypeByNameInDataManager(name, currentProgram.name)
if dt == None:
dt = findDataTypeByNameInDataManager(name, u"BuiltInTypes")
if dt == None:
dt = findDataTypeByNameInDataManager(name, u"windows_vs12_32")
return dt
def retypeArgs(args):
c = 0
for arg in args:
if "{}".format(arg.getDataType()) == "int":
arg.setDataType(findDataTypeByName("int32_t"), SourceType.USER_DEFINED)
c = c + 1
if "{}".format(arg.getDataType()) == "uint":
arg.setDataType(findDataTypeByName("uint32_t"), SourceType.USER_DEFINED)
c = c + 1
if "{}".format(arg.getDataType()) == "short":
arg.setDataType(findDataTypeByName("int16_t"), SourceType.USER_DEFINED)
c = c + 1
if "{}".format(arg.getDataType()) == "ushort":
arg.setDataType(findDataTypeByName("uint16_t"), SourceType.USER_DEFINED)
c = c + 1
if "{}".format(arg.getDataType()) == "BYTE":
arg.setDataType(findDataTypeByName("int8_t"), SourceType.USER_DEFINED)
c = c + 1
return c
def main():
monitor.initialize(currentProgram.getFunctionManager().getFunctionCount())
c = 0
for func in currentProgram.functionManager.getFunctions(1):
if "{}".format(func.getEntryPoint()) == "00681a48":
break
monitor.incrementProgress(1)
monitor.setShowProgressValue(True)
# retype function arguments
args = func.getParameters()
c = c + retypeArgs(args)
# retype function return
retu = func.getReturn()
c = c + retypeArgs([retu])
print("Fixed {} argument types".format(c))
try:
main()
except CancelledException:
pass