请教在少数电脑中提升程序权限失败的问题 看一下AdjustTokenPrivileges的Last Error,或许有线索 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 AdjustTokenPrivileges的Getlasterror返回值是1300。我查了下资料,如果说是用户账号等问题,可为啥2005版的程序又可以通过呢?最不理解的就是这一点…… AdjustTokenPrivileges的Getlasterror返回值是1300。我查了下资料,如果说是用户账号等问题,可为啥2005版的程序又可以通过呢?最不理解的就是这一点……http://blog.csdn.net/wei_yongtao/article/details/6400013,这里介绍了。至于为什么05的程序可以通过,我觉得可能是05编译的代码存在安全性问题,应该是个漏洞。可以好好挖一下~ 经过两天的调试发现问题非常之坑……首先,很多帖子指出的调整系统内存锁定页之类的操作没有效果——至少在我们所发现的出现该问题的电脑上完全无效。其次简单来说,同样的代码,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-13002005 发现新建记事本窗口,开始进行权限测试2005 测试访问权限2005 访问权限创建成功,测试写入权限2005 写入权限创建成功,测试完毕2008 提权失败:AdjustTokenPrivileges failed 1-13002008 发现新建记事本窗口,开始进行权限测试2008 测试访问权限2008 访问权限创建成功,测试写入权限2008 写入权限创建失败 - 5现在对我来说唯一的解决方法就是将程序代码重写,退回到2005的版本,坑爹啊…… 16位图的显示问题 VC服务端/客户端程序问题? 浮点数如何处理 关于命令更新与OnCreate() 怎样读取并口数据位的值? 实时采集数据写文件,文件碎片问题。 CListCtrl的列表的问题 对话框的一个问题 新建的对话框在别的窗体中如何调用? 急:求助:如何在多文档程序中加载自己的菜单 [求助]vc2008下的CMScomm类的使用问题 CEDIT 标准控件, 输入“\” 显示成乱码
我查了下资料,如果说是用户账号等问题,可为啥2005版的程序又可以通过呢?
最不理解的就是这一点……
我查了下资料,如果说是用户账号等问题,可为啥2005版的程序又可以通过呢?
最不理解的就是这一点……
http://blog.csdn.net/wei_yongtao/article/details/6400013,这里介绍了。
至于为什么05的程序可以通过,我觉得可能是05编译的代码存在安全性问题,应该是个漏洞。可以好好挖一下~
首先,很多帖子指出的调整系统内存锁定页之类的操作没有效果——至少在我们所发现的出现该问题的电脑上完全无效。
其次简单来说,同样的代码,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的版本,坑爹啊……