#!/usr/bin/env python3 """Read the FIFA 17 TRADING gate byte out of the live client. READ-ONLY. Extends tools/gate_byte_probe.py with vtable slot +0x270 (IS_TRADING_ENABLED, displacement 0x1fd2e) plus the two pile-size dwords, which the transfer-market analysis names as the market screen's CardsDLL-supplied inputs. Opens /proc//mem O_RDONLY and preads. Nothing here can write. """ import os, struct pid = None for d in os.listdir('/proc'): if d.isdigit(): try: if open('/proc/%s/comm' % d).read().strip() == 'FIFA17.exe': pid = int(d) break except Exception: pass assert pid, "FIFA17.exe not running" base = None for ln in open('/proc/%d/maps' % pid): if 'CardsDLL' in ln: base = int(ln.split('-')[0], 16) assert base, "CardsDLL not mapped (client has not reached Ultimate Team)" slide = base - 0x180000000 fd = os.open('/proc/%d/mem' % pid, os.O_RDONLY) def rd(va, n): return os.pread(fd, n, va) # Control: the FNV atom-hash prologue must match the on-disk PE before any other # address is trusted. pe = open('/mnt/games/FIFA 17/CardsDLL_Win64_retail.dll', 'rb').read() def f(va): return va - 0x180000000 - 0x1000 + 0x400 ok = pe[f(0x180180d00):f(0x180180d00) + 32] == rd(0x180180d00 + slide, 32) print("pid=%d slide=%#x FNV control=%s" % (pid, slide, "MATCH" if ok else "MISMATCH")) assert ok, "slide not proven; refusing to read further" obj = struct.unpack('