阅读 EA FIFA 19 的分数

问题描述 投票:0回答:2

大家好,堆栈溢出者,

我准备创建一个程序,当主队在足球模拟器 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)

我对指针、堆栈是什么以及汇编器的作用有基本的了解。但我无法理解这里发生的事情。也许你可以给我逐行描述正在发生的事情。

提前谢谢您。

assembly cheat-engine
2个回答
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字节的内存,并将该内存的地址存储在matchscore_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,则跳转到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 中 弹出标志,将它们恢复到初始钩子之前的状态 跳

INJECT_matchScore+5B:
  jmp matchscore_cave
  nop
  nop

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


0
投票

您是否设法创建分数提取。我有一个类似的项目,我需要帮助

© www.soinside.com 2019 - 2024. All rights reserved.