tools/guloader/guloader_FixCFG.py (37 lines of code) (raw):

import idaapi import pathlib XOR_KEY = 0xB8 def get_addresses_from_tinytracer(file: pathlib.Path) -> list | None: """ Retrieves all addresses from TinyTracer log file :param file: The path to the TinyTracer log file :return: A list of addresses from TinyTracer log file None if extraction fails or encounters an exception. """ addrs = list() with open(file, "r") as file: for line in file: parts = line.strip().split(";") if len(parts) >= 2: addresses = parts[0].split("+") if len(addresses) == 2: try: address1, address2 = map(lambda x: int(''.join(c for c in x if c.isdigit() or c in 'abcdefABCDEF'), 16), addresses) result_address = int(hex(address1 + address2),16) addrs.append(result_address) except ValueError as e: print(f"Error processing line: {line.strip()}. {e}") else: print(f"Invalid format for addresses in line: {line.strip()}") else: print(f"Invalid line format: {line.strip()}") return addrs def main(file_path): for index, bp in enumerate(get_addresses_from_tinytracer(file_path)): next_addr = bp + (idaapi.get_byte(bp + 7) ^ XOR_KEY) jmp_offset = next_addr - bp - 2 print(f"\nIndex: {index}, Exception Address: {hex(bp)}") print(f"Offset byte for XOR: {hex(idaapi.get_byte(bp + 7))}") print(f"Next address: {hex(next_addr)}") print(f"Short JMP offset: {hex(jmp_offset)}") idaapi.patch_bytes(bp, bytes([0xEB, jmp_offset])) if __name__ == "__main__": file_path = idaapi.ask_file(0, "*.log", "Select TinyTracer log file") if file_path: main(pathlib.Path(file_path)) else: print("No file selected. Exiting script.")