我正在为我的应用程序开发一个调试工具来帮助我诊断死锁。该应用程序在我客户的机器上运行,因此我期望有广泛的操作系统、安全策略等。
我使用的技术是在目标应用程序中实现一个函数,该函数为所有线程生成堆栈跟踪以及其他诊断信息。然后将其写入内存映射文件。我还在创建一个实用程序应用程序,用于触发诊断报告的创建,然后从内存映射文件中读取它。
由于目标应用程序预计会死机,因此实用程序无法向其发送消息以触发诊断收集。相反,我正在使用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 安全一无所知,所以我非常感谢任何这样做的人的明智之言!