pcsx-redux/tools/ghidra_scripts/export_overlay_to_redux.py

79 lines
2.7 KiB
Python

"""
# Improved version of "export_to_redux.py" script by Nicolas
# that supports overlays filtering with GUI component
# Usage:
# 1. Run the script.
# 2. Paste the main function address.
# 3. Select PCSX-Redux Folder.
# 4. Select the overlays you need, the only selected overlays symbols will be exported.
"""
#@author Nicolas "Pixel" Noble
#@author acemon33
import os
from ghidra.program.model.data import DataType, Pointer, Structure
selected_overlays = []
memory_block_list = []
filter_list = []
def find_overlays():
for mem in currentProgram.getMemory().getBlocks():
if mem.isOverlay():
memory_block_list.append(mem.getName())
def filter_memory_block():
for memory_block_name in selected_overlays:
filter_list.append(memory_block_name + '::')
def print_overlays():
for i in range(0, len(memory_block_list)):
print(i + 1, memory_block_list[i])
main_address = int(str(askAddress("Enter the main Address", "Address")), 16)
root_dir = askDirectory("Select PCSX-Redux Directory", "Select")
fm = currentProgram.getFunctionManager()
dtm = currentProgram.getDataTypeManager()
find_overlays()
selected_overlays = askChoices("Title", "Message", memory_block_list);
filter_memory_block()
print('main: ', hex(main_address))
print('Selected Modules : ', selected_overlays)
filename = os.path.join(str(root_dir), 'redux_data_types.txt')
with open(filename, 'w') as f:
# @todo: enums, typedefs, etc.
for data_type in dtm.getAllStructures():
dt_info = data_type.getName() + ';'
for component in data_type.getComponents():
type_name = component.getDataType().getName()
field_name = component.getFieldName()
if field_name == None:
field_name = 'None'
field_length = str(component.getLength())
dt_info += type_name + ',' + field_name + ',' + field_length + ';'
f.write(dt_info + '\n')
filename = os.path.join(str(root_dir), 'redux_funcs.txt')
with open(filename, 'w') as f:
for func in fm.getFunctions(toAddr(main_address), True):
entry_point = func.getEntryPoint().toString()
in_overlay = entry_point.find('::')
if (in_overlay == -1) or (entry_point[:in_overlay+2] in filter_list):
num_addr = int(entry_point.split(':')[-1], 16)
func_info = entry_point.split(':')[-1] + ';' + func.getName() + ';'
for param in func.getParameters():
data_type_name = param.getDataType().getName()
if data_type_name.__contains__('undefined'):
data_type_name = 'int'
func_info += data_type_name + ',' + param.getName() + ',' + str(param.getLength()) + ';'
f.write(func_info + '\n')
popup('Finish')