首页 > 解决方案 > 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 不起作用。有人可以帮帮我吗?

提前致谢!

标签: c++

解决方案


this process blocks OpenProcess

这意味着游戏的反作弊阻止了通过内核模式反作弊创建进程句柄。

您无法从用户模式绕过它,您还必须制作内核驱动程序并禁用它们的保护。

他们防止句柄创建的最简单方法是使用 ObRegisterCallbacks,因此您需要对他们的实现进行逆向工程。

请记住,这种技术是 5 年前的技术,现在它们的保护要复杂得多。


推荐阅读