admin管理员组文章数量:1655506
进程以管理员权限和非管理员权限运行有很大的特权差别,具体怎么检查当前进程是否以管理员权限运行,代码如下:
#include <stdio.h>
#include <Windows.h>
#include <Sddl.h>
int main()
{
BOOL IsMember;
PSID l_pSid=NULL;
SID_IDENTIFIER_AUTHORITY IdentifierAuthority=SECURITY_NT_AUTHORITY; //#define SECURITY_NT_AUTHORITY {0,0,0,0,0,5}
// 生成一个当前进程的PSID
AllocateAndInitializeSid(&IdentifierAuthority,2,SECURITY_BUILTIN_DOMAIN_RID,DOMAIN_ALIAS_RID_ADMINS,0,0,0,0,0,0,&l_pSid);
// 检查当前进程的PSID是否是管理员权限
CheckTokenMembership(NULL,l_pSid,&IsMember);
FreeSid(l_pSid);
if(IsMember==TRUE)
{
printf("当前用户是以管理员权限运行\n");
}
else
printf("当前用户不是以管理员权限运行\n");
system("pause");
return 0;
}
Windows10下使用不同方式运行,结果如下图:
恶意代码往往也喜欢知道自身进程的运行权限,汇编代码如下:
续一(通过系统漏洞升级为管理员权限):
管理员权限和非管理员权限到底有哪些区别,可以通过使用不同身份的cmd窗口输入whoami/ALL查看,Windows10中测试如下图:
非管理员权限只有5个特权,其中包括更改时区、关机;管理员权限有n个特权,包括更改时间、远程强制关机、调试程序。
如果一个恶意进程想要从非管理员升级到管理员,在操作系统看来是不合法的,这样的恶意进程会绞尽脑汁利用操作系统的漏洞来获得管理员权限(XP系统没有区分这2个概念,都是管理员权限;WIndows7区分的有点模糊,也可能我用的是盗版系统),至于获得管理员权限后,恶意进程如何利用管理员那些特权、做了哪些坏事,见续二。
续二(启用管理员权限的SeDebugPrivilege特权):
恶意进程从非管理员权限到获取管理员权限,也就有了n个特权,其中SeDebugPrivilege特权特别重要,看MSDN中如何描述:If the caller has enabled the SeDebugPrivilege privilege, the requested access is granted regardless of the contents of the security descriptor。
SeDebugPrivilege特权在续一的图片有看到,但是状态时禁用的,就需要激活或者说时启用(很多地方都说是提权,很不恰当,而且容易和上面的提权概念搞混),启用代码如下:
#include <stdio.h>
#include <Windows.h>
BOOL SetPrivilege(HANDLE hToken,LPCTSTR lpszPrivilege,BOOL bEnablePrivilege)
{
TOKEN_PRIVILEGES tp;
LUID luid;
if( !LookupPrivilegeValue(NULL,lpszPrivilege,&luid) )
{
printf("LookupPrivilegeValue error: %u\n", GetLastError() );
return FALSE;
}
tp.PrivilegeCount = 1;
tp.Privileges[0].Luid = luid;
if( bEnablePrivilege )
tp.Privileges[0].Attributes=SE_PRIVILEGE_ENABLED;
else
tp.Privileges[0].Attributes=0;
if( !AdjustTokenPrivileges(hToken,FALSE,&tp,sizeof(TOKEN_PRIVILEGES),NULL,NULL) )
{
printf("AdjustTokenPrivileges error: %u\n", GetLastError() );
return FALSE;
}
if( GetLastError()==ERROR_NOT_ALL_ASSIGNED )
{
printf("The token does not have the specified privilege. \n");
return FALSE;
}
return TRUE;
}
int main( )
{
HANDLE hToken;
BOOL bRet=OpenProcessToken(GetCurrentProcess(),TOKEN_ALL_ACCESS,&hToken);
SetPrivilege(hToken,SE_DEBUG_NAME,TRUE);
return 1;
}
续三(启用SeDebugPrivilege特权的管理员权限进程):
现在好了,管理员权限有了,SeDebugPrivilege特权也启用了,可以做那些事呢?
恶意进程常用的就是控制其他进程,比如ReadProcessMemory( )、WriteProcessMemory()、CreateRemoteThread( )、ExitProcess( )
如果进程不是管理员权限或者没有启用SeDebugPrivilege特权,这些函数调用写的再正确,权限不允许,白废功夫。
版权声明:本文标题:Windows管理员权限思考 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dongtai/1726948806a1091392.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论