您好,堆栈溢出者,
我要创建一个程序,当它在足球模拟器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)
我对什么是指针,堆栈和汇编程序有基本的了解。但是我不明白这里发生的事情。也许您可以逐行描述发生的事情。
谢谢。
答案 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覆盖到您注入的代码中,将游戏代码的流程引导到您自己的代码中