首先,很抱歉,这是一个noobie问题,我只是这种事情的发起者。
我正在尝试从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;
}

我不知道为什么会失败。我也尝试过Microsoft示例,但存在相同的问题。
有人知道为什么失败吗?

最佳答案

如果您使用模拟API,则线程仅具有自己的 token ,否则,只有进程 token 。如果OpenProcessToken失败并返回OpenThreadToken,只需回落到ERROR_NO_TOKEN即可。

10-07 19:41
查看更多