使用 int 3h 运行汇编程序时,Windows 7x86 系统冻结

逆向工程 视窗 部件 调试 风袋
2021-06-23 17:25:03

最近在做一些 pydbg 测试,所以我不得不删除注册表中的 AeDebug 条目(它决定了 JIT 调试器),而 Windbg 是(现在也是)我的 JIT 调试器。在删除之前导出密钥。它是:

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug

这些值是:

(Default) REG_SZ (value not set)
Auto REG_SZ 1
Debugger REG_SZ "C:\...\windbg.exe" -p %ld -e %ld -g
UserDebuggerHotKey REG_DWORD 0x00000000 (0)

现在我不得不在 Windbg 中测试其他一些东西,所以我在 .reg 文件中添加了导出的 AeDebug 密钥。

但是,当我尝试运行一些与 int 3h/0xCC 联系的测试汇编程序(这应该使 Windbg 作为我的 JIT 调试器出现)时,我的系统在没有蓝屏死机的情况下冻结,我必须关闭/重新打开电源。

我已经删除了所有 AeDebug 并重新运行“windbg -I”以将其注册为我的 JIT 调试器。但是,我仍然遇到系统冻结!

请帮忙!到目前为止,只有当我运行的代码中包含 int 3h 断点时才会发生这种情况。

我尝试运行我用以下内容编译的程序集 (masm32) 程序进行测试:

.586
.model flat, stdcall

option casemap:none

includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\user32.lib

include \masm32\include\kernel32.inc
include \masm32\include\user32.inc
include \masm32\include\windows.inc

.code
start:
xor eax, eax
xor ebx, ebx
xor ecx, ecx
xor edx, edx
int 3h
invoke ExitProcess, 0
END start

但是,系统仍然冻结。当我首先运行 windbg 并退出断点时,它会像正常一样退出,但不会影响我的整个系统。

如何再次获得不会导致未定义行为的正常断点?

2个回答

当您启用了内核调试但没有附加内核调试器时,就会发生这种情况。

简而言之,冻结发生在,

  • 内核调试已启用。
  • 未附加内核调试器。(如果是,控制将转移给它)。
  • Jit 调试器已启用/禁用(无关紧要)。
  • 应用程序没有被像 WindDbg 或 OllyDbg 这样的用户模式调试器主动调试

对于Windows XP,请参阅boot.ini. 如果boot.ini/debug标志,则表示启用了内核调试。

对于Windows 7及更高版本,您可以使用bcdeditmsconfig您还可以使用该命令bcdedit | findstr debug检查调试标志是否已启用。

要解决此问题,只需从引导项中删除调试标志即可。

从您的问题中不清楚标题中的 x86 是否与处理器或进程有关。

如果您实际运行的是 64 位处理器/操作系统,但运行的是 32 位应用程序,那么您可能设置了错误的 AeDebug 键。一种用于 32 位应用程序,一种用于 64 位应用程序。确保将它们都设置为适当版本的windbg。

HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\AeDebug
HKLM\SOFTWARE\Wow6432Node\Microsoft\Windows NT\CurrentVersion\AeDebug