- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我所能找到的关于根据我的需要升级到适当权限的所有内容都与我当前的方法一致,但问题仍然存在。我希望也许有人有一些 Windows Vista/Windows 7 内部体验,可能会在只有黑暗的地方发光。我相信这会持续很长时间,但请耐心等待。
语境
我正在开发一个需要访问当前机器上其他进程的内存的应用程序。显然,这需要管理员权限。它还需要 SeDebugPrivilege
(不,这不是 SetDebugPrivilege
的拼写错误),我相信自己是正确获得的,尽管我质疑是否不需要更多特权,从而导致我的问题。到目前为止,代码已在所有版本的 Windows XP 以及我的测试 Vista 32 位和 Windows 7 64 位环境中成功运行。
过程
Access Token
包括 SeDebugPrivilege
权利。 EnumProcesses
在系统上创建当前 PID 的列表 OpenProcess
打开句柄与 PROCESS_ALL_ACCESS
访问权限ReadProcessMemory
读取其他进程的内存。 OpenProcess
似乎存在特权/权限问题。因通用
Access Denied
而失败错误。以受限用户身份运行时(如预期的那样)和明确以管理员身份运行时(右键单击 → 以管理员身份运行以及从管理员级别命令提示符运行时)都会发生这种情况。
OpenProcess
在另一个进程上。我对 Vista/Windows 7 的内部结构不够熟悉,无法知道这可能是什么,我希望有人知道可能是什么原因。
RunWithDebugEnabled
的小应用程序。这是一个小型 bootstrap ,它似乎会提升自己的权限,然后启动传递给它的可执行文件(从而继承提升的权限)。当使用此程序运行时,在 UAC 提示下使用相同的域管理员凭据,程序可以正常工作并且能够成功调用
OpenProcess
并按预期运行。
OpenProcess
报告的错误尝试是
Access Denied
.根据
OpenProcess
的 MSDN 文档:
If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor.
SeDebugPrivileges
可能存在问题。或 (2) 需要任何 MSDN 文档中未提及的其他权限,这些权限可能在域管理员帐户和本地管理员帐户之间有所不同
void sample()
{
/////////////////////////////////////////////////////////
// Note: Enabling SeDebugPrivilege adapted from sample
// MSDN @ http://msdn.microsoft.com/en-us/library/aa446619%28VS.85%29.aspx
// Enable SeDebugPrivilege
HANDLE hToken = NULL;
TOKEN_PRIVILEGES tokenPriv;
LUID luidDebug;
if(OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken) != FALSE)
{
if(LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &luidDebug) != FALSE)
{
tokenPriv.PrivilegeCount = 1;
tokenPriv.Privileges[0].Luid = luidDebug;
tokenPriv.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
if(AdjustTokenPrivileges(hToken, FALSE, &tokenPriv, 0, NULL, NULL) != FALSE)
{
// Always successful, even in the cases which lead to OpenProcess failure
cout << "SUCCESSFULLY CHANGED TOKEN PRIVILEGES" << endl;
}
else
{
cout << "FAILED TO CHANGE TOKEN PRIVILEGES, CODE: " << GetLastError() << endl;
}
}
}
CloseHandle(hToken);
// Enable SeDebugPrivilege
/////////////////////////////////////////////////////////
vector<DWORD> pidList = getPIDs(); // Method that simply enumerates all current process IDs
/////////////////////////////////////////////////////////
// Attempt to open processes
for(int i = 0; i < pidList.size(); ++i)
{
HANDLE hProcess = NULL;
hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, pidList[i]);
if(hProcess == NULL)
{
// Error is occurring here under the given conditions
cout << "Error opening process PID(" << pidList[i] << "): " << GetLastError() << endl;
}
CloseHandle(hProcess);
}
// Attempt to open processes
/////////////////////////////////////////////////////////
}
最佳答案
所以经过大量的调试和困扰很多人的信息之后,我终于找到了写RunWithDebugEnabled
的人。应用程序并了解其运行方式。
在这种情况下,问题在于 Debug programs
域管理员的本地策略中的特权已被删除,因此 SeDebugPrivilege
进程的访问 token 中不存在 token 。如果它根本不存在,则无法启用它,我仍然知道无法将特权添加到现有访问 token 。
当前魔法的工作原理:
所以RunWithDebugEnabled
魔术应用程序将使用其管理员权限将自身安装为服务并启动自身,从而在 SYSTEM
下运行。用户帐户而不是域管理员。与 SYSTEM
权限,应用程序然后创建一个与管理员 token 相同的新访问 token ,只有 SeDebugPrivilege
token 存在。这个新 token 用于CreateProcessAsUser()
并使用新启用的 SeDebugPrivilege
运行程序以前缺少的。
我实际上不喜欢这里的这种“解决方案”,并且一直在继续寻找一种“更清洁”的方式来获得这种特权。我将在 SO 上将此作为另一个问题发布在此处,我会尽量记住将其链接到此处,以帮助其他人跟进并供将来引用。
编辑: Impersonate SYSTEM (or equivalent) from Administrator Account
感谢大家抽出时间和精力帮助调试和解决这个问题。真的很感激!
关于c++ - Windows Vista/Windows 7 权限 : SeDebugPrivilege & OpenProcess,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2932461/
是否有 OpenProcess 函数的内核模式版本? 基本上我想从进程 ID 获取进程句柄。具体来说,我想获取系统进程ID的句柄。 谢谢! 最佳答案 如果您位于任意系统线程中,则可以使用 ZwCurr
我正在开发一个应用程序,它可以创建多个桌面并让用户能够在他当前使用的桌面下启动他想要的任何应用程序。 当该桌面关闭时(使用组合键)我想关闭在该桌面下打开的所有应用程序。为此,我使用 EnumProce
我对 win32 api 的 OpenProcess 函数有这个问题。程序旨在通过用户输入从给定程序 PID 和整数地址的程序中读取整数。 int main() { DWORD pidz; int
为了保护我的程序,我想进行检查以检测任何使用我的 PID 执行 OpenProcess 的程序?我想防止其他程序可以轻松获取我的程序的句柄。 我有哪些选择? (WinAPI 等)一旦另一个程序使用 O
在我的 manager.exe 中,我试图更改由我的 service.exe 启动的 worker.exe 的 CPU 使用率。 Service.exe 在系统帐户下运行,而 manager.exe
我有一个应用程序打开另一个非系统 32 位进程,并尝试使用 EnumProcessModulesEx 获取其加载模块的列表,并使用 GetModuleFileNameEx 获取每个模块的路径.它在我的
我正在尝试编写一个程序,该程序从当前目录中的 MinGW 发行版执行 make.exe,并使用其 STDOUT 数据和退出代码。我有一个处理 STDOUT 的句柄,我从中获取数据,使用 CreateP
当我运行我的程序时发生了一些奇怪的事情。当我在 VS 2010 中使用“不调试启动”选项运行它时,OpenProcess 照常返回进程句柄,但是当我在 Windows 资源管理器中运行我的程序时,Op
我正在尝试使用 Visual Studio 2012、c++ 控制台应用程序打开进程并收到 87 错误: #include #include #include #define EXTERN_DL
我制作了这个简单的类来打开一个进程并从中读取内存:问题是当我使用任何内存地址 ReadProcessMemory 调用 ReadDWORD 时失败,错误代码为 6:ERROR_INVALID_HAND
此程序枚举所有句柄并获取它们的名称。 对于 pID 4,OpenProcess 使用 SeDebugPrivilege 获得错误 5。 UAC 关闭。从管理员运行。 启用 SeDebugPrivile
在 Windows 中,我可以通过 CreateProcess() 获取 PROCESS_INFORMATION。但是,是否可以通过 OpenProcess() 获取 PROCESS_INFORMAT
我使用 Windows Hook 向我的应用程序发送消息,系统上的每个应用程序都会通知该应用程序有关 Windows 事件。 为了执行消息参数的编码,我使用了共享内存。外部进程调用 Duplicate
我在实现读取外部进程内存的算法时遇到了一些问题。这是主要代码: System.Diagnostics.Process.EnterDebugMode();
我一直在阅读 Hoglund 的一些书,我想我会在他的“简单调试器”上“开始”... 反正我一直在尝试用线 hProcess = OpenProcess(PROCESS_ALL_ACCESS | PR
根据微软文档,dwDesiredAccess 参数可以是一个或多个进程访问权限。 我想在调用 openProcess 函数时传递两个不同的 dwDesiredAccess(PROCESS_QUERY_
我在 Windows 平台上运行以下代码。目的是了解特定进程 ID 是否引用现有进程。 BOOL bProcessExists = FALSE; HANDLE hProcHandle = ::Open
我正在尝试从 Kernel32.dll Hook OpenProcess 以防止所谓的“injector”程序注入(inject)其他 dll进入我的过程: // ------------------
我正在努力枚举所有用户的 iexplore.exe 实例。我能够获得机器上匹配进程的列表,但要识别用户,我需要使用 OpenProcess。这适用于我自己的实例,但即使以管理员身份运行和 Enable
这些 Windows 函数的等效 API 是什么?如果您不熟悉 Windows 函数,它们所做的只是打开一个进程,访问(读取和写入)它的内存并关闭它的句柄。 这也可以只用系统调用来完成吗? 最佳答案
我是一名优秀的程序员,十分优秀!