前一篇文章
【逆向】扫雷算法分析
主要分析了 扫雷 的部分算法(绘制雷区和生成地雷),本篇文章开始着手对扫雷进行部分破解。
首先肯定要去除的就是时间校验了。
一般设置时间都会调用到SetTimer这个函数,直接找一下啊函数,果然发现程序有这个函数的调用,直接下断点
F9运行,当点击雷区的时候,程序断下
0100383B |. 6A 00 push 0x0 ; /Timerproc = NULL
0100383D |. 68 E8030000 push 0x3E8 ; |Timeout = 1000. ms
01003842 |. 53 push ebx ; |TimerID
01003843 |. FF35 245B0001 push dword ptr ds:[0x1005B24] ; |hWnd = 001F0666 (‘扫雷‘,class=‘扫雷‘)
01003849 |. 891D 64510001 mov dword ptr ds:[0x1005164],ebx ; |
0100384F |. FF15 B4100001 call dword ptr ds:[<&USER32.SetTimer>] ; \SetTimer
SetTimer函数的原型
UINT_PTR SetTimer(
HWND hWnd, // 窗口句柄
UINT_PTR nIDEvent, // 定时器ID,多个定时器时,可以通过该ID判断是哪个定时器
UINT nElapse, // 时间间隔,单位为毫秒
TIMERPROC lpTimerFunc // 回调函数
);
下断运行,发现每当鼠标点击界面的时候,就会触发这个函数,发生中断,但是当恢复运行的时候,秒数依然在增加,所以这个函数并不是记录时间的关键
看看附近代码,发现了一处关键点
01003830 > FF05 9C570001 inc dword ptr ds:[0x100579C] ; ??可疑点
对0x100579c的地方下内存写入断点,重新运行,当界面出现时,点击鼠标,程序断下,再次运行,发现程序再次断下
再次运行,程序再次断下,发现0x100579c地方变成2,那么可以看见,这个地方就是记录程序的运行时间。
直接nop点这段代码保存,就去掉时间限制了
其实破解的方法还有很多。对于内存变化,可以用CE(Cheat Engine )来扫描内存中出现变化 的地方
ce附加扫雷进程
0的时候扫描一次
5的时候扫描一次
30的时候扫描一次
确定地址为0x100579c,和上面od找到的地址一样,同样的od载入,转到对应代码nop掉就行了。
最近实在太忙,所以很早之前欠下的文章慢慢补齐来。接下来差不多准备写一个一键扫雷的外挂了,敬请期待n(≧▽≦)n
原文地址:http://blog.csdn.net/nightsay/article/details/45844119