【问题标题】:OpenProcessBlocked even i use SetPrivilege(hToken, SE_DEBUG_NAME, true);OpenProcessBlocked 即使我使用 SetPrivilege(hToken, SE_DEBUG_NAME, true);
【发布时间】: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++


【解决方案1】:

this process blocks OpenProcess

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-07-26
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 2011-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-12
    相关资源
    最近更新 更多