Files
OpenFUT/fifa17-recon/tools/ghidra_queries/q_md_gates_3.py
T

59 lines
2.4 KiB
Python

"""DIMENSION 2 Q3/Q4: readers for the refusing modes + SBC/Objectives bytes.
HYPOTHESIS: for season/draft/tournament the gate byte is read only to be
republished to the script layer (publisher) or to gate an unrelated sub-panel, not
to open the mode from a server response. SBC/Objectives have settings fields
(0x1fd2c/0x1fd42/0x1fd28, 0x1fd44) but NO IS_* publisher name; find their readers.
CONTROL: the applier FUN_18011dc50 must contain `mov [rdi+0x1fd3a],al` (season)
preceded by a `cmp [reg+FIELD],1 / sete al`, giving the season struct field index;
we already know trading is field +0x28 -> byte 0x1fd2e, so that pairing in the same
decompile validates the field-index reading.
"""
import traceback
try:
print("=" * 70)
print("APPLIER FUN_18011dc50 (field -> byte, full)")
print("=" * 70)
d = dec(0x18011dc50)
print("len:", len(d))
print(d)
# readers to inspect: season 0x2b0 candidates (non-publisher), draft hub builder
for label, fa in [
("SEASON reader FUN_1800b0e20 (slot 0x2b0)", 0x1800b0e20),
("SEASON reader FUN_18011e3c0 (slot 0x2b0)", 0x18011e3c0),
("DRAFT hub-tile builder FUN_1800b2680 (slot 0x2c8)", 0x1800b2680),
]:
print("=" * 70)
print(label)
print("=" * 70)
d = dec(fa)
print("len:", len(d))
print(d[:6000])
print("=" * 70)
print("SBC / OBJECTIVES byte disp-scans (.text, form-agnostic)")
print("=" * 70)
for name, disp in [
("allowUntradeableForSquadBuildingSets", 0x1fd2c),
("squadBuildingSetsGracePeriodMinutes", 0x1fd28),
("allowGracePeriodForSquadBuildingSets", 0x1fd42),
("enableObjectives", 0x1fd44),
("packOpeningAnimationEnabled", 0x1fd45),
]:
pat = disp.to_bytes(4, "little")
hits = find_all(pat, blocks=(".text",))
print("\n%-40s disp %#x (%d hit(s))" % (name, disp, len(hits)))
for h in hits:
f = fm.getFunctionContaining(addr(h))
fn = f.getName() if f else "?"
ent = int(f.getEntryPoint().getOffset()) if f else 0
ins = (listing.getInstructionAt(addr(h - 3)) or
listing.getInstructionAt(addr(h - 2)) or
listing.getInstructionAt(addr(h)))
print(" %#011x in %-16s (%#x) ins~ %s"
% (h, fn, ent, str(ins) if ins else "?"))
except Exception:
traceback.print_exc()