进程权限的发展
在DOS时代, 所有程序都能直接操作我们的物理内存操作系统和我们的应用软件都是同一等级的程序,它是不安全的.会造成系统不稳定,毫无保密性
从Win95/98到XP后, 新增了虚拟内存,它杜绝了修改操作系统代码的可能(直接修改物理内存)出现了进程, 它是"完全封闭"(开放了一些接口)的
它会使我们的进程没有保密性,我们使用CreateProcess创建一个子进程父进程拥有子进程的"访问权限"
所以出现了进程权限,父进程必须拥有一定的权限(用户赋予的权限),高危操作会告诉用户, 用户选择是否赋予,以管理员权限打开的进程, 子进程会拥有(继承)管理员权限
UAC出现,它是一个带过滤表的权限,它不拥有全部的"管理员权限"使得任何一个程序都不能完全拥有管理员权限,UAC是为了防止程序拥有了管理员权限是静默的做很多事情,它会在有风险的操作时进行提示
进程提权
BOOL ShellExecuteEx(
_Inout_ SHELLEXECUTEINFO *pExecInfo
);
typedef struct _SHELLEXECUTEINFO {
DWORD cbSize;
ULONG fMask;
HWND hwnd;
LPCTSTR lpVerb;
LPCTSTR lpFile;
LPCTSTR lpParameters;
LPCTSTR lpDirectory;
int nShow;
HINSTANCE hInstApp;
LPVOID lpIDList;
LPCTSTR lpClass;
HKEY hkeyClass;
DWORD dwHotKey;
union {
HANDLE hIcon;
HANDLE hMonitor;
} DUMMYUNIONNAME;
HANDLE hProcess;
} SHELLEXECUTEINFO, *LPSHELLEXECUTEINFO;
#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
}