- Created `crusader_segment_coverage_ledger.csv` to track segment coverage status, types, and known functions. - Introduced `plan-mid.md` as a mid-project tracker outlining progress, objectives, and implementation priorities for the decompilation effort. - Added scripts in `pyghidra_plans` to assist with instruction window dumping and reference inspection for the object at `0x4588`. - Implemented functionality to scan for instruction uses of specific targets related to the decompilation project.
76 lines
No EOL
1.9 KiB
Python
76 lines
No EOL
1.9 KiB
Python
TARGETS = [
|
|
"0004:5b8c",
|
|
"0004:5bbf",
|
|
"0004:5ea7",
|
|
"0004:6430",
|
|
"0009:92ad",
|
|
"0009:b1cd",
|
|
"000a:493e",
|
|
"000a:4a68",
|
|
"000a:b9e5",
|
|
"000a:ba66",
|
|
"000d:9d5e",
|
|
"000d:a3b7",
|
|
]
|
|
|
|
BEFORE_COUNT = 6
|
|
AFTER_COUNT = 8
|
|
|
|
|
|
listing = program.getListing()
|
|
address_factory = program.getAddressFactory()
|
|
|
|
|
|
def as_address(text):
|
|
segment_text, offset_text = text.split(":")
|
|
return address_factory.getAddress(f"{segment_text}:{offset_text}")
|
|
|
|
|
|
def collect_window(center):
|
|
instructions = []
|
|
|
|
current = listing.getInstructionContaining(center)
|
|
if current is None:
|
|
current = listing.getInstructionAt(center)
|
|
if current is None:
|
|
current = listing.getInstructionBefore(center)
|
|
if current is not None and current.getNext() is not None and current.getNext().getAddress() <= center:
|
|
current = current.getNext()
|
|
if current is None:
|
|
return instructions
|
|
|
|
cursor = current
|
|
for _ in range(BEFORE_COUNT):
|
|
cursor = cursor.getPrevious()
|
|
if cursor is None:
|
|
break
|
|
if cursor is None:
|
|
cursor = current
|
|
while cursor.getPrevious() is not None and len(instructions) < BEFORE_COUNT:
|
|
cursor = cursor.getPrevious()
|
|
|
|
while cursor is not None:
|
|
instructions.append(cursor)
|
|
if cursor == current:
|
|
break
|
|
cursor = cursor.getNext()
|
|
|
|
cursor = current.getNext()
|
|
while cursor is not None and len(instructions) < BEFORE_COUNT + AFTER_COUNT + 1:
|
|
instructions.append(cursor)
|
|
cursor = cursor.getNext()
|
|
|
|
return instructions
|
|
|
|
|
|
for target_text in TARGETS:
|
|
target = as_address(target_text)
|
|
print(f"=== {target} ===")
|
|
window = collect_window(target)
|
|
if not window:
|
|
print("<no instruction window>\n")
|
|
continue
|
|
for insn in window:
|
|
marker = "=>" if insn.getAddress() == target else " "
|
|
print(f"{marker} {insn.getAddress()} {insn}")
|
|
print("") |