在Windows安全性越来越强的情况下,不常于XP时代,几乎毫无安全可言,各种对内核文件操控的rin3API不需要权限就可以运行和随意修改,如常见的注册表需改!
但是Win8以后安全性得到了强力的提升,想要写这样的程序几乎需要内核驱动编程才能实现。
但是如果用户人为的使用管理员权限运行获取计算机最高权限,我们一样可以使用rin3达到rin0的作用。
但是前提是需要人为的打开..所以木马基本上这样的方式是不可能的了,只有在编写一些常用软件,需要一些权限时建议这样做,如软件补丁。
实现API:
GetTokenInformation
此函数可以获取一个进程的特权,当进程被加载到内存后,会被分配一个结构体,里面包含进程的一些特权,我们可以通过这个函数获取到这个结构体,并得到我们想要的信息
函数原型:
BOOL
WINAPI
GetTokenInformation(
_In_ HANDLE TokenHandle,
_In_ TOKEN_INFORMATION_CLASS TokenInformationClass,
_Out_writes_bytes_to_opt_(TokenInformationLength, *ReturnLength) LPVOID TokenInformation,
_In_ DWORD TokenInformationLength,
_Out_ PDWORD ReturnLength
);
参数一:令牌指针可以使用OpenProcessToken函数获取
参数二:要获取的信息类型
参数三:返回的信息存放内存
参数四:存放的内存大小
参数五:返回到的内存实际大小
用法:
BOOL bElevated = FALSE; //是否管理员
//1.得到自身进程的权限访问令牌
HANDLE hToken = NULL;
if (!OpenProcessToken(GetCurrentProcess(), TOKEN_QUERY, &hToken))
return FALSE;
//2.获取进程相关运行权限
TOKEN_ELEVATION tokenEle;
DWORD dwRetLen = 0;
if (GetTokenInformation(hToken, TokenElevation, &tokenEle, sizeof(tokenEle), &dwRetLen))
{
//如果接受到的内存大小和结构体成正比例,代表接受完整的进程权限数据
if (dwRetLen == sizeof(tokenEle))
{
//取是否管理员布尔值
bElevated = tokenEle.TokenIsElevated;
}
}
//关闭进程令牌
CloseHandle(hToken);
//返回是否OK
return bElevated;