Anti-Cheat Toolkit 游戏逆向分析
Anti-Cheat Toolkit介绍
他是一款给Unity 3D 游戏引擎提供保护的插件。
Anti-Cheat Toolkit可以拿来干什么?
- 保护内存中的变量。
- 保护和扩展PlayerPrefs和二进制文件。
- 生成构建代码签名以进行篡改检查。
- 检测Android上的非Play Store安装。
- 检测加速器。
- 检测时间作弊。
- 检测3种常见的壁垒类型。
- 检测外国管理组件。
- 拥有ObscuredPrefs/PlayerPrefs编辑器。
了解清楚后,废话少说,直接开干。
环境介绍:steam上一款多人赛车游戏、CheatEngine。需要汇编和CE使用知识。
利用CheatEngine找到对应数据。
我们就从游戏最常用的金币开始分析。
图片上就是我游戏金币数值,一般游戏数据以4字节,和单浮点类型居多。
利用CheatEngine工具,后面我都简称位CE。查找数值。找到了2个数值。如果没有找到可以多改变数值多搜索几次,由于CE工具的使用不是本文主题,这里就不多介绍了。
下访问断点
可以看到我消耗了金币后只剩下第一个数据是准确的。这个数值其实也不是真正的数值只是显示的数值,真正的数值是被加密了,不是长这样,不信你可以手动更改一下数值内容比如改成999999,我这里就不做示范了,当你使用金币的时候你会发现还是原来的数值开始减少。
然后根据图片内容 3所示 写入汇编代码(7FFD997F67FC - F3 0F11 73 38 - movss [rbx+38],xmm6),点击4跳转过去。这个访问代码窗口不要关闭后面需要使用。
找到了关键代码处进行分析
箭头就是指向写入金币数值的汇编。
方框里的内容就是本次加密的函数。(如果没有显示函数名需要在CE菜单中激活Mono功能)
这个函数根据官方的资料了解到,这是个加密浮点数的结构构造函数。
鼠标选中方框中的汇编按下空格键进入函数内部。
分析数据加密函数
加密函数关键代码被我圈出来了,不懂的可以看右边我写的注释。
后面会用到这个加密逻辑。
找到关键代码,修改代码逻辑
返回到CodeStage.AntiCheat.ObscuredTypes.ObscuredFloat..ctor,函数外层。
观察我们刚才没有分析的函数。关键处我标记出来了,可以参考我的注释。
GameAssembly.dll+17F67BA - 0F28 CE - movaps xmm1,xmm6
根据上一个函数分析得知第一个浮点寄存器xmm1里面就是要被加密的数值。
理论上修改xmm1浮点寄存器就能达到金币修改效果。(实际上也是可行的 嘿嘿嘿)
详细解析ObscuredAmount结构体
汇编代码分析:
在函数头部下断点:
1 | Framework.Models.Resources.Resource.set_obscuredAmount - 40 53 - push rbx
|
你会发现你一下断点就会断下来是因为这是一个加密函数,很多数据都会调用这个加密函数进行数据加密可能并不是我们想要的数据,比如说金币。
断下来后查看RCX寄存器指向内存。以浮点数进行查看。
可以发现+38的地方是个 91.42的浮点数,猜测得知这应该是游戏内一个虚假数值,跟金币同理。
然后我将其转换为4字节 16进制数值。选中第一个数据 按下 Ctrl+Enter 显示相对偏移然后步过执行到箭头位置注意观察方框处标注出来的内存。再次步过,你就会发现加密数据就被写入方框内。
这里做下解释,第一个是固定写入1,第二个是生成的随机数,第三个是被加密的数据,第四个固定是0
图中截图的内容是执行之后的代码。
验证分析:
你会发现为什么算出了的和图中的第三有点不一样,那是因为加密不仅仅是异或还做了顺序调换,利用右移,第二个字节和第三字节做了交换。
至此数据加密已经全部分析完成了。 恭喜你能够看到这里~~~~~~~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2024-9-5 11:09
被学海无涯~编辑
,原因: 修改为原创