3

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

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

由于目标应用程序预计会死机,因此实用程序无法向其发送消息以触发诊断收集。相反,我正在使用CreateRemoteThread这样我可以确保获得一个实时线程来完成这项工作。

请注意,这与 DLL 注入方法不同,后者通常LoadLibrary用作CreateRemoteThread. 我的线程 proc 是目标应用程序的入口点。所以,我不需要打电话WriteProcessMemory

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

PROCESS_CREATE_THREAD, PROCESS_QUERY_INFORMATION, PROCESS_VM_OPERATION, PROCESS_VM_WRITE, 和PROCESS_VM_READ

所以,我在调用OpenProcess.

现在,最后,我的问题是:我需要我的令牌拥有什么特权才能使调用OpenProcess成功?

在我的测试环境(Windows 7,启用 UAC,管理员用户)中,我只使用默认令牌没有遇到任何问题。我已经看到了各种SE_DEBUG_NAME在调用之前获得特权的示例代码OpenProcess。我的猜测是WriteProcessMemory在进行 DLL 注入时需要它并且我不需要该特权。在某些情况下我需要调整我的令牌权限吗?

我对 Windows 安全一无所知,所以我非常感谢任何这样做的人的明智之言!

4

1 回答 1

3

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

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

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

于 2012-08-29T23:53:58.083 回答