成果:win7扫雷外挂(只支持32位)
目标:找到可判断是否是雷的地址、雷区宽度高度地址
首先尝试XP扫雷的bp rand然后一直被断下无法运行,有人把每个调用rand的地方都记录下来然后一个个排除,但是我没这个耐心所以换个方法
注意到游戏结束后会弹出个对话框所以bp DialogBoxParamW,玩一局后断下来,Ctrl+F9几次找到
00693C7A |. 8BCE mov ecx, esi
00693C7C |. E8 6FF0FFFF call 00692CF0 ; 失败
(注:minesweeper.exe模块的地址是会变的所以不要直接用前面的地址)
或者
00693C3F |. 8BCE mov ecx, esi
00693C41 |. E8 8CF0FFFF call 00692CD2 ; 胜利
往上可以找到游戏结束的条件
00693BE6 |. 8B46 28 mov eax, dword ptr [esi+28]
00693BE9 |. 3BC3 cmp eax, ebx
00693BEB |. 75 2C jnz short 00693C19 ; 游戏结束 eax ==[esi+0x28] != ebx == 1
对esi+28下硬件写入断点,踩一个雷,断下
00C617B8 |. 8946 28 mov dword ptr [esi+28], eax ; 写入游戏状态 4结束 3胜利 2结束动画播完 1开始
Ctrl+F9找哪里调用了这个函数,并且前面要有可以跳过这个调用的条件
005D8986 |> \83BE 9C000000>cmp dword ptr [esi+9C], 0 ; [esi+0x9C] != 0 游戏状态改变
005D898D |. C686 AC000000>mov byte ptr [esi+AC], 0
005D8994 |. 5F pop edi
005D8995 |. 74 1