这个标志的目的是什么(来自OS方面)? 哪个函数使用此标志除了isDebuggerPresent?
非常感谢
答案 0 :(得分:2)
它实际上是相同的,但读取PEB不需要通过内核模式跳转。
更明确地说,IsDebuggerPresent
API已记录并且稳定;可以想象,PEB结构不会在不同版本之间发生变化。
此外,IsDebuggerPresent
API(或标志)仅检查用户模式调试器;通过此函数无法检测到内核调试程序。
为何将它放入PEB?它节省了一些时间,这在NT的早期版本中更为重要。 (在执行某些运行时验证之前,有许多用户模式函数会检查此标志,如果已设置,将会中断调试器。)
如果您将PEB字段更改为0,那么IsDebuggerPresent
也将返回0,但我相信CheckRemoteDebuggerPresent
不会。
答案 1 :(得分:0)
如您所见,IsDebuggerPresent标志从PEB读取此信息。据我所知,PEB结构不是官方API,但IsDebuggerPresent是你应该坚持到那一层。
如果您正在进行复制保护以防止调试您的应用,则此方法的使用非常有限。正如您所发现的那样,它只是您处理空间中的一个标志。如果有人调试你的应用程序,他需要做的就是将PEB表中的标志清零并让你的应用程序运行。
您可以使用方法CheckRemoteDebuggerPresent提高级别,您可以在其中传入自己的流程句柄以获得答案。此方法进入内核并检查是否存在与您的进程相关的特殊调试结构(如果正在调试)。用户模式过程不能伪造这个,但你知道只需删除你的支票就可以解决....