扫雷初步分析
一、程序分析
1.寻找关键内存地址
这次用到了CE,用CE扫描内存,通过查找不同的时间可以找到一个随时间一直变的内存地址,可以猜想,这个内存地址存放着时间变量,即内存0x100579C储存有时间。
用OD在此下断点,可以断在一个看起来比较重要的地方,可以猜想时间每过一秒,会在这里通过setTimer函数来设置时间,
再往后依靠这里修改时间,如果1005164不等于0并且,100579c小于999,则时间加一,我们知道了,0x100579c是储存时间的内存,所以这里不难理解–控制游戏时间;那0x1005164呢?
可以看到,0x1005164处的值是1,所以时间一直增加,那么什么时候时间不会增加了呢?对,游戏结束,所以可以猜一波,这里是游戏结束的标志。结束游戏试一下,可以看到,数值变了,所以这里是判断游戏结束的标志。
从此处向上回溯,先下个内存写入断点,断下来了,可以看到,让这里的数据和0x0与(结果一定是0),从而结束游戏,所以上面会有逻辑判断游戏的状态。
再往上走,在堆栈窗口中右键,在反汇编窗口跟随,可以来到上游代码。
截屏截不全,具体逻辑是将[ecx+esi+0x1005340]处的数值与0x80与,如果等于0就跳转,这次跳转会跳过游戏结束那个函数,表示无雷,同时0x1005338处储存有你的点击次数,如果为0,也不会结束,所以关注点来到了eax,esi上,这两个数加上0x1005340是什么意思?我们在数据窗口查看一下可以看到,他是一串的16进制数,ecx,esi指定了这些数的一个位置。
再往上找,会发现有一个分支,通过系统注释,可以看出应该是松开右键事件,往下有个函数,可以猜一下,这个函数里存在eax,ecx的赋值语句,因为进入函数之前两个寄存器并没有什么异常。
0x1005118 和0x100511c分别赋值给了eax,ecx,问题进而变成了0x1005118和0x100511c如何被赋值,在数据窗口中跟随,并下个内存写入断点。
进而我们找到了更上面
可以知道,这两个参数指的是格子的坐标值。
这是吾爱**上的师傅找这两个寄存器的思路,我觉得多次调试分别看一下他们的值就行,可以看到,eax存的是行值,ecx存的是列值。
然后,经过以下逻辑,内存数值经过变化,0x1f变为0表示无雷,0x8f变成0x80表示有雷。
参考文章:https://www.52pojie.cn/thread-1174768-1-1.html