在使用调试器x64dbg玩游戏时,我注意到我的应用程序使用多个线程,如下所示:



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

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

但是,移动窗口或在其中写入必须更改EIP吗?因为负责窗口的线程必须连续运行才能防止窗口冻结。

您能解释一下为什么EIP永不改变吗?与x64dbg有关吗?

谢谢!

评论

解释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进行监视

#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