Bu弃 发表于 2016-8-12 20:39:48

对BayMax大白的多层指针补丁的理解

本帖最后由 Bu弃 于 2016-8-12 20:48 编辑

今天碰到多层指针,不知道用大白(●—●)如何实现,所以问了下Nisy校长,@Nisy 根据校长的解释,还有自己的一些理解,写了这篇帖子。有错误的地方,欢迎指正。


首先描素下我遇到的问题。鉴于有时候紧张就语言描素不清楚,所以就上一张图。相信你们更加喜欢这种方式。



             (图1)
图上说明 ESP 的地址为 018FC44 而方框处相对ESP的偏移是 3C,右键跟随过去后,发现里面的值是一个地址。而这个地址就是我们最终需要改动数据的地址。


下面让我们看看如何用大白(●—●)实现这个功能吧。


我们一层一层的来分析。首先,找到ESP的地址。然后+上偏移3C。在OD里的是这样的

         (图2)
椭圆标记的就是ESP的地址,方框里标记的就是ESP+3C。 我们看到,ESp+3C里的内容也是地址。那么大白里的设置,寄存器我们可以确定了,偏移我们也能确定了,也就是 ESP,3C。


接下来继续走。像这种情况,如果我们只在大白设置里填ESP,3C 。那么就是会这样修改(假如我们想改成1122)

            (图3)
这样就会直接把ESP+3C里面的地址修改,原地址内容并为修改。就像C语言里的交换两个数的位置,Change(int x,int y)我们知道,这样是不能实现交换功能的。正确的方式应该是这样 Change(int *x,int *y)同理,这里也是,不能实现修改功能。


那么我们应该怎么修改呢,根据校长的解答,我们只需在后面加个0即可。也就是ESP,3C,0


这样就表示,取当前ESP+3C里的值作为地址使用,而不是作为代码使用。这样就相当于我们在堆栈里右键数据窗口跟随。



         (图4)
接下来我们又发现,右键数据窗口跟随里面的值还是地址。根据上面所说的,我们只需再后面再加个0即可,也就是最终的设置 ESP,3C,0,0。


这样我们就到了我们需要补数据的地方



         (图5)
接下来我们就可以愉快的嘿嘿嘿了。


总结:
    1、到最后的ESP,3C,0,0可以用指针这样描述 *( *(*(ESP+3C))),*(ESP+3C)得到的是图2的内容。*(*(ESP+3C))得到的是图4的内容,也就是反汇编跟随后的内容。*( *(*(ESP+3C))) 得到的是图5最终的内容(PS:这里是这样解释吧。多层指针,把自己都弄晕了。)
    2、在寄存器后面加个0,就是取这里面的数据内容作为地址使用。


好了,就到这里了。谢谢大家观看。有错误的地方希望大家指出来,我也好改正,这也是种学习,不是么?


PS:感谢校长开发的工具,让我们能更好的破解,大白(●—●)真的很强大,6的飞起。校长辛苦了。
再次PS: 有时候大白没效果,可以试试把断点类型改为int3断点哦。

Bu弃 发表于 2016-8-12 20:41:14

按照GG表哥的国际惯例。自己的沙发自己做。

天上飞的鱼 发表于 2016-8-12 20:54:03

坐个地板支持Bu弃表哥~

a583091790 发表于 2016-8-12 21:06:47

感谢Bu弃表哥分享

Bu弃 发表于 2016-8-12 21:54:18

天上飞的鱼 发表于 2016-8-12 20:54
坐个地板支持Bu弃表哥~

表哥别闹

Bu弃 发表于 2016-8-12 21:54:43

a583091790 发表于 2016-8-12 21:06
感谢Bu弃表哥分享

表哥你也别闹

0xcb 发表于 2016-8-12 23:25:02

大白的补丁规则真的好方便,不过后面加个【,0】,个人感觉虽然成为自己独有的语法,但是不够优雅,建议可以如果把这些规则做一些脚本的绑定,或许更加灵活好玩

vitamin 发表于 2016-8-12 23:43:27

不弃小表弟求带啊

m2m 发表于 2016-8-13 00:48:01

不错,多层指针。。

gujin162 发表于 2016-8-13 09:30:12


向楼主学习!向楼主致敬!
页: [1] 2
查看完整版本: 对BayMax大白的多层指针补丁的理解