"""ADVERSARIAL VERIFY BATCH 4.

 T1 dim4 claim 4: exactly six HAS_DUPLICATE code sites; five publish (item+0x10 != 0),
    one hardcodes 0. My independent objdump census found SIX sites:
      0x1800439e4, 0x18008481d (direct lea on literal 0x1801f6510)
      0x1800943ce, 0x180094c24, 0x18009661c, 0x180097400 (via ptr slot 0x1802a1ff8)
    Note 0x18009bc40 is NOT among them, yet the claim lists FUN_18009bc40 as a
    HAS_DUPLICATE publisher. Resolve containing functions and settle it.
 T2 dim4 claim 5: FUN_180127cc0 pile serializer -- record+0x08 switch 5/6/else,
    atoms 0x16b/0x15c/0x226/0x2fe/0x331/0x330/0x262/0x87. Ladder + full decompile.
 T3 dim5 claim 5: the three claimed consumers of model vt+0x4d8 (0x18011c200).
    Enumerate ALL xrefs to 0x18011c200 and to the accessor address, and list callers.
 T4 dim5 claim 6 ATTACK: who writes model+0x5a38's begin/end? dim5 says unknown and
    guesses starterPack. Enumerate callers of the vt+0x160 accessor 0x18011b780 and
    check whether the CreatePack/purchased deserializers push into it.
"""
import traceback
try:
    print("=== T1 containing functions of the six HAS_DUPLICATE sites ===")
    for a in (0x1800439e4, 0x18008481d, 0x1800943ce, 0x180094c24, 0x18009661c, 0x180097400):
        f = func(a)
        print("  %#x -> %s @ %#x" % (a, f.getName() if f else "NONE",
                                     int(f.getEntryPoint().getOffset()) if f else 0))
    f = func(0x18009bc40)
    print("  FUN_18009bc40 body = %s" % (f.getBody() if f else None))
    print("  any HAS_DUPLICATE site inside FUN_18009bc40? ",
          any(f.getBody().contains(addr(a)) for a in
              (0x1800439e4, 0x18008481d, 0x1800943ce, 0x180094c24, 0x18009661c, 0x180097400)))

    print()
    print("=== T3 xrefs to the vt+0x4d8 accessor 0x18011c200 (count getter) ===")
    for frm, typ, fn, ent in xrefs_to(0x18011c200):
        print("   from %#x %s in %s @ %#x" % (frm, typ, fn, ent))
    print("=== T4 xrefs to the vt+0x160 accessor 0x18011b780 (claim vector) ===")
    xs = xrefs_to(0x18011b780)
    print("   total xrefs: %d" % len(xs))
    for frm, typ, fn, ent in xs:
        print("   from %#x %s in %s @ %#x" % (frm, typ, fn, ent))

    print()
    for a, t in [(0x180127cc0, "T2 pile/itemData request serializer"),
                 (0x18013bd40, "shared purchased/massinfo body (does it push into vt+0x160?)")]:
        s = dec(a)
        print("=" * 100)
        print("### DECOMPILE %s %#x len=%d" % (t, a, len(s)))
        print("=" * 100)
        print(s)
        print("### END %#x len=%d PRINTED IN FULL" % (a, len(s)))
except Exception:
    traceback.print_exc()
