PoEdu培训 Windows班 第十七课 Windows进程及线程(四)
文章类别: 培训笔记 0 评论

PoEdu培训 Windows班 第十七课 Windows进程及线程(四)

文章类别: 培训笔记 0 评论

Windows 进程及线程(四)

进程权限

进程权限的发展

在DOS时代, 所有程序都能直接操作我们的物理内存

进程权限概论

在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;
}

权限的继承

未完待续...

如有错误,请提出指正!谢谢.

回复