该程序显然不会在其中存储有趣的字符串内存,所以我尝试了另一种方法,到目前为止,该方法在测试场景和crackme中都运行良好。输入密码的提示本身使用简单的编辑控件,因此我立即查找了可执行模块-> USER32.dll,并找到了GetWindowTextW偏移量(我知道它可能正在使用其他方式来检索文本,但这不是问题)
在那里设置断点并尝试f9运行程序会导致它崩溃。
我是反向和调试器的新手,我真的不知道可能是什么引起了问题,或者我应该在哪里解决。
PS:这是完成任务的好方法吗?
#1 楼
基本上,您的方法是一个很好的第一方法。十年前使用它就容易破解程序。但是时代已经变了,许多程序试图检测它们是否被破解并实施对策。可能会发生很多事情。该程序可能使用
IsDebuggerPresent()
。它可以使用其他方法来检测调试器。它可能会在自己的内存上生成一个校验和,并针对一个已知值进行检查(设置断点会将指令修改为INT 3
,除非您使用硬件/内存断点,但是如果将断点放在user.dll
中的函数上,则不会更改可执行文件的校验和)。如果其中一个以INT 3
指令开头,则程序可能会检查其调用的函数(但我认为仅GetWindowTextW
不会是这种情况)。如果程序在恢复F9而不是第一次运行F9时崩溃,则可能是检查密码需要花费多长时间,如果超过0.1秒,则认为该密码已中断并崩溃。实际上有数十种可能性,您必须在程序中跟踪使用的方法,以找出使用的方法-这是经验的发源地。只需加载并运行它-如果没有,它将检测到您的调试器。您可能想尝试使用ollydbg的隐形插件。
有时对我有用的另一种方法是运行Process Monitor来查看程序在何处访问其(基于文件或注册表的)注册密钥。 ;检查堆栈以查看哪个函数正在调用该访问,并从那里静态分析程序。
评论
谢谢,我会牢记您的所有提示,并加深我对用于检测调试器的对策的知识
–行叛军
2015年4月1日在18:02