启动debugee时,调试器如何绕过映像文件执行选项?

问题描述 投票:0回答:1

我正在Windows内部进行一些讨论,以便进行一般的启发,我正在尝试理解图像文件执行选项背后的机制。具体来说,我为calc.exe设置了一个调试器条目,其中"C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe" -NoLogo -NoProfile -NoExit -Command "& { start-process -filepath $args[0] -argumentlist $args[1..($args.Length - 1)] -nonewwindow -wait}"作为有效负载。这导致了递归,许多PowerShell实例被启动,这是有意义的,因为我正在拦截他们对calc.exe的调用。

但这引出了一个问题:正常的调试器如何在不导致这种递归行为的情况下启动测试中的程序?

debugging createprocess windows-nt
1个回答
2
投票

真的,没有接受者?

无论如何,它是Windows内部的一个很好的问题,但它现在有兴趣的原因是它已经成为我的一个实际问题。在某个地方,我付费的工作是三台计算机,每台计算机都有不同的Windows版本甚至是不同的调试器,使用这种IFEO技巧会导致调试器调试本身,显然陷入了这个麻烦OP的循环。

调试器通常如何避免这种循环?好吧,他们自己却没有。 Windows为他们避免了这个问题。

但让我们首先看一下循环性。 PowerShell混合物几乎没有帮助简单的演示,而且calc.exe不像以前那样。让我们将notepad.exe的Debugger值设置为“c:\ windows \ system32 \ cmd.exe / k”(不带引号)。 Windows将此解释为意味着尝试运行notepad.exe通常应该运行“c:\ windows \ system32 \ cmd.exe / k notepad.exe”。 CMD会将此解释为运行notepad.exe并挂起的含义。但是这个执行notepad.exe也将变成“c:\ windows \ system32 \ cmd.exe / k notepad.exe”,依此类推。任务管理器将很快显示数百个cmd.exe实例。 (好消息是它们都在一个控制台上并且可以一起被杀死。)

OP的问题是为什么CMD及其用于运行子节点的/ k(或/ c)切换在Debugger值中循环,但WinDbg却没有。

从某种意义上说,答案是在未记录的结构中的一位,即PS_CREATE_INFO,它在NtCreateUserProcess函数的用户和内核模式之间交换。这种结构在某些圈子中已经相当广为人知,而不是它们似乎如何表达。我认为结构可以追溯到Windows Vista,但是直到Windows 8才知道微软的公共符号文件,甚至不是来自内核,而是来自Internet Explorer组件URLMON.DLL。

无论如何,在PS_CREATE_INFO结构的现代形式中,偏移量0x08(32位)或0x10(64位)的0x04位控制内核是否检查调试器值。符号文件告诉我们这个位被Microsoft称为IFEOSkipDebugger。如果此位清零并且存在调试器值,则NtCreateUserProcess将失败。通过PS_CREATE_INFO结构的其他反馈告诉KERNELBASE,它对CreateProcessInternalW的处理,让它自己查看Debugger值并再次调用NtCreateUserProcess,但是(可能)是其他一些可执行文件和命令行。

相反,当设置该位时,内核不关心调试器值,并且NtCreateUserProcess可以成功。通常如何设置该位是由KERNELBASE设置的,因为调用者不仅要求创建进程,而且要求成为新进程的调试器,即在进程创建标志中设置了DEBUG_PROCESS或DEBUG_ONLY_THIS_PROCESS。这就是我的意思,说调试器本身不做任何事情来避免循环。 Windows只为他们想要调试可执行文件而为他们做这件事。

将调试器值视为可执行X的映像文件执行选项的一种方法是,值的存在意味着X不能执行,除非在调试器下,值的内容可能告诉如何执行此操作。正如黑客早就注意到的那样,并且内核程序员之前会注意到,内容不需要指定调试器,并且可以调整值以便尝试运行X而不是运行Y.少注意到Y将无法除非Y调试X(或禁用调试器值),否则运行X.同样不太注意的是,并非所有运行X的尝试都会运行Y:调试器尝试将X作为调试对象运行将不会被转移。

好吧,够了。现在我必须为我的网站写PS_CREATE_INFO。

© www.soinside.com 2019 - 2024. All rights reserved.