|
吾爱游客
发表于 2015-4-12 16:16
1、申 请 I D :ying_epdc
2、个人邮箱:ying_epdc@163.com
3、原创技术文章:
用数据追踪和断点的方法修复游戏的bug:
举一个例子,这是一个经典游戏英雄无敌3的一个经典的bug,现在我们可以利用反汇编的方法来修复这个bug,
我利用的软件是Cheat Engine,这个软件断点追踪的功能非常强大。
这个bug详细情况如下:
利用事件偷兵
版本不明
前提:
1、地图设定了加兵事件(废话 )
2、带兵英雄激发事件的时候,英雄所带兵与事件中所加兵合起来超过英雄队伍里的7个兵位,放不下所有的兵。举个例子,你英雄带了3队兵,而事件中兵不少于5种。注意:是3队兵,而不是三种兵。也就是说,你可以只带一种兵,把它分成N队,只要N+事件兵不少于8个兵位就行了。(这里有一个需要注意的情况是,如果英雄队伍中有与事件所加兵相同的兵种,那么在加兵时候电脑会自动将二者合而为一,这种情况下只能算一个兵位。)
过程:
1、触发事件,出现一个对话框,提示如何处理多出来的兵种问题,这时候点击英雄头像
2、出现英雄详细资料界面。理论上,只要出现了这个界面,无限加兵事件就算成功完成了一次。
这时候可以什么都不做,也可以调动兵种占位,或者解雇兵种
3、退出此界面,界面回到第3步的对话框,这时候也可以什么都不做,也可以调换兵种,或者重新排列兵位,反正确保下次触发事件之时能保证第2个前提就行。
4、英雄后退一步或者前进一步,然后再次触发事件……
追踪事件加兵的兵数量得到代码005189F6 - lea edi,[ebp-000000A0](把事件加兵的兵数量放置到调整兵力界面的代码)
在005189F6处断点,一路按步过功能,直到出现调整兵力界面,定位到代码00518C2A - add esp,0C
用518C2A的返回地址519493作跳转分析,看看是518C25处的代码产生bug还是上层指令的另外一个子指令产生bug
519493的跳转分析:
正常情况时的跳转过程
5194df
519503
bug时的跳转过程
5194a0
5194df
519503
分析是什么原因让5194a0跳转
发现正常情况下和bug时0051948E - call 0040A92A让edx产生不同的值
即518C2A处的函数的上级指令及其子指令与产生bug无关,是518C25该处的指令或其下级指令产生bug
由于上面提到的edx是ebp+0c处记录的地址处的数据,所以要我们要分析ebp+0c记录的地址处的数据,
从519473处断点,重新去碰触加兵事件,直到断开,然后把查看内存字节那里定位到ebp+0c记录的地址处
然后一路步过,然后按正常加兵,退出界面,ebp+0c记录的地址处的数据一直没有改变
重新从519473处断点,字节查看器定位到ebp+0c记录的地址处,碰触事件,一路按步过,按bug的方法加兵,发现进入英雄界面瞬间ebp+0c处的数据变化了。这时,我们就找到了bug产生的原因了,就是那个ebp+0c记录的地址处的数据改变造成了bug。
按上一步的步骤,追踪ebp+0c记录地址处的数据,看看是什么代码改变了这里的数据,发现0056A8D9 - mov [ecx],edx改变了该处的数据。
上面分析到是518C2A该处的指令或其下级指令产生bug,而56A8D9是改变ebp+c数据的元凶,518C25该处的指令应该有一个途径到达56A8D9这个地方,我们截断这个途径就可以了。
在这之前我们先把指令0056A8D9 - mov [ecx],edx的返回地址记录一下,返回地址的意思是返回上一层指令,这些一层层的上级指令应该与bug的产生有一个连接的途径。
56A8D9的返回地址:
0042A8BD
0043CBCA
00579FEF
006EF708
006E96CE
0042305B
0072A06E
0073024E
00729F99
006EA072
00518C2A
00519493
004E833F
00426C4E
00429CC6
004289C7
004279FF
0052C965
0058D4E3
现在看到什么了吧?0056A8D9的返回地址刚好有一个00518C2A,而我们刚才分析过是518C25该处的指令或其下级指令产生bug。
从指令开始,用断点和代码分析的方法(就是在函数开始的地方断点,一边按步过,一边分析代码描述的寄存器数据情况,以及分析代码的含义),根据56A8D9的返回地址逐层分析子指令,发现逐层指令都没有特殊的跳转,也不用怎么分析,直接下一层指令。发现返回地址006E96CE有一个代码006E96A9 - jmp dword ptr [ecx*4+006E987A],是点击根据兵力调整界面的不同格子,edx有不同的数据产生,且根据这些不同的数据跳转到不同的地方。可以判断为这条代码判断玩家点击的格子。其中点击英雄头像时edx固定为09,我们可以让代码当edx为09时跳转到没有意义的地方,就可以修复这个bug了。
现在我们可以开始写代码了:
6e96a3-----jmp 6e95ef
mov cl,[edx+006E9882]
cmp edx,09
je 006E96DA
jmp 6e96a9
最后转换为机器码:
把2e96a3改为E947FFFFFF90,把2e95ef改为8A8A82986E0083FA090F84DC000000E9A6000000
|
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|