進程以管理員權限和非管理員權限運行有很大的特權差別,具體怎麼檢查當前進程是否以管理員權限運行,代碼如下:
#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特權,這些函數調用寫的再正確,權限不允許,白廢功夫。