51 lines
2.2 KiB
Python
51 lines
2.2 KiB
Python
"""DIMENSION 4 q2: locate the draft/tournament entry decision.
|
|
|
|
Hypothesis: entry is gated in the script layer / a manager singleton with no server
|
|
writer, NOT by any server-reachable field. Test by (a) enumerating draft/tournament
|
|
script-event + manager literals and their xrefs, (b) reading the CompetitionManager
|
|
setters FUN_180101680/FUN_1801016c0 (the Seasons lead) and looking for draft/tourney
|
|
analogues, (c) finding who READS the draft gate byte model+0x1fd3d and tournament
|
|
+0x1fd3b.
|
|
|
|
Control: 'IS_DRAFT_MODE_ENABLED' literal must resolve and xref into FUN_18006cc60
|
|
(the known publisher). If it does, the string/xref mechanics work.
|
|
"""
|
|
import traceback
|
|
try:
|
|
def show_str_xrefs(lit, blocks=(".rdata",)):
|
|
hits = find_all(lit.encode() + b"\x00", blocks)
|
|
print("\n--- literal %r : %d hit(s) ---" % (lit, len(hits)))
|
|
for h in hits:
|
|
print(" @ %#x" % h)
|
|
for frm, typ, fn, ent in xrefs_to(h):
|
|
print(" xref from %#x %s in %s (%#x)" % (frm, typ, fn, ent))
|
|
|
|
# control
|
|
show_str_xrefs("IS_DRAFT_MODE_ENABLED")
|
|
# draft / tournament script + manager literals
|
|
for lit in ("NOSEASONS", "NODRAFT", "NOTOURNAMENT", "DRAFTSQUAD_ON",
|
|
"SINGLE_PLAYER", "DRAFT_TOKEN", "DraftMode", "Draft",
|
|
"CompetitionManager", "TournamentInfo", "TournamentManager",
|
|
"DraftManager", "OnlineDraft", "OfflineDraft"):
|
|
show_str_xrefs(lit)
|
|
|
|
# substring scan for any *draft*/*tournament* ascii literal in .rdata
|
|
print("\n=== .rdata literals containing 'raft' or 'ourna' ===")
|
|
for needle in (b"raft", b"ourna"):
|
|
seen = set()
|
|
for h in find_all(needle, (".rdata",)):
|
|
# back up to string start
|
|
p = h
|
|
while p > h - 64:
|
|
b = read_bytes(p - 1, 1)
|
|
if not b or b[0] == 0 or b[0] < 0x20 or b[0] > 0x7e:
|
|
break
|
|
p -= 1
|
|
s = rd_str(p, 96)
|
|
if s and s not in seen and (b"raft" in s.encode() or b"ourna" in s.encode()):
|
|
seen.add(s)
|
|
print(" %#x %r" % (p, s))
|
|
except Exception:
|
|
traceback.print_exc()
|
|
print("QUERY_DONE")
|