import struct,bisect
exec(open('/tmp/claude-0/-root-ants/f0a0d69c-fbe4-4887-8c0d-a5302a0da398/scratchpad/x86bridge.py').read().split("print('\\n--- registration")[0])
import capstone
sm=open(SYM,'rb').read(); n,=struct.unpack_from('<I',sm,0)
starts=[]; size={}
for i in range(n):
    a,s=struct.unpack_from('<QI',sm,4+i*12); starts.append(a); size[a]=s
starts.sort()
CODEREG=0x1d3728c
mpCount=u32(CODEREG); mpPtr=u32(CODEREG+4)
MP=struct.unpack_from('<%dI'%mpCount,B,va2off(mpPtr))
def owner(va):
    i=bisect.bisect_right(starts,va)-1; return starts[i]
A2N={}
SLIT={}
for ti,t in enumerate(TYPES):
    ns,nm=S(t[1]),S(t[0]); cls=(ns+'.' if ns else '')+nm
    for k in range(t[20]):
        m=METHODS[t[13]+k]; a=MP[m[6]] if m[6]<mpCount else 0
        if a: A2N.setdefault(a,'%s::%s'%(cls,S(m[0])))
def name(tgt): return A2N.get(tgt) or A2N.get(owner(tgt)) or ('sub_%x'%tgt)
SR=17749856; sz=size.get(SR,0); o=va2off(SR)
md=capstone.Cs(capstone.CS_ARCH_X86, capstone.CS_MODE_32); md.detail=True
insns=list(md.disasm(B[o:o+sz], SR))
# show the ~30 insns before GetDeviceHash call to see how ebp is built + what DataSection.Get is read
gi=None
for i,ins in enumerate(insns):
    if ins.mnemonic=='call' and ins.op_str.startswith('0x') and int(ins.op_str,16)==17760247: # GetDeviceHash
        gi=i; break
for ins in insns[max(0,gi-45):gi+1]:
    ann=''
    if ins.mnemonic=='call' and ins.op_str.startswith('0x'):
        ann='   ; '+name(int(ins.op_str,16))
    print('0x%08x  %-8s %s%s'%(ins.address,ins.mnemonic,ins.op_str,ann))
