从断点恢复后程序崩溃

逆向工程 视窗 部件 调试器
2021-06-14 10:02:35

在解决了一些破解问题后,我尝试更进一步,继续“现实生活”逆向任务,目标是已知的 win7 程序的密码检查功能。

有问题的程序显然不会在内存中存储有趣的字符串,所以我尝试了另一种方法,到目前为止,它在测试场景和裂纹中运行良好。密码提示本身使用了一个简单的编辑控件,所以我立即查找了可执行模块 -> USER32.dll 并找到了 GetWindowTextW 偏移量(我知道它可能使用替代方法来检索文本,但这不是问题)设置那里的断点并尝试 f9 运行程序会导致它崩溃。

我是倒车和调试器的新手,我真的不知道是什么导致了问题,或者我应该在哪里解决它。

PS:这可能是完成任务的好方法吗?

1个回答

基本上,你的方法是一个很好的第一个方法。10 年前,使用它可以轻松破解程序。但时代变了,许多程序试图检测它们是否被破解并实施对策。

有很多事情可能会发生。该程序可能会使用IsDebuggerPresent(). 它可以使用其他方法来检测调试器。它可能会在自己的内存上生成一个校验和,并根据已知值检查它(设置断点INT 3会将指令修改为,除非您使用硬件/内存断点,但是如果您将断点放在 中的函数上user.dll,则不会更改可执行文件的校验和)。如果其中一个函数以INT 3指令开头,程序可能会检查它调用的函数(但我认为这不仅仅是GetWindowTextW)。如果程序在恢复 F9 时崩溃,而不是第一次运行-F9,则可能是计时检查密码需要多长时间,如果超过 0.1 秒,则假定它被中断并崩溃。

实际上有几十种可能性,您必须在程序中跟踪自己的方式以找出使用的方法 - 这就是体验的来源。

如果您只是加载并运行程序,您可以尝试该程序是否有效 - 如果没有,它会检测您的调试器。您可能想尝试一些 ollydbg 的隐形插件。

有时对我有用的另一种方法是运行 Process Monitor 以查看程序访问其(基于文件或注册表的)注册键的位置;检查堆栈以查看哪个函数正在调用该访问,并从那里静态分析程序。