1、扫雷分析与一键秒杀实现扫雷逆向-雷区显示的各种情况2012年12月28日 星期五23:52扫雷分析手记首先运行扫雷,如图1 图1发现UI上面有显示数字667,那么就可以考虑借助CE工具了.打开CE工具,附加扫雷进程,并扫描十进制数值667,如图2 图2出现3个地址,而且都是绿色的,表示是基址,然后单击鼠标右键,让旗帜数量减少一个,变成了666,如图3 图3然后在CE用再次搜索十进制数值666,这个时候只剩下一个地址了,如图4 图5这唯一的地址就是旗帜的内存地址了.然后打开扫雷菜单栏中自定义窗口,如图6 图6这个编辑框可以编辑雷区的数组高度和宽度以及地雷的数目,使用同上面定位旗帜内存地址的方法可
2、定位高度,宽度,雷数的内存地址为0x01005338,0x01005334,0x01005330信息归纳如下:雷区数组x,y下标从1开始数组高度基址:0x01005338数组宽度基址:0x01005334地雷个数基址:0x01005330旗帜个数基址:0x01005194数组最大范围由 0x1005340 - 0x100565E 接下来打开OD,定位当地雷个数的内存地址,如图7 图7试想一下,如果要插上旗帜,必然要访问数组对吧,并且旗帜数会减少,这点毫无疑问,对旗帜个数所在内存0x01005194,下内存写入断点即可,然后运行起扫雷,然后插上一颗旗帜,这个时候就断下来了,如图8 图8这里减少了
3、旗帜的数目.会发现这里是跟旗帜相关,雷区数组内存地址还无法定位,所以马上改换策略,对地雷个数所在内存地址下内存写入断点,然后通过自定义窗口修改一下地雷的数目,这个时候就会断下来,下面就对网格数组的访问,数组访问公式也产生了,如图9 图9接下来就是根据数组计算公式 Address = 1005340h + 高度*32 + 宽度 来确定网格中的各种状态,我们选择左上角的点来计算,方便一下,Address = 1005340h + 1*32 + 1 = 1005361h,如图10 图10在这里插上一个旗帜,必然会将这个标志修改为旗帜的标志,所以对这个字节下一个内存写入断点,运行起来扫雷,并插上一根旗
4、帜,马上就断下来了,如图11 图11这样就能知道8E是插上旗帜的状态了,测试一下可知这个函数是插旗帜函数,然后继续按上面方法测试各种状态,归纳各种状态如下:白方块(上面什么都没有):0F显示出来时地雷上面一个叉叉:0B旗帜:没有插在地雷上(但是未显示):0E 插在地雷上:8E 地雷:有雷状态(未显示出来):8F 踩到地雷爆炸:CC 地雷显示出来但是未踩上:8A显示出来的空格子:40显示出来的1:41显示出来的2:42 图文对照如图12 图12 图13网格内存地址计算公式图文说明如图14: 图14 图15 图16成功的状态如图17: 图17最后注入扫雷,将扫雷调成最高难度,单击鼠标右键秒杀效果如图18: 图18