阅读EAs FIFA 19的得分

时间:2018-12-05 03:34:33

标签: assembly cheat-engine

您好,堆栈溢出者,

我要创建一个程序,当它在足球模拟器FIFA 19中实际进球时,就扮演主队的进球。

我知道游戏本身没有开放的API。我看到的唯一方法是从内存中轮询结果。我不知道这是否符合游戏的最终用户许可协议,但我不介意以任何方式作弊。

为了进行研究,我从https://github.com/xAranaktu/FIFA-19---Career-Mode-Cheat-Table找到并查询了作弊引擎表。它具有通过作弊引擎读取或写入比赛分数的能力。

可悲的是,我无法对表进行反向工程。我发现了一些从内存中读取值的代码。但是我很难弄清楚每行的作用。

[ENABLE]
aobscanmodule(INJECT_matchScore,FIFA19.exe,48 8B 41 20 48 89 42 20 8B 41 28 89 42 28 41 8B 54) // should be unique
alloc(matchscore_cave,$1000,"FIFA19.exe"+2578D85)

alloc(ptrHomeTeamScore, 8)
registersymbol(ptrHomeTeamScore)
ptrHomeTeamScore:
dq 00

alloc(ptrAwayTeamScore, 8)
registersymbol(ptrAwayTeamScore)
ptrAwayTeamScore:
dq 00

label(code_matchscore)
label(home_matchscore)
label(away_matchscore)
label(return_matchscore)

matchscore_cave:
  pushf
  cmp rdx, 00
  je home_matchscore
  cmp rdx, 01
  je away_matchscore
  jmp code_matchscore

home_matchscore:
  mov [ptrHomeTeamScore], rcx
  jmp code_matchscore
away_matchscore:
  mov [ptrAwayTeamScore], rcx
  jmp code_matchscore

code_matchscore:
  mov r8d,[rcx+0000011C]
  popf
  jmp return_matchscore

INJECT_matchScore+5B:
  jmp matchscore_cave
  nop
  nop
return_matchscore:
registersymbol(INJECT_matchScore)

我对什么是指针,堆栈和汇编程序有基本的了解。但是我不明白这里发生的事情。也许您可以逐行描述发生的事情。

谢谢。

1 个答案:

答案 0 :(得分:0)

从本质上讲,这是一个挂钩,使用Cheat Engine脚本功能将代码流定向到注入的Shellcode中。我将把每一行分解成它的基本目的来帮助解释它。在Cheat Engine Wiki

中详细了解
aobscanmodule(INJECT_matchScore,FIFA19.exe,48 8B 41 20 48 89 42 20 8B 41 28 89 42 28 41 8B 54) // should be unique

扫描该特定模式的过程,将匹配模式的位置存储在INJECT_matchScore中

alloc(matchscore_cave,$1000,"FIFA19.exe"+2578D85)

在“ FIFA19.exe” + 2578D85附近分配大小为1000字节的内存,并以inmatchscore_cave的形式存储该内存的地址。这是放置您的shellcode的地方

alloc(ptrHomeTeamScore, 8)
registersymbol(ptrHomeTeamScore)
ptrHomeTeamScore:
dq 00

分配8个字节以存储64位指针,注册变量符号名称并为其分配QWORD值0x0

alloc(ptrAwayTeamScore, 8)
registersymbol(ptrAwayTeamScore)
ptrAwayTeamScore:
dq 00

与上述相同

label(code_matchscore)
label(home_matchscore)
label(away_matchscore)
label(return_matchscore)

为您可以跳转到的组装块创建一些标签,如下所述

matchscore_cave:
    pushf
    cmp rdx, 00
    je home_matchscore
    cmp rdx, 01
    je away_matchscore
    jmp code_matchscore

推旗 如果rdx == 0,则跳转到home_matchscore 否则,如果rdx == 1,则将jmp添加到away_matchscore 否则jmp code_matchscore

home_matchscore:
    mov [ptrHomeTeamScore], rcx
    jmp code_matchscore
away_matchscore:
    mov [ptrAwayTeamScore], rcx
    jmp code_matchscore

抓取存储在rcx中的指针并将其存储在ptrHomeTeamScore

code_matchscore:
  mov r8d,[rcx+0000011C]
  popf
  jmp return_matchscore

在RCX的偏移量0x11C处,获取值并将其存储在寄存器r8d中 弹出标志,将它们恢复到初始钩之前的状态 jmp

INJECT_matchScore+5B:
  jmp matchscore_cave
  nop
  nop

将原始程序集和jmp覆盖到您注入的代码中,将游戏代码的流程引导到您自己的代码中