mirror of
https://github.com/Jous99/F4MP.git
synced 2026-01-13 00:00:54 +01:00
81 lines
2.9 KiB
Python
81 lines
2.9 KiB
Python
|
|
import glob
|
||
|
|
import re
|
||
|
|
import ida_funcs
|
||
|
|
import idc
|
||
|
|
|
||
|
|
def get_codebase_mapping():
|
||
|
|
codebase_mapping = {}
|
||
|
|
root_dir = "" # TiltedEvolution/Code/
|
||
|
|
globbings = ["**/*.cpp", "**/*.h", "**/*.hpp"]
|
||
|
|
for globbing in globbings:
|
||
|
|
for filename in glob.iglob(root_dir + globbing, recursive=True):
|
||
|
|
if "Utils.h" in filename or "EventDispatcher.h" in filename:
|
||
|
|
continue
|
||
|
|
|
||
|
|
with open(filename, 'r') as file:
|
||
|
|
filedata = file.read()
|
||
|
|
|
||
|
|
pointers = [m.start() for m in re.finditer('POINTER_SKYRIMSE', filedata)]
|
||
|
|
|
||
|
|
for pointer in pointers:
|
||
|
|
name_begin = filedata.find('(', pointer) + 1
|
||
|
|
name_end = filedata.find(',', name_begin)
|
||
|
|
name = filedata[name_begin:name_end]
|
||
|
|
|
||
|
|
func_begin = filedata.find(' ', pointer) + 1
|
||
|
|
id_begin = filedata.find(' ', func_begin) + 1
|
||
|
|
id_end = filedata.find(')', id_begin)
|
||
|
|
try:
|
||
|
|
id = int(filedata[id_begin:id_end])
|
||
|
|
codebase_mapping[id] = (name, filename.split('\\')[-1])
|
||
|
|
except:
|
||
|
|
print(f"Failed on {name} in {filename}")
|
||
|
|
|
||
|
|
return codebase_mapping
|
||
|
|
|
||
|
|
def get_id_address_mapping():
|
||
|
|
id_address_mapping = {}
|
||
|
|
filename = ""
|
||
|
|
with open(filename, 'r') as file:
|
||
|
|
for line in file:
|
||
|
|
id_to_address = line.split('\t')
|
||
|
|
id = int(id_to_address[0])
|
||
|
|
address = int(id_to_address[1].rstrip('\n'), 0)
|
||
|
|
id_address_mapping[id] = address
|
||
|
|
return id_address_mapping
|
||
|
|
|
||
|
|
def print_idb_functions_to_codebase(codebase_mapping, id_address_mapping):
|
||
|
|
unnamed_functions_count = 0
|
||
|
|
non_function_count = 0
|
||
|
|
|
||
|
|
for id, data in codebase_mapping.items():
|
||
|
|
address = id_address_mapping[id]
|
||
|
|
name, filename = data
|
||
|
|
|
||
|
|
func = ida_funcs.get_func(address)
|
||
|
|
if func == None:
|
||
|
|
#print(f"No function found for id {id}, function {name}, filename {filename}")
|
||
|
|
non_function_count = non_function_count + 1
|
||
|
|
continue
|
||
|
|
|
||
|
|
idb_name = ida_funcs.get_func_name(address)
|
||
|
|
demangled_idb_name = idc.demangle_name(idb_name, 8)
|
||
|
|
if demangled_idb_name != None:
|
||
|
|
idb_name = demangled_idb_name
|
||
|
|
|
||
|
|
if idb_name[0:4] == "sub_":
|
||
|
|
#print(f"No user defined function for {name}")
|
||
|
|
unnamed_functions_count = unnamed_functions_count + 1
|
||
|
|
continue
|
||
|
|
|
||
|
|
print(f"Codebase name: {name}, idb name: {idb_name}, filename: {filename}, id: {id}, address: {hex(address)}")
|
||
|
|
|
||
|
|
print(f"\nUnnamed functions: {unnamed_functions_count}, non functions: {non_function_count}")
|
||
|
|
|
||
|
|
|
||
|
|
if __name__ == "__main__":
|
||
|
|
codebase_mapping = get_codebase_mapping()
|
||
|
|
id_address_mapping = get_id_address_mapping()
|
||
|
|
print_idb_functions_to_codebase(codebase_mapping, id_address_mapping)
|
||
|
|
|