【飞郁2022新课程】23 - CE找偏移表达式
基地址和动态地址是一对好基友,他们相隔十万八千里,却紧密联系着
他们不用像唐僧取经一样翻山越岭,经历九九八十一难,因为他们有一种如同月光宝盒一样的交通工具,
我们叫它偏移
这节课我们就用CE来查找基地址和偏移的表达式
1.1 扫描表达式
何为偏移?简单来说偏移就是两个地址之间内存距离,他的单位是字节.
当然并不是说所有的地址之间的偏移都是有意义的,
就好比两个城市之间没有直达的交通工具,你只能通过其他城市进行中转一样
而这个中转的过程,我们就叫它偏移表达式
我们来到教案游戏的第三层,在这一层里有很多的怪物,我们要通过攻击这些怪物来找到人物血量和基地址的偏移表达式.
打开CE,扫描4byte的1000
得到的60个结果,我们需要进一步过滤,打一个怪试试
怪挂了,剩余960的血量,CE过滤一下,只得到了一个结果
在这个地址上点右键,选择Find out what accesses this address选项,我们可以看到访问这个地址的所有代码
当然这只是当前这个状态访问的代码,如果我们做一些其他的动作,比如打怪等等,还会有更多的代码显示出来
这里我们可以看到,访问最频繁的是第一个代码,共有288次,这句代码的意义就是将寄存器eax里面存放的值传递给寄存器ecx,我们做一个了解即可,后面还会做详细讲解.
我们可以任意选择一条代码去继续分析,前提是逗号左右两边的寄存器不能一样,比如mov ecx,[ecx]
我们选择第一条,双击,或者点击,
可以得到当前所有寄存器的数值
这里的eax就是我们要继续分析的地址,他的值是0xDC6070,由于这一条是没有偏移的,所以这个值和我们查找访问代码的地址是一样的,
我们直接用CE继续扫描0xDC6070,这里要注意的是,扫描十六进制地址必须要勾选16进制
这里得到的结果较多,我们需要ctrl+A选中全部,并点击
全部拉到下面来
接下来我们对这30多个地址挨个查找访问代码,找出有访问代码的地址
在对第三个地址访问的时候得到了两条带有0x14偏移的代码
我们任选一条地址进行双击或者点击
可以得到当前状态所有寄存器的值
我们要的是edx的值,等于0xD55A70
现在我们的偏移表达式变为了[[0xD55A70+14]] 这个[ ]代表着读地址里的值
接下来我们再次用CE扫描0xD55A70,
只得到了一个结果
对这个地址进行访问以后,可以得到一个+FC的偏移
此时表达式为[[[0xEA4D88+FC]+14]]
重复的操作得到第一条中edx的值,并在CE中进行扫描,
问题出现, 这一次没有扫描到任何结果
出现这种结果的情况有很多,我们尝试用之前学过的将快速扫描取消试一下
这里得到了一个不能被4整除的地址(PS:这是heart老师特意设计的一个小小的坑,你能想到么?)
继续查找访问这个地址的代码吧
可以得到一个+5的偏移,同样选择第一条,获取到eax的值为0xE959D0
现在的偏移表达式变成了[[[[0xE959D0+5]+FC]+14]]
还没到基地址,继续扫描
这次得到了一个绿色的地址
此时我们可以将偏移表达式写为[[[[[B9FB1C]+5]+FC]+14]]
这个绿色的地址我们暂时将它看成是基地址,我们需要后面用OD去进行验证才能确定
当然这个地址已经不会随着游戏重启而改变了
如果这个地址每次游戏启动都会变化,那么我们也可以用模块+偏移的形式来表示,比如:
[[[[[网络安全学院.exe+79FB1C]+5]+FC]+14]]
1.2 测试表达式
接下来,我们用CE去测试一下这个表达式是否正确(这里悄悄的换一下官方的CE,没有乱码)
点击Add Address Manually,
点击
再点击
添加偏移
这里一共有5层偏移,所以要添加4次
可以正常的显示人物血量了,说明我们的表达式是没有问题的
接下来大家可以用这个方法试试找到人物的坐标,层数等数据了