#!/usr/bin/env python3 """ilt_resolve.py — resolve ILT dispatch stubs of soothe_mem.bin (raw dump, base 0x180000000). Stub pattern (7+7+4 bytes): 48 63 05 rel32 mov eax, [rip+rel32] ; slot index (runtime-fixed after reloc) 4c 8d 15 rel32 lea r10, [rip+rel32] ; pointer table base 41 ff 24 d2 jmp qword ptr [r10+rax*8] Resolution (all offline from the dump, post-relocation values): idx_addr = stub + 7 + rel32_a tbl_addr = stub + 14 + rel32_b impl = u64[tbl_addr + idx * 8] Usage: ilt_resolve.py [VA ...] (default: FIR-loop + main-loop stub set) """ import struct import sys BASE = 0x180000000 BIN = '/home/m/re-tools/soothe_mem.bin' _data = open(BIN, 'rb').read() def rd(va, n): off = va - BASE return _data[off:off + n] def u32(va): return struct.unpack('FIR ? 0x180002180, # complex-op A/C (float) 0x180001bb0, # complex-op A/C (double) 0x180001a90, # complex-op B/D (float) 0x1800019d0, # complex-op B/D (double) 0x180001880, # paired-scalar op 1 (flag branch) 0x180001ca0, # paired-scalar op 2 (flag branch) 0x180001df0, # final op (float) 0x180001f70, # final op (double) # import thunks of 535a70 dispatcher 0x180140a10, 0x180140a70, # main-loop transforms referenced by BLOCKMAP 0x180002030, 0x180001d30, 0x180002270, 0x1800022a0, 0x180001970, 0x180001a60, 0x180001850, 0x180002000, 0x180001c40, 0x180001fa0, 0x180001940, 0x180001f10, 0x180001c70, 0x180001d60, 0x1800019a0, 0x180001a00, ] def main(): args = [int(a, 16) if not a.startswith('0x') else int(a, 0) for a in sys.argv[1:]] or DEFAULT_STUBS print(f'{"stub":>12} {"idx@":>12} {"idx":>4} {"table":>12} {"impl":>12}') rows = [] for va in args: r = resolve_stub(va) if r is None: print(f'{va:#12x} PATTERN MISMATCH') continue rows.append(r) print(f'{r["stub"]:#12x} {r["idx_addr"]:#12x} {r["idx"]:4d} ' f'{r["tbl_addr"]:#12x} {r["impl"]:#12x}') return rows if __name__ == '__main__': main()