104.游戏安全项目-基址的技术原理-基址的本质

免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!

内容参考于:易道云信息技术研究院

本人写的内容纯属胡编乱造,全都是合成造假,仅仅只是为了娱乐,请不要盲目相信。

上一个内容:103.游戏安全项目-基址的技术原理-内存分配

堆上内存地址的分配不固定,然后它和基址之间的联系

下图中的代码,player本身的内存空间在栈上,但是player是一个指针它指向了一个分配的内存空间,然后new Role()它的内存空间是在堆上的,然后在一个游戏里会有很多过程是需要人物属性的,所以player如果是一个局部变量它就会很难访问,比如ui显示、初始化的时候都会用到人物的属性,所以人物属性是一个局部变量会很难用

最好的方式是把 player 写成全局变量,这样多个方法用起来就很容易了,然后这时就涉及到基址了,player写成全局变量之后它的内存地址就不会变了,它就会比如 player 给写到了偏移2000位置,然后偏移2000位置的值就会是 new Role(); 这个,以后访问Role类里的属性时直接从 2000 位置获取就可以了

也就是所有方法都可以跟下图红框位置的代码一样进行访问Role类(player)里的属性了,然后基址的本质就是player地址是确定的然后它又被关联到了Role类上,这时player就叫做基址,也就是基址本质上是一个相对固定的内存地址,通过这个相对固定的内存地址可以链接到其它内存地址,只要它的内存地址不变并且可以链接到其它我们想要的数据那么它就是基址,基址的存在是因为不同的过程需要操作同一个内存空间这个时候就必须要有一个全局变量作为媒介。

以上是最简单的模型,这种模型只需要知道hp就可以得到它附近的内存地址,然后通过 Cheat Engine 查看谁改写了它就可以得到对象头,得到对象的头地址之后搜索有谁保存了对象的头地址,这样就可以得到对象的偏移了(也就是player这样的全局变量)后续只需通过这个全局变量的值来获取对象就可以了

这个游戏的hp是 19F5EDC4 ,重新登录之后它就会有变化了

然后找谁访问了 19F5EDC4 这个地址然后就得到了血量的偏移 然后 19F5EDC4 - 460 = 19F5E964,然后也就是说现在一定是有一个地方存了 19F5E964 这个值

有两个保存了

然后退出游戏之后有一个变成了 0,所以有很大的理由确认它就是基址

虽然它的地址没有变,但是也看出了确实是有一个全局变量存储了人物属性的类地址,这样通过基址计算人物对象地址不管打开多少次游戏都可以准确的找到人物对象地址

然后复杂的情况它是如下图新加了一个结构

原本的 player 放到了 Engine类中,这种情况就变成了二级基址(多级基址)

如果是二级基址的情况再找到player它就在 Cheat Engine 中显示的不是绿色的了,然后它的地址也不确定,也会找到一堆 player,这样的如何找后面写

有些游戏它会有十多级基址,这种情况在设计上是不合理的,但是它确实是存在,存在的原因是它用了游戏引擎(比如虚幻5),然后游戏引擎本身就是一个很大的一个类一个SDK文件,假设游戏引擎它自己就完成了一个6次以上的封装,然后又基于它的封装有进行了封装然后也可能在封装两次之后又进行了封装,几次封装之后十几级基址就有了面对这种游戏有两种解决方式一种是通过逆向分析,另一种是研究引擎的源代码,使用源码分析会比逆向分析简单。

然后还有一种情况是它没有基址就是有的数据它就是没有一个强关联比如游戏的界面,比如按钮鼠标放到按钮上会有效果所以按钮肯定也会是一个对象,按钮这个对象未必会有内存地址,可能会设计一个系统化的方法通过加载配置文件来自动生成然后让它关联某些函数然后让它就可以运行了这种情况并没有用一个全局变量把它关联起来,所以有些时候是找不到基址的也就是游戏里本身并没有关联这些数据,这种情况找不到是很正常的,还比如说游戏中的怪物也是有可能是通过系统化的函数来实现的,也并没有什么全局变量关联怪物的数据。这种没有基址的数据既然游戏可以识别到那说游戏本身是提供了一种函数来区分它,也就可以利用这些函数来区分它。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值