最近网上流行一个游戏,属于跳一跳一类的游戏,这个游戏没有存档点,这玩起来就比较崩溃了,我也是玩了玩奈何技术太菜,就开始研究这个游戏的逆向了。最初我的思路就是拿Cheat engine进行扫描,因为它需要跳跃。用01大法进行搜索。一开始我想的是不跳是0跳跃是1。后来这个思路没有搜索到关键的数值。我又换了方式就是跳跃是0不跳是1,采用ce的暂停功能进行搜索。我后来搜索到了一些数值找到了一个汇编指令,这个稍后我列图片展示。
后来进行搜索学习知道这是unity游戏的逆向,这个还是用了il2cpp编译的。按那些教程一看简直就是发现了新大陆,就差没把游戏源代码反编译出来,但是功能都能看见,角色控制的功能在里面显示的有很多,我在此只列出跟角色有关的参数进行技术探讨。
开始搜索,我这里不演示过程了,直接放出搜索结果。
出现了这些搜索结果,现在就开始找一下哪些改写了这些地址,因为有的地方可能不是关键指令。
最后我在一条找到了一条指令试了试nop果然它起了作用:nop掉以后直接升天不会落地。
后来发现这种游戏的另一种方式的逆向我就去学习了一下(刚刚看到一位吾爱坛友也发了一篇文章写了关于这块的内容CTF游戏逆向入门https://www.52pojie.cn/thread-2098123-1-1.html,趁热打铁我也写这篇教程分享一下),里面的内容我也使用到了,跟我之前学习的有很大相关性,就是用https://github.com/Perfare/Il2CppDumper这个工具进行逆向,再搭配dnSPY进行源代码查看,里面能看到框架但是源代码会丢失。Il2CppDumper这个工具我刚刚引用的文章有写可以看那篇文章的教学。
反编译过后关键的一个dll文件在这里面
名字叫Assembly-CSharp.dll,用dnSPY打开后就从里面搜索一下jump的实现方式,我很纳闷是怎么实现的,一直想改二段跳没有改成,后来放弃了,没有分析出来,越分析越乱,看着落地判定有点麻烦,有会的大佬可以在评论区指导一下
这个类可能就是关于角色的所有类,从里面搜索jump会发现很多参数,我还发现了这个地址会对应ce附加进程的那个汇编地址。[Address(RVA = "0x377790", Offset = "0x375D90", VA = "0x180377790")]
Virtual Address(虚拟地址)这个有很大作用,反编译原来的dll文件可以在ida中修改汇编代码。也可以在ce里进行hook,进行一些功能的修改。
这里还有一些参数,还有解释,我就把参数都给了ai进行分析,里面有很多的常量,修改常量就可以进行功能的修改了。至于我刚刚那个GameAssembly.dll+37E0CB - 88 86 9C000000 - mov [rsi+0000009C],al中rsi+0000009C是什么在里面也有了解释和对应关系
offset是根据一个基址的偏移,由这个文件可以得出很多属性的偏移和功能,这个rsi让ai分析出来是人物的基址,结合这些偏移就有了人物的属性。
里面有可以直接修改的属性,比如跳跃高度和重力。修改跳跃高度效果如下图
这个rsi的基址我没通过指针扫描完成,我是通过hook申请了一个新变量得到的CT脚本如下:
[ENABLE]
alloc(newmem,2048,"GameAssembly.dll"+37D433)
alloc(Player_RSI,2048,"GameAssembly.dll"+37D433)
label(returnhere)
label(originalcode)
label(exit)
registersymbol(Player_RSI)
newmem:
mov [Player_RSI],rsi
originalcode:
movaps [rsp+00000090],xmm6
exit:
jmp returnhere
"GameAssembly.dll"+37D433:
jmp newmem
nop
nop
nop
returnhere:
[DISABLE]
dealloc(newmem)
"GameAssembly.dll"+37D433:
movaps [rsp+00000090],xmm6
启用了就可以用这个基址进行偏移来修改属性。
这里也可以通过ce来看这个类
9C的偏移就是检测是否在地面。里面还有很多参数可以进行浏览/修改。
跟刚刚通过hook方式得出来的结果是一样的。
技术达不到,可以通过这种方式来进行游戏,改了跳跃高度和重力也是挺好玩的。大家可以通过这种方式来完成自己的登顶梦想