分析入手:从TAB选怪开始,进入游戏 bp send 马上进入游戏 tab选怪,被断下后,复制堆栈里的返回 ======================================================================================= /CALL 到send 来自 xajh.00B9082A 0012F094 0000012C ,_.. |Socket = 12C 0012F098 01157736 6w__ |Data = xajh.01157736 0012F09C 00000001 _... |DataSize = 1 0012F0A0 00000000 .... \Flags = 0 0012F0CC 0012F0F4 麴_. 指向下一个 SEH 记录的指针 0012F0D0 00FE5AC0 繸? SE处理程序 0012F0D4 00000001 _... 0012F0D8 00B908C0 ?? 返回到 xajh.00B908C0 来自 xajh.00B90790 0012F0EC 0950E03C <郟. 0012F100 00B9093B ;.? 返回到 xajh.00B9093B 来自 xajh.00B90870 0012F114 00B91CA3 ?? 返回到 xajh.00B91CA3 来自 xajh.00B908F0 0012F158 0012F334 4?. 指向下一个 SEH 记录的指针 0012F15C 00FE5C18 _\? SE处理程序 0012F160 00000000 .... 0012F164 00B88BC2 聥? 返回到 xajh.00B88BC2 来自 xajh.00B91B60 0012F1E0 76B14E7B {N眝 返回到 WINMM.76B14E7B 来自 WINMM.76B14E82 一条一条分析判断 发现 到 返回到 xajh.00B88BC2 来自 xajh.00B91B60 这条时候 上面有2个CALL,在这2个CALL处下断点,进入游戏做选怪动作,看是否会被断下,发现会被断下,那么这2个CALL有可能是选怪CALL,或者跟选怪CALL有密切关系的,因为只有在做选怪动作时候才被断下, 那么我们来分析下这2个CALL的参数,首先我们得明白,选怪CALL肯定有个参数是怪物ID(也就是要被选中的那个怪物ID), 但从下往上数,第1个CALL 发现没有push 之类压入参数的之类,所以先不看这个,来看下上面这个CALL先, 在这下个断点,然后进入游戏 选怪操作,被断下来了,这时候,我们把目光移到寄存器窗口,发现亮了ECX EBX ESI 这3个寄存器,而这3个寄存器的值又不是很大, 但是看在这个CALL调用之前 好像只有 push esi 没有对 ecx 和 ebx的值有任何操作,那么我们在这个入口下个断点进入游戏选怪断下看看,这个CALL的上一层是什么, 看看会不会有其他什么CALL也是只做选怪才会被断下的,
进入游戏选怪操作后被断下,看堆栈窗口:
我们跟随第一个堆栈返回,到达:
我们下断点后,进入游戏进行操作选怪动作,被断下后 这个CALL调用之前,压入了2个寄存器 edi和esi的值,那么我们把目光放到寄存器窗口,看看这2个寄存器,如果这2个寄存器里有当前被选中的怪物ID, 那么这个CALL也许是可能就是真正的选怪CALL了,但是根据分析过很多数据的经验和心得,我们看见edi寄存器的值01000000 好像并不像是怪物ID, 所以我们要来测试分析下esi寄存器的值是不是怪物的ID,我们记住当前选中的这个怪物和esi的值,先取消选中这个怪物, 我们再次选中这个怪物,如果esi的值是怪物的ID值, 那么esi的值肯定就不会变,因为我们没有换其他怪物选,还是选原来的那个怪物,所以怪物ID是不会变的, 我们发现,esi寄存器的值和edi的值是不会变的,我们换个怪物来选下,看哪个寄存器的值会变, 因为如果换了个怪物选,每个怪物的ID是不一样,肯定寄存器的值就会不一样, 换选怪物后,发现esi寄存器的值变了,而edi的值却没有变,那么edi的值是固定的,可能是个常量或什么标示值吧,我们不管了, 记录下 这次esi的值 0115, 我再前面的 课程里就讲解过,分析CALL除了看参数外,还有一步就是,进行测试调用,是否能达到成功, 那么这个这CALL还是比较简单的,容易写, 整理下: push edi push esi call 00B88B90 既然edi不变,而esi是选中目标怪物的ID,那么我们就直接 push 01000000 push 0115 call 00B88B90 由于这个CALL执行后,游戏做了堆栈平衡操作,所以 add esp,08 平衡2个操作数也是要写上的,如果不写上可能游戏会报错崩溃,好了,我们来测试下,是否能选中这个怪物,测试后发现能选中怪物,而且不报错,那么这时候这个CALL就是100%的 选怪CALL了, 00700B6C |. 57 PUSH EDI ; 01000000=常量 00700B6D |. 56 PUSH ESI ; 000000BD=怪物ID 00700B6E |. E8 1D804800 CALL xajh.00B8E850 ; TAB选怪CALL 00700B73 |. 83C4 08 ADD ESP,8 ; 到达这
代码测试:
联系我时,请说是在 挂海论坛 上看到的,谢谢! |