逆向作业——扫雷0秒破解 这学期的逆向期末大作业是破解扫雷由于我不是逆向这个方向的所以对逆向破解了解不多正好一直不知道写些啥进博客干脆把作业写进来吧。内容不是很多很短但是破解这玩意儿真挺有意思的。 扫雷想做到0秒通关可以在某种意义上进行0秒通关第一点就是让时间永恒为0不增加第二点就是让在游戏开始的一瞬间直接通关。 但显然这个游戏好像有点不太可能用到第二种手法了因为游戏在开始的一瞬间时间就变成了1。 那就只有在时间上动手脚了。 用CE查看时间所对应的变量所在地址 之后让游戏运行这看看哪些汇编指令写入了这个地址 这里存在一个自增指令地址在 0x01002FF5。 在反汇编页面看到了程序大概的逻辑就是检查时间是否为999如果不是就自增1。 直接nop掉即可。 点击笑脸之后发现多了一条对这一内存进行操作的指令地址为0x0100371A 推测这一条指令在初始化相关的函数里。 而在游戏开始的时候也就是第一次点击格子的时候又多出来了一条新的指令写入了这一内存地址在0x01003830 直接nop掉 另外关于计时器右上角那个时间会根据游戏是否进行而动推测游戏开始的时候计时器启动状态为1结束的或初始化之后状态为0 发现了两条但是在踩雷之后发现这里 Winmine.exe5164这个地址变成了0所以这个肯定就是计时器了那么在初始化的时候看看有没有地址访问它 有进入动调页面看看在这里打个断点然后进行调试 程序在这一段内进行了循环lea eax, ds:[eaxesi*10x1005340]这里对0x1005340这个地址的寻址方式是一个二维数组的寻址方式所以这个地方应该是个二维数组应该是雷区。、 确实是雷区并且经过游玩雷区内数据如下0x8X 是雷区0x0X 是未翻开的安全格0x4X 是翻开的安全格0xXE 是插上旗子的格子 现在的想法就是让其在初始化的时候就让其给旗子插上在游戏每次经过这个指令的时候雷区就会多出一个雷。 所以修改这个即可让其在初始化的时候就将雷置为 0x8E 这么修改就行了。 当游戏胜利的时候游戏状态进行了一次更新这条指令被执行了 然后就是在这里打个断点进行动调当执行到这里的时候出现了弹窗 执行到这里的时候游戏的图标发生了变化。 执行到这里的时候发生了弹窗。 从栈帧回溯可以看到100347C被35B0这里调用 在这里给上面的cmp加上断点重开一把游戏后第一次点击非地雷的时候发生了一次判定之后每一次点击都进行了一次判定且只有当游戏胜利时候才会运行这里 所以估计这个判定跟游戏是否胜利有关系 直接修改让他自己跟自己比较 只点击一次非地雷之后游戏胜利实现完全的0秒完成游戏。
扫雷0秒破解--记录一次逆向期末作业
发布时间:2026/7/18 15:31:33
逆向作业——扫雷0秒破解 这学期的逆向期末大作业是破解扫雷由于我不是逆向这个方向的所以对逆向破解了解不多正好一直不知道写些啥进博客干脆把作业写进来吧。内容不是很多很短但是破解这玩意儿真挺有意思的。 扫雷想做到0秒通关可以在某种意义上进行0秒通关第一点就是让时间永恒为0不增加第二点就是让在游戏开始的一瞬间直接通关。 但显然这个游戏好像有点不太可能用到第二种手法了因为游戏在开始的一瞬间时间就变成了1。 那就只有在时间上动手脚了。 用CE查看时间所对应的变量所在地址 之后让游戏运行这看看哪些汇编指令写入了这个地址 这里存在一个自增指令地址在 0x01002FF5。 在反汇编页面看到了程序大概的逻辑就是检查时间是否为999如果不是就自增1。 直接nop掉即可。 点击笑脸之后发现多了一条对这一内存进行操作的指令地址为0x0100371A 推测这一条指令在初始化相关的函数里。 而在游戏开始的时候也就是第一次点击格子的时候又多出来了一条新的指令写入了这一内存地址在0x01003830 直接nop掉 另外关于计时器右上角那个时间会根据游戏是否进行而动推测游戏开始的时候计时器启动状态为1结束的或初始化之后状态为0 发现了两条但是在踩雷之后发现这里 Winmine.exe5164这个地址变成了0所以这个肯定就是计时器了那么在初始化的时候看看有没有地址访问它 有进入动调页面看看在这里打个断点然后进行调试 程序在这一段内进行了循环lea eax, ds:[eaxesi*10x1005340]这里对0x1005340这个地址的寻址方式是一个二维数组的寻址方式所以这个地方应该是个二维数组应该是雷区。、 确实是雷区并且经过游玩雷区内数据如下0x8X 是雷区0x0X 是未翻开的安全格0x4X 是翻开的安全格0xXE 是插上旗子的格子 现在的想法就是让其在初始化的时候就让其给旗子插上在游戏每次经过这个指令的时候雷区就会多出一个雷。 所以修改这个即可让其在初始化的时候就将雷置为 0x8E 这么修改就行了。 当游戏胜利的时候游戏状态进行了一次更新这条指令被执行了 然后就是在这里打个断点进行动调当执行到这里的时候出现了弹窗 执行到这里的时候游戏的图标发生了变化。 执行到这里的时候发生了弹窗。 从栈帧回溯可以看到100347C被35B0这里调用 在这里给上面的cmp加上断点重开一把游戏后第一次点击非地雷的时候发生了一次判定之后每一次点击都进行了一次判定且只有当游戏胜利时候才会运行这里 所以估计这个判定跟游戏是否胜利有关系 直接修改让他自己跟自己比较 只点击一次非地雷之后游戏胜利实现完全的0秒完成游戏。