【问题标题】:OpenThreadToken() error 1008, ERROR_NO_TOKENOpenThreadToken() 错误 1008,ERROR_NO_TOKEN
【发布时间】:2014-11-24 07:01:45
【问题描述】:

首先,如果这是一个新手问题,我很抱歉,我只是这类事情的初学者。
我正在尝试从 MineSweeper 的内存中读取这些内容,但我遇到了一个小问题。
当我尝试打印模块时,它告诉我我无权这样做。我知道这是因为该进程的内存受到了读写保护,并且要从中读取,我需要具有调试权限。
就在那里,我的问题是当我调用 OpenThreadToken(..) 时,它失败并显示代码 1008,即 ERROR_NO_TOKEN。

这是代码,对于冗长的介绍感到抱歉:

int privileges(){
HANDLE token;
TOKEN_PRIVILEGES tp;
DWORD siz = sizeof(TOKEN_PRIVILEGES);

if (OpenThreadToken(GetCurrentThread(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY,
FALSE, &token) != 0){ //HERE IT FAILS
    LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
    tp.PrivilegeCount = 1;
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    if (AdjustTokenPrivileges(token, 0, &tp, siz, NULL ,NULL) != 0){
        cout << "--Conseguido acceso debug.\n";
        return TRUE;
    }
    else {
        cout << "fail adjust\n";
        return FALSE;
    }
}
else {
    cout << "fail if: " << GetLastError() << endl;
    cin.get();
    return FALSE;
}

我不知道它为什么会失败。我也试过微软的例子,但同样的问题。
有人知道为什么会失败吗?

【问题讨论】:

  • 顺便说一句,您通常不需要 SE_DEBUG_NAME 来调试在同一用户帐户下运行的程序。
  • 那为什么我不能从 MineSweeper 进程内存中读取呢?还有其他方法可以访问它吗? (我会发布另一个问题,但限制是每 90 分钟一个问题)
  • 不知道。我们需要看代码。
  • 我将发布一个包含完整代码和更好解释的新问题。谢谢你的帮助,伙计!我会把链接放在这里^^

标签: c++ winapi thread-safety token


【解决方案1】:

如果您使用模拟 API,线程只有自己的令牌,否则只有一个进程令牌。如果OpenThreadToken 失败并返回ERROR_NO_TOKEN,只需退回到OpenProcessToken

【讨论】:

  • 我试过了,它有效,但不如预期。当我尝试打开 HMODULES 时出现问题,这是我的目标,就像我没有激活 SE_DEBUG_NAME,它一直说这是读写保护的。
  • @Norwelian:这是一个不同的问题。请发布一个新问题并包含失败的代码。
  • 好的,我将创建一个包含更多信息的新问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多