Windows 进程及线程(四)
进程权限
进程权限的发展
在DOS时代, 所有程序都能直接操作我们的物理内存
- 操作系统和我们的应用软件都是同一等级的程序
它是不安全的
- 会造成系统不稳定
- 毫无保密性
从Win95/98到XP后, 新增了虚拟内存
- 它杜绝了修改操作系统代码的可能(直接修改物理内存)
- 出现了
进程, 它是"完全封闭"(开放了一些接口)的 它会使我们的进程没有保密性
- 我们使用CreateProcess创建一个子进程
- 父进程拥有子进程的"访问权限"
所以出现了进程权限
- 父进程必须拥有一定的权限(用户赋予的权限)
- 高危操作会告诉用户, 另用户选择是否赋予
- 比如XP下, 分为管理员权限和用户权限
- 以管理员权限打开的进程, 子进程会拥有(继承)管理员权限
UAC出现
- 它是一个带过滤表的权限
- 它不拥有全部的"管理员权限"
进程权限概论
在XP时代, 系统中只存在一个操作系统权限
在Vista后, 增加了筛选的权限令牌(UAC)
如果要求进程提升权限, 那么必须在进程边界上进行提升
进程边界指的是在进程启动时, 进行提升权限
对进程进行提权操作都是单次的
进程权限的提升
以管理员权限运行
右键可执行程序-->
选择"以管理员身份运行"
就可以让可执行程序以管理员权限运行
通过RT_MANIFEST提升权限
| 值 | 效果 |
|---|---|
| asInvoker | 应用程序将使用与启动它的进程相同的权限运行. <br/>可通过选择"以管理员身份运行"将应用程序提升为更高权限 |
| highestAvailable | 应用程序将使用可能的最高权限级别运行. <br/>如果启动该应用程序的用户为管理员组的一个成员, 则此选项与 requireAdministrator 相同. <br/>如果可用的最高权限级别高于打开进程的级别, 则系统将提示提供凭据 |
| requireAdministrator | 应用程序将使用管理员权限运行. 启动该应用程序的用户必须是管理员组的一个成员. <br/>如果打开进程未使用管理权限运行, 则系统将提示提供凭据 |
手动提升权限
BOOL ShellExecuteEx(
_Inout_ SHELLEXECUTEINFO *pExecInfo
);
typedef struct _SHELLEXECUTEINFO {
DWORD cbSize; // 长度 sizeof(SHELLEXECUTEINFO)
ULONG fMask; // 标准
HWND hwnd; // 窗口句柄
LPCTSTR lpVerb; // 执行的操作
LPCTSTR lpFile; // 执行的文件路径
LPCTSTR lpParameters; // 参数
LPCTSTR lpDirectory; // 目录
int nShow; // 显示方式
HINSTANCE hInstApp; // 返回的HINSTANCE
LPVOID lpIDList; // 特殊标识符
LPCTSTR lpClass; // 指明GUID或类名
HKEY hkeyClass; // 获得已经在系统注册的文件类型
DWORD dwHotKey; // 热键
union {
HANDLE hIcon; // 图标
HANDLE hMonitor; // 显示器的HANDLE
} DUMMYUNIONNAME;
HANDLE hProcess; // 新启动程序的句柄
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;一个小示例来进行提权(Vista系统以上)
#include <Windows.h>
#include tchar.h>
int main()
{
SHELLEXECUTEINFO sei = {0};
sei.cbSize = sizeof(SHELLEXECUTEINFO);
sei.lpVerb = TEXT("runas");
sei.lpFile = TEXT("CMD");
sei.nShow = SW_SHOW;
if (!ShellExecuteEx(&sei))
{
DWORD dwError = GetLastError();
if (ERROR_CANCELLED == dwError)
{
_tprintf(TEXT("用户取消提权!\n"));
}
else if (ERROR_FILE_NOT_FOUND == dwError)
{
_tprintf(TEXT("要提权的文件未找到!\n"));
}
}
else
{
_tprintf(TEXT("已经提权运行!\n"));
}
system("pause");
return 0;
}权限的继承
如果父进程是管理员权限
- 它调用CreateProcess启动的子进程会继承管理员权限
如果父进程是UAC权限的程序
- 它调用CreateProcess启动的子进程如果是
需要进行提权的, 则会失败 - GetLastError会是
ERROR_ELEVATION_REQUIRED
- 它调用CreateProcess启动的子进程如果是
未完待续...
如有错误,请提出指正!谢谢.
本文由 花心胡萝卜 创作,采用 知识共享署名4.0 国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: 2017-06-07 at 06:18 am