c++ - OpenProcessBlocked 即使我使用 SetPrivilege(hToken, SE_DEBUG_NAME, true);
问题描述
我有一个问题,我想用 ReadProcessMemory 从一个进程中读取一些值,这个进程阻塞了 OpenProcess,现在我听说我只需要对想要使用 SE_DEBUG_NAME 进行 OpenProcess 的文件进行特权。
我用谷歌搜索并找到了这个功能:
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 不起作用。有人可以帮帮我吗?
提前致谢!
解决方案
this process blocks OpenProcess
这意味着游戏的反作弊阻止了通过内核模式反作弊创建进程句柄。
您无法从用户模式绕过它,您还必须制作内核驱动程序并禁用它们的保护。
他们防止句柄创建的最简单方法是使用 ObRegisterCallbacks,因此您需要对他们的实现进行逆向工程。
请记住,这种技术是 5 年前的技术,现在它们的保护要复杂得多。
推荐阅读
- javascript - 无法使用 jQuery 更改 HTML(本地存储)
- java - 用两种可能的实现定义 bean
- c - 使用 char 和 int 时输出错误
- testing - 在进行远程测试(qrcode 等)时有没有办法控制暴露的端口?
- android - 如何在 Android 中添加静态键盘?
- javascript - 对子多个值求和并将结果保存到 Javascript 中的 n-ary 树中的父级
- r - 如何使用 ggplot (R studio) 绘制其中项目由分类列分隔的绘图?
- clojure - 如何为 `'(foo (:x 1 :y 2))` 定义 Clojure 规范
- c++ - 如何正确地将文本格式的 protobuf 消息写入文件
- python - Python - 为什么 `int(x, 2)` 只能用于字符串,而不能用于整数?