【发布时间】:2017-03-02 15:50:41
【问题描述】:
我尝试在调试器 (x32dbg) 中研究从 Windows x86 上的 cpp 程序输出到控制台的源。
我试图在kernel32 和kernelbase dll 中与console 有某种关联的每条指令上都设置一个断点,但没有命中任何断点,同时大量输出被写入控制台。
有谁知道我可以在调试器中的何处放置断点(x32dbg \ windbg 等)以捕获那些写入控制台事件?
【问题讨论】:
-
这可以依赖于 Windows 版本,但在现代版本中 - 将 bp 设置为
kernelbase.ConsoleCallServerGeneric(您需要使用 pdb)或ntdll.ZwDeviceIoControlFile(导出) -
我在 Windows 10 上工作。我在
windbg上设置了断点,但它只在执行开始时中断,而在实际控制台上写它没有命中.. -
奇怪 - 正是在 win10 上,此 api必须为任何控制台操作调用
-
从 win7 开始,所有与控制台的通信都通过
ZwDeviceIoControlFile在\Device\ConDrv上 - 所以这是 100% 调用 -
控制台使用单独的进程来管理窗口 -
conhost.exe(我在这里不说 xp,csrss 这样做)并且与此进程的所有通信都是通过ZwDeviceIoControlFile上的\Device\ConDrv句柄完成的 -别无他法