目录

【飞郁2022新课程】23 - CE找偏移表达式

基地址和动态地址是一对好基友,他们相隔十万八千里,却紧密联系着

他们不用像唐僧取经一样翻山越岭,经历九九八十一难,因为他们有一种如同月光宝盒一样的交通工具,

我们叫它偏移

这节课我们就用CE来查找基地址和偏移的表达式

1.1 扫描表达式

何为偏移?简单来说偏移就是两个地址之间内存距离,他的单位是字节.

当然并不是说所有的地址之间的偏移都是有意义的,

就好比两个城市之间没有直达的交通工具,你只能通过其他城市进行中转一样

而这个中转的过程,我们就叫它偏移表达式

我们来到教案游戏的第三层,在这一层里有很多的怪物,我们要通过攻击这些怪物来找到人物血量和基地址的偏移表达式.

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/27c090404862b5cd053efb452d86be79b30fdc83.png@942w_491h_progressive-20211220162433333.png

打开CE,扫描4byte的1000

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/848898efad5b35b11eefa7b102ce148901256e23.png@942w_467h_progressive-20211220164211747.png

得到的60个结果,我们需要进一步过滤,打一个怪试试

怪挂了,剩余960的血量,CE过滤一下,只得到了一个结果

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/94538e01b6490d031dcab190a8b9723a2665ad80.png@942w_485h_progressive.png

在这个地址上点右键,选择Find out what accesses this address选项,我们可以看到访问这个地址的所有代码

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/5d2d0950e5041e644f14313911b71c989b8229b4.png@897w_389h_progressive-20211220164222043.png

当然这只是当前这个状态访问的代码,如果我们做一些其他的动作,比如打怪等等,还会有更多的代码显示出来

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/661b5f03b38ef97b5ef2a6e217446363a896d502.png@882w_773h_progressive.png

这里我们可以看到,访问最频繁的是第一个代码,共有288次,这句代码的意义就是将寄存器eax里面存放的值传递给寄存器ecx,我们做一个了解即可,后面还会做详细讲解.

我们可以任意选择一条代码去继续分析,前提是逗号左右两边的寄存器不能一样,比如mov ecx,[ecx]

我们选择第一条,双击,或者点击,

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/0269d2a6ff836f8777dd6c878158ecb227d9e485.png@230w_69h_progressive.png

可以得到当前所有寄存器的数值

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/8fc1d37e9f564889b9bd98036298c2ddaccdf5c6.png@881w_656h_progressive.png

这里的eax就是我们要继续分析的地址,他的值是0xDC6070,由于这一条是没有偏移的,所以这个值和我们查找访问代码的地址是一样的,

我们直接用CE继续扫描0xDC6070,这里要注意的是,扫描十六进制地址必须要勾选16进制

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/ccf55a7fe042ebdb1b8fb1d3ab5d5fcf713c7941.png@942w_684h_progressive-20211220164227503.png

这里得到的结果较多,我们需要ctrl+A选中全部,并点击

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/c20ac1f487900c13739e69702014927afa90fab9.png@69w_60h_progressive-20211220164232103.png

全部拉到下面来

接下来我们对这30多个地址挨个查找访问代码,找出有访问代码的地址

在对第三个地址访问的时候得到了两条带有0x14偏移的代码

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/b3b51992a7086bb45b9897631f8f5b1f85ebfaa4.png@900w_420h_progressive.png

我们任选一条地址进行双击或者点击

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/d5ca3b5188d4a17644921d1aad85c5df2a8348b7.png@218w_50h_progressive.png

可以得到当前状态所有寄存器的值

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/faade8a6d7839c1a660bd9e78683dba98a7fbb04.png@896w_663h_progressive-20211220164236702.png

我们要的是edx的值,等于0xD55A70

现在我们的偏移表达式变为了[[0xD55A70+14]] 这个[ ]代表着读地址里的值

接下来我们再次用CE扫描0xD55A70,

只得到了一个结果

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/167194975b8393fde2e63e665f922410b5e20703.png@942w_608h_progressive-20211220164250596.png

对这个地址进行访问以后,可以得到一个+FC的偏移

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/dfa27d5d6e5b9daaa7c15e7c2992bce5627ae443.png@875w_344h_progressive.png

此时表达式为[[[0xEA4D88+FC]+14]]

重复的操作得到第一条中edx的值,并在CE中进行扫描,

问题出现, 这一次没有扫描到任何结果

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/393bc4a8491898f8b2782fd2df292371497326cd.png@942w_152h_progressive-20211220164246805.png

出现这种结果的情况有很多,我们尝试用之前学过的将快速扫描取消试一下

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/b6f3fd9131ba71071eb8fd866aa117f65277855f.png@942w_465h_progressive.png

这里得到了一个不能被4整除的地址(PS:这是heart老师特意设计的一个小小的坑,你能想到么?)

继续查找访问这个地址的代码吧

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/04558305a65c87ff5512954b5d101a54a7625517.png@896w_401h_progressive-20211220164313310.png

可以得到一个+5的偏移,同样选择第一条,获取到eax的值为0xE959D0

现在的偏移表达式变成了[[[[0xE959D0+5]+FC]+14]]

还没到基地址,继续扫描

这次得到了一个绿色的地址

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/7a5909116038a74e4dd6bf255d50d03a6509b7d8.png@942w_161h_progressive-20211220164309350.png

此时我们可以将偏移表达式写为[[[[[B9FB1C]+5]+FC]+14]]

这个绿色的地址我们暂时将它看成是基地址,我们需要后面用OD去进行验证才能确定

当然这个地址已经不会随着游戏重启而改变了

如果这个地址每次游戏启动都会变化,那么我们也可以用模块+偏移的形式来表示,比如:

[[[[[网络安全学院.exe+79FB1C]+5]+FC]+14]]

1.2 测试表达式

接下来,我们用CE去测试一下这个表达式是否正确(这里悄悄的换一下官方的CE,没有乱码)

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/9f4914f503260d558ece9908dceb84afb16a2543.png@942w_150h_progressive.png

点击Add Address Manually,

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/b849135b504b8ecad8fac7798692fb93dba08c83.png@344w_428h_progressive.png

点击

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/e465abdf55eb04262cb7b3f661238a44c18e3b92.png@180w_51h_progressive-20211220164352159.png

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/3f3b368c7720424b73d1df914f036a0a6190252f.png@429w_569h_progressive-20211220164302818.png

再点击

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/b8885c384545e389c2e553f2e6d94027a05c97c3.png@273w_75h_progressive.png

添加偏移

这里一共有5层偏移,所以要添加4次

https://cdn.jsdelivr.net/gh/xinqinew/pic@main/img/499a48a39fc56669f5d1b219fee00fc429cc7e37.png@579w_704h_progressive-20211220164255578.png

可以正常的显示人物血量了,说明我们的表达式是没有问题的

接下来大家可以用这个方法试试找到人物的坐标,层数等数据了