为什么我在调试时会在 winapi 中进入无限循环?

逆向工程 ollydbg 登录
2021-07-05 13:10:54

我正在调试一些名为“abex crackme 1”的测验程序

当我在没有调试的情况下执行这个程序时,它会显示一个简单的消息框,上面写着“让我认为你的 HD 是一个 CD-Rom”

单击“确定”按钮后,它可以顺利运行,没有任何问题。

但是当我调试这个程序时,我陷入了无限循环。

程序代码是这样的:首先,它从dll中调用一些函数来初始化一些东西。但我觉得现在已经无所谓了。

并且,它推送一些参数并调用 WinAPI 函数“MessageBox A”(见下文) 第 5 行是我所指的 当我尝试在 ollydbg 中跳过此 Call 指令时,会弹出一个消息框。当我像我一样点击 OK 按钮时,我无法转义一些代码块(图 2) 无限循环

我不知道为什么只有在我调试时才会发生这种情况。

1个回答

仔细查看您在其中循环的代码:它在几个地方使用了 FS 寄存器。现在,谷歌搜索“windows FS register”告诉你这保存了TIBfor Thread Information Block的段和该块中的第一个条目,在字节偏移0,具有当前的地址SEH结构化异常处理程序

您上面的代码正在写入该 SEH,因此可以合理地假设(因为它在 ntdll.dll 中)这是内核处理(可能是嵌套的)异常的部分。似乎您的应用程序以某种方式检测到调试器的存在,并在这种情况下设置了一个虚假的异常处理程序。这可能发生在你MessageBoxA打电话之前

如果有任何调用,我会检查汇编代码IsDebuggerPresent或者,它可能会在 处获取当前 PEB(进程环境块)的地址[fs:0x30],并读取它的第二个字节,这是一个BeingDebugged标志。可能您的代码使用其中一些来检查调试器,并在这种情况下对异常处理程序执行某些操作。

此外,您的示例可能只是设置了一个异常处理程序,然后执行“非法”指令,例如sti,或访问未映射的内存位置。这将引发异常;但是如果你只是单步执行你的程序,Olly 不会知道异常会发生,所以它会将它的临时单步断点放在错误的位置。单步执行时尽量记住异常发生的地址,下次注意在异常处理程序上加断点。