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

46 lines
2.0 KiB
Python

"""Adversarial verify Dimension 4/5 decompile claims.
Hypothesis under attack:
(A) FUN_1800b2680 case 0xc reads slot+0x2c8 -> GOTO_DRAFT_ONLINE/DISABLED;
case 0xd reads slot+0x2d0 AND +0x2c8 -> GOTO_DRAFT_OFFLINE/DISABLED;
cases 5/0xe (tournament) set GOTO_* UNCONDITIONALLY;
objectives block reads slot 0x320 -> GOTO_MANAGER_QUEST(_DISABLED).
(B) settings deser FUN_18013c6d0: 0xf9->[0x17]; 0xfa&0xff->[0x18]; 0xfd&0xfe->[0x1c].
(C) applier FUN_18011dc50: +0x1fd3d=[0x17]==1; +0x1fd3e=[0x18]==1; +0x1fd44=[0x1c]==1.
(D) feature FUN_18013ec10 arm 0x11c recognizes ONLY atom 0x330.
Control: settings 0x336 tradingEnabled -> [10]; applier +0x1fd2e=[10]==1 (known good).
Method: print full decompile length + context around each token so absence claims
are from FULL text, not truncation.
"""
import traceback
def ctx(txt, needles, before=2, after=6):
lines=txt.splitlines()
hits=set()
for i,l in enumerate(lines):
for n in needles:
if n in l:
for j in range(max(0,i-before), min(len(lines),i+after+1)):
hits.add(j)
for j in sorted(hits):
print(" %4d: %s"%(j,lines[j]))
try:
for ea,name,needles in [
(0x1800b2680,"FUN_1800b2680 (hub tile builder)",
["GOTO_DRAFT","GOTO_MANAGER_QUEST","GOTO_OFFLINE_TOURNAMENT","GOTO_ONLINE_CHAMPIONS",
"GOTO_OFFLINE_SEASON","GOTO_ONLINE_SEASON","0x2c8","0x2d0","0x320","0x2b8",
"SBS","GameHub_SBS","0xd0)","GOTO_SBC","GOTO_SQUAD"]),
(0x18013c6d0,"FUN_18013c6d0 (settings deser)",
["0xf9","0xfa","0xff","0xfd","0xfe","0x336","0x17]","0x18]","0x1c]","[10]","param_2[10]"]),
(0x18011dc50,"FUN_18011dc50 (applier)",None),
(0x18013ec10,"FUN_18013ec10 (feature/massinfo)",
["0x11c","0x330","0x336"]),
]:
c=dec(ea)
print("="*70)
print("%s len=%d"%(name,len(c)))
if needles is None:
print(c)
else:
ctx(c,needles)
except Exception:
traceback.print_exc()