【发布时间】:2018-08-10 08:20:21
【问题描述】:
我有一个问题,我想用ReadProcessMemory从一个进程中读取一些值,这个进程阻塞了OpenProcess,现在我听说我只需要用SE_DEBUG_NAME对想要做OpenProcess的文件进行特权。
我google了一下,找到了这个功能:
BOOL SetPrivilege(
HANDLE hToken, // access token handle
LPCTSTR lpszPrivilege, // name of privilege to enable/disable
BOOL bEnablePrivilege){
TOKEN_PRIVILEGES tp;
LUID luid;
if (!LookupPrivilegeValue(
NULL, // lookup privilege on local system
lpszPrivilege, // privilege to lookup
&luid)) // receives LUID of privilege
{
printf("LookupPrivilegeValue error: %u\n", GetLastError());
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if (bEnablePrivilege)
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes = 0;
// Enable the privilege or disable all privileges.
if (!AdjustTokenPrivileges(
hToken,
FALSE,
&tp,
sizeof(TOKEN_PRIVILEGES),
(PTOKEN_PRIVILEGES)NULL,
(PDWORD)NULL))
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError());
return FALSE;
}
if (GetLastError() == ERROR_NOT_ALL_ASSIGNED)
{
printf("The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;}
现在我尝试了以下方法:
bool bStart(std::string szProcessName) {
if (szProcessName.empty())
return false;
HANDLE hToken;
OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken);
SetPrivilege(hToken, SE_DEBUG_NAME, true);
if (!OpenProcessToken(GetCurrentProcess(),
TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
return FALSE;
if (!SetPrivilege(hToken, SE_DEBUG_NAME, TRUE))
{
std::cout << "SetPrivilege";
// close token handle
CloseHandle(hToken);
// indicate failure
return false;
}
std::cout << "hi";
HANDLE hSnapshot = (CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0));
if (hSnapshot == INVALID_HANDLE_VALUE)
return false;
bool bFoundProcess = false;
PROCESSENTRY32 PE32 = { sizeof(PROCESSENTRY32) };
if (Process32First(hSnapshot, &PE32))
{
do
{
if (!szProcessName.compare(PE32.szExeFile))
{
m_dwProcessId = (XOR(PE32.th32ProcessID));
bFoundProcess = true;
break;
}
} while (Process32Next(hSnapshot, &PE32));
}
CloseHandle(m_hProcess);
if (!bFoundProcess)
return false;
m_hProcess = (XOR(OpenProcess(PROCESS_ALL_ACCESS, FALSE, m_dwProcessId)));
if (m_hProcess == INVALID_HANDLE_VALUE)
return false;
返回真; }
我没有收到任何错误或任何东西,但出于任何原因,OpenProcess 不起作用。有人可以帮我吗?
提前致谢!
【问题讨论】:
-
什么是
XOR?。从OpenProcess查看错误结果,你得到了什么结果? -
对于 OpenProcess() 死锁,我想不出什么好的理由。例外一,禁用已安装的反恶意软件产品,然后重试。
-
@MikeVine XOR 正在加密字符串,当我将这种方式用于不阻止 OpenProcess() 的程序时,它工作正常!该程序只是阻止 OpenProcess()。是不是代码有问题?
-
XOR 正在加密字符串 没有意义 - 请为 XOR 添加宏/函数定义。尤其是你在
(XOR(PE32.th32ProcessID))和(XOR(OpenProcess(中使用它,这根本没有任何意义。 -
另外你调用 openprocesstoken/setprivilege 两次并且第一次不检查 reutrn 值。为什么?
标签: c++