Windows 我是否需要调整令牌权限才能成功调用CreateRemoteThread?

Windows 我是否需要调整令牌权限才能成功调用CreateRemoteThread?,windows,winapi,Windows,Winapi,我正在为我的应用程序开发一个调试工具来帮助我诊断死锁。该应用程序在我客户的机器上运行,因此我希望有广泛的操作系统、安全策略等 我使用的技术是在目标应用程序中实现一个函数,该函数为所有线程生成堆栈跟踪以及其他诊断信息。然后将其写入内存映射文件。我还创建了一个实用程序应用程序,用于触发诊断报告的创建,然后从内存映射文件中读取它 由于预期目标应用程序将处于死机状态,因此实用程序无法向其发送消息以触发诊断收集。相反,我使用的是CreateRemoteThread,这样我就可以确保获得一个活动线程来完成这

我正在为我的应用程序开发一个调试工具来帮助我诊断死锁。该应用程序在我客户的机器上运行,因此我希望有广泛的操作系统、安全策略等

我使用的技术是在目标应用程序中实现一个函数,该函数为所有线程生成堆栈跟踪以及其他诊断信息。然后将其写入内存映射文件。我还创建了一个实用程序应用程序,用于触发诊断报告的创建,然后从内存映射文件中读取它

由于预期目标应用程序将处于死机状态,因此实用程序无法向其发送消息以触发诊断收集。相反,我使用的是
CreateRemoteThread
,这样我就可以确保获得一个活动线程来完成这项工作

请注意,这与DLL注入方法不同,后者通常使用
LoadLibrary
作为
CreateRemoteThread
的线程进程。我的线程进程是目标应用程序中的入口点。因此,我不需要调用
WriteProcessMemory

我已经实现了这一点,并且在我的测试环境中它运行良好。根据的文档,我需要具有以下访问权限的进程句柄:

PROCESS\u CREATE\u THREAD
PROCESS\u QUERY\u INFORMATION
PROCESS\u VM\u OPERATION
PROCESS\u VM\u WRITE
PROCESS\u VM\u READ

因此,我在调用
OpenProcess
时传递了这些标志

现在,我的问题是:为了成功调用
OpenProcess
,我需要我的令牌拥有什么特权

在我的测试环境(Windows7,支持UAC,管理员用户)中,我只使用默认令牌没有遇到任何问题。我看到过各种示例代码,它们在调用
OpenProcess
之前获得了
SE\u DEBUG\u NAME
特权。我的猜测是,在执行DLL注入时,
WriteProcessMemory
需要这个权限,而我不需要这个权限。是否存在需要调整令牌权限的情况


我对Windows安全一无所知,所以我真的很感激任何一个了解Windows安全的人所说的明智的话

通常,如果目标进程与调试器在同一上下文(即,同一用户)中运行,则OpenProcess或CreateRemoteThread都不需要特权

如果目标进程以其他用户身份运行,或者进程权限已被修改,则在调用OpenProcess之前,可能需要启用SE_DEBUG_NAME。此权限允许您打开任何进程,绕过分配给该进程的安全权限。(这类似于备份/还原权限允许您绕过文件和目录的安全权限的方式。)


某些应用程序修改自己的进程权限,例如,用户不能使用任务管理器终止进程。在这种情况下,它是您自己的代码,所以这不会是一个问题。原则上,某些其他软件(例如防病毒软件)可以修改进程的权限,但我从未听说过这种情况,因此您可能不需要担心启用SE_DEBUG_NAME。

这取决于进程运行的帐户。通常,以UserA身份运行的进程可以访问以UserA身份运行的其他进程。如果调试器和目标进程在同一帐户下运行,则不需要额外的权限。CreateRemoteThread的MSDN库文章中列出了您需要的访问权限。与您已经使用的内容相匹配。SE_DEBUG_NAME仅用于使DebugActiveProcess正常工作。所以你该走了。顺便说一句,如果您使用MinidumpWriteUp,调试死锁会容易得多。谢谢@Hans。我使用过MS崩溃转储,但问题是我没有一个工具可以处理它并查找符号。因为我的应用程序是用Delphi编写的,所以我没有可用的pdb或dbg文件。我可以为32个bir Delphi应用程序获取dbg文件,但不能为64位Delphi获取。这就是导致这种方法的原因。