窗口应用程序 - 调试器是否停止窗口线程?

逆向工程 调试
2021-06-18 07:57:50

使用调试器 x64dbg,我注意到我的应用程序使用了多个线程,如下所示:

线程

其中,一个线程肯定是用于窗口的,因为应用程序是一个窗口应用程序。

奇怪的是,EIP 永远不会改变

但是,移动窗口或写入窗口必须更改EIP对吗?由于负责窗口的线程必须连续运行以防止窗口冻结。

你能解释一下为什么 EIP 永远不会改变吗?它与x64dbg有关吗?

谢谢 !

2个回答

x64dbg 的“线程”页面仅每两秒刷新一次,速度不够快,无法看到大部分阻塞等待的线程(例如应用程序的消息循环线程)中发生的事情。

您可以通过查看“用户时间”列来验证线程是否被时间切片。将窗口四处移动几秒钟,您应该运行足够多的应用程序代码以查看“用户时间”增量。

编辑地址@Duke Nukem 的评论:

Windows 上的活动调试器依赖于事件系统,因此它们中的大多数只是坐在那里,直到发生异常、断点或用户交互时才执行任何操作。这些调试器(WinDbg、VS 等)在目标运行时不会显示任何线程状态或类似的东西(只有在目标被破坏时才能获得该信息)。

这就是不熟悉 x64dbg 的人感到困惑的地方。x64dbg Threads 选项卡不绑定到调试事件系统,它只是一个监视工具,它定期扫描目标中的所有线程(即使它正在运行)并获取计时统计信息并查询线程的上下文以显示当前指令指针。

您无法同时查看所有线程的上下文。你应该切换感兴趣的线程。例如,现在我将从线程 3 切换到线程 2。

在 Windbg 中,您可以使用“~”列出当前进程中的所有线程。

WINDBG>~

0  Id: 6c4.4c0 Suspend: 1 Teb: 7ffde000 Unfrozen
1  Id: 6c4.240 Suspend: 1 Teb: 7ffdd000 Unfrozen
2  Id: 6c4.9dc Suspend: 1 Teb: 7ffdc000 Unfrozen
3  Id: 6c4.728 Suspend: 1 Teb: 7ffdb000 Unfrozen
4  Id: 6c4.b1c Suspend: 1 Teb: 7ffda000 Unfrozen

然后你可以使用'>~[Thread number]s'

WINDBG>~2s

eax=00000001 ebx=00000001 ecx=773b73a8 edx=26aa5eee esi=00000002 edi=00288800
eip=77b470b4 esp=0132f9b8 ebp=0132fb18 iopl=0         nv up ei pl nz na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00000206
ntdll!KiFastSystemCallRet:
77b470b4 c3              ret

现在您可以跟踪线程 2 的执行、设置 bp 等。