#!/usr/bin/env python3 """iat_name.py — resolve imported-function names for bigkernel dispatch targets. Reads runtime IAT values, finds owning module, parses PE exports.""" import struct, subprocess, sys, time import glob, os BASE=0x180000000 data=open('/home/m/re-tools/soothe_mem.bin','rb').read() def rd(fd,a,n): try: return os.pread(fd,n,a) except OSError: return None def find_host(): for p in glob.glob('/proc/[0-9]*'): pid=int(os.path.basename(p)) try: cmd=open('/proc/%d/cmdline'%pid,'rb').read().replace(b'\0',b' ').decode('utf8','replace') maps=open('/proc/%d/maps'%pid).read() except Exception: continue if 'soothe2' in maps and 'reaper' not in cmd: return pid return None def iat_slot(stub): # pattern: mov rax,[rip+rel] (48 8b 05 rel32) off=stub-BASE b=data[off:off+7] if b[:2]!=b'\x48\x8b': return None rel=struct.unpack(' {name: rva}""" try: f=open(path,'rb').read() except Exception: return {} if f[:2]!=b'MZ': return {} pe=struct.unpack(' IAT slot print(' L2: tgt=%x' % tgt, flush=True) if 0x180000000 <= tgt < 0x187000000: off2=tgt-BASE b2=data[off2:off2+7] if 0<=off2%x runtime=%x owner=%s' % (stub,tbl,tgt,ow[2] if ow else '?'),flush=True) if ow: lo,rva,path=ow exps=pe_exports(path) best=[nm for nm,r in exps.items() if r==rva] print(' export:',best,flush=True) os.close(fd)