看一下AdjustTokenPrivileges的Last Error,或许有线索

解决方案 »

  1.   

    AdjustTokenPrivileges的Getlasterror返回值是1300。
    我查了下资料,如果说是用户账号等问题,可为啥2005版的程序又可以通过呢?
    最不理解的就是这一点……
      

  2.   

    AdjustTokenPrivileges的Getlasterror返回值是1300。
    我查了下资料,如果说是用户账号等问题,可为啥2005版的程序又可以通过呢?
    最不理解的就是这一点……
    http://blog.csdn.net/wei_yongtao/article/details/6400013,这里介绍了。
    至于为什么05的程序可以通过,我觉得可能是05编译的代码存在安全性问题,应该是个漏洞。可以好好挖一下~
      

  3.   

    经过两天的调试发现问题非常之坑……
    首先,很多帖子指出的调整系统内存锁定页之类的操作没有效果——至少在我们所发现的出现该问题的电脑上完全无效。
    其次简单来说,同样的代码,VS2005下编译的程序虽然AdjustTokenPrivileges的调用也是返回失败1300,但实质上却成功了,至少一些常规的调试函数可以用了(比如非常常用的OpenProcess函数的PROCESS_ALL_ACCESS权限);而VS2008下编译的程序就完全无法使用,提权的代码还是如一楼所写,测试的代码如下: EnablePrivileges(); HWND hwnd = ::FindWindow(NULL, "无标题 - 记事本");
    if (NULL == hwnd)
    {
    Dsp("没有找到新建记事本窗口,后续检测中止");
    return TRUE;
    } Dsp("发现新建记事本窗口,开始进行权限测试"); DWORD pid = 0;
    ::GetWindowThreadProcessId(hwnd, &pid);
    if (0 == pid)
    {
    sprintf(m_log, "获取记事本窗口PID失败 - %d", GetLastError());
    Dsp(m_log);
    return TRUE;
    } HANDLE hHandle = NULL; Dsp("测试访问权限"); hHandle = ::OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, pid);
    if (NULL == hHandle || INVALID_HANDLE_VALUE == hHandle)
    {
    sprintf(m_log, "访问权限创建失败 - %d", GetLastError());
    Dsp(m_log);
    return TRUE;
    } ::CloseHandle(hHandle); Dsp("访问权限创建成功,测试写入权限"); hHandle = ::OpenProcess(PROCESS_ALL_ACCESS, FALSE, pid);
    if (NULL == hHandle || INVALID_HANDLE_VALUE == hHandle)
    {
    sprintf(m_log, "写入权限创建失败 - %d", GetLastError());
    Dsp(m_log);
    return TRUE;
    } ::CloseHandle(hHandle); Dsp("写入权限创建成功,测试完毕");然后同样的提权代码,同样的测试代码,2005版本和2008版本的程序在问题电脑上的运行结果分别如下:
    2005 提权失败:AdjustTokenPrivileges failed 1-1300
    2005 发现新建记事本窗口,开始进行权限测试
    2005 测试访问权限
    2005 访问权限创建成功,测试写入权限
    2005 写入权限创建成功,测试完毕2008 提权失败:AdjustTokenPrivileges failed 1-1300
    2008 发现新建记事本窗口,开始进行权限测试
    2008 测试访问权限
    2008 访问权限创建成功,测试写入权限
    2008 写入权限创建失败 - 5现在对我来说唯一的解决方法就是将程序代码重写,退回到2005的版本,坑爹啊……