"""Q1/Q3: trade-pile capacity literals -- who READS them? HYPOTHESIS: TRADE_PILE_SIZE is an OUTPUT name only (published by FUN_18000d550), exactly like IS_TRADING_ENABLED, and is therefore NOT a Blaze client-config key the DLL ever looks up. CONTROL (same form): IS_TRADING_ENABLED (0x1801fc118) is PROVEN output-only -- exactly one rip-relative reference in .text, a `lea` inside the publisher. If my scanner reproduces that exact result for IS_TRADING_ENABLED, the scanner is good. SECOND CONTROL: a literal that IS read/compared somewhere, to prove the scanner can see a consumer at all. I use the route string "/transfermarket?..." which must be referenced by a request builder, and the atom-name strings. METHOD, form-independent: I do NOT grep for `== 0x` or trust Ghidra's xref db. For every byte offset in .text I read the 4 bytes as a little-endian int32 and test whether text_base+i+4+disp equals the target. That catches lea/mov/cmp/push in EVERY rip-relative encoding. Separately I search .rdata/.data for the absolute 8-byte pointer, which catches vtable slots and pointer tables. """ import struct, traceback try: def sect(name): for b in mem.getBlocks(): if b.getName() == name: return int(b.getStart().getOffset()), int(b.getEnd().getOffset()) - int(b.getStart().getOffset()) + 1 return None, None TB, TS = sect(".text") print("text base %#x size %#x" % (TB, TS)) TEXT = read_bytes(TB, TS) print("read text len", len(TEXT)) RB, RS = sect(".rdata") RDATA = read_bytes(RB, RS) DB, DS = sect(".data") DATA = read_bytes(DB, DS) print("rdata %#x len %d ; data %#x len %d" % (RB, len(RDATA), DB, len(DATA))) def riprefs(target): """all i such that some 4-byte window at TB+i is a rip-disp32 to target""" out = [] for i in range(0, len(TEXT) - 4): d = struct.unpack_from("