wip: checkpoint FIFA 17 SBC research for Windows migration
This commit is contained in:
@@ -0,0 +1,50 @@
|
||||
"""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")
|
||||
Reference in New Issue
Block a user