其中有一个线程肯定是用于窗口的,作为应用程序是窗口应用程序。
奇怪的是EIP永远不会改变。
但是,移动窗口或在其中写入必须更改EIP吗?因为负责窗口的线程必须连续运行才能防止窗口冻结。
您能解释一下为什么EIP永不改变吗?与x64dbg有关吗?
谢谢!
#1 楼
x64dbg的“线程”页面仅每两秒钟刷新一次,其速度几乎不足以使大部分阻塞的线程(例如应用程序的消息循环线程)无法正常运行。您可以通过查看“用户时间”(User Time)列来验证线程是否正在按时间分段。将窗口移动几秒钟,您应该使足够的应用程序代码运行以查看“用户时间”增量。
编辑地址@Duke Nukem的注释:
活动Windows上的调试器依赖于事件系统,因此大多数调试器只是闲坐无事,直到发生异常,断点或用户交互时才做任何事情。在目标运行时,这些调试器(WinDbg,VS等)将不会显示任何线程状态或类似状态(仅当目标被入侵时,您才能获得该信息)。
对于不熟悉x64dbg的人来说,这就是混乱的地方。 x64dbg的“线程”选项卡与调试事件系统无关,它只是一个监视工具,可以定期扫描目标中的所有线程(即使它正在运行),并获取计时统计信息,还查询线程的上下文以显示当前指令指针。
评论
这是正确的答案。当调试对象运行时,不断查询线程状态是没有意义的。如果您真的有兴趣,可以双击您感兴趣的线程,然后使用“转到->原点”选项强制刷新寄存器并导航到当前EIP / RIP。
– mrexodia
17年6月29日在22:28
这里公开了两种解决方案:1)blabb评论说调试器什么也不做,它只是在等待事件发生,它不知道exe在做什么。它可以解释为什么我们看不到EIP的变化。 2)由于线程是如此之快,因此无法刷新GUI。哪一个是正确的?
–努克公爵
17年6月30日在22:31
@DukeNukem-编辑了我的答案以提供更多详细信息/说明。
–乔希·波利(Josh Polary)
17年6月30日在22:53
#2 楼
您不能同时查看所有线程的上下文。您应该切换感兴趣的线程。例如,现在我将从线程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
然后可以使用'>〜[线程号] 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等。
评论
这不能回答问题。
–乔希·波利(Josh Polary)
17年6月29日在15:37
评论
解释eip永远不会改变如果您进入,跳过等或如果您强行更改,eip将会改变(x64dbg与ollydbg类似(32位),要在ollydbg中强行更改eip,您需要选择一个地址,然后单击鼠标右键,然后单击此处。认为x64dbg将具有与更改eip类似的功能)是您要查询的内容程序运行时,EIP也将更改。我可以移动窗口并在其上书写。 EIP必须更改然后...
仍然不清楚您是否设置了任何断点,并且处于断点状态?您谈论移动寡妇是否意味着您已经连接了调试器,但是exe正在免费运行?如果是,调试器什么也不做,它只是在等待事件发生,它不知道您的exe在做什么,也不知道eip在当前纳秒级的位置(您确实知道msgloop可能正在执行数万亿个时间和更新gui以反映这些更改几乎是不可能的吗?)
“如果是,调试器什么也不做,它只是在等待事件发生,它不知道您的exe在做什么”-是的,您是对的。可能是问题所在。但是由于线程速度,GUI也没有刷新。哪一个是正确的?
josh解释说,在您的x64dbg线程窗口中,他的编辑eip和计时状态会定期枚举(每个周期大约2秒),因此它与调试事件无关,如果您向taskmanager / process添加更多列,也可以看到这些详细信息也可以通过sysinternals进行监视