Windows提权方法

Windows下应用程序如果需要做一些系统管理或进程管理之类的工作,经常需要将本进程提权(获取权限令牌);

而通常windows下提权方法有两种,主要的方法是:

1)win32API——AdjustTokenPrivileges;

2)ntdll.dll——RtlAdjustPrivilege;

前者是已公开的win32系统API,后者是非公开的导出函数(藏在ntdll.dll里);

两者的用法也有些差别;

先看第一种方式:

1)win32API——AdjustTokenPrivileges

[cpp]  view plain  copy
  1. //Win32Api:  
  2.     void AdjustPrivilege()  
  3.     {  
  4.         HANDLE hToken;  
  5.         if (OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken))  
  6.         {  
  7.             TOKEN_PRIVILEGES tp;  
  8.             tp.PrivilegeCount = 1;  
  9.             tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
  10.             if (LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid))  
  11.             {  
  12.                 AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);  
  13.             }  
  14.             CloseHandle(hToken);  
  15.         }  
  16.     }  

可以看出AdjustTokenPrivileges提权是针对当前进程的句柄与对应系统权限令牌的特权值的结构体LUID(也就是LARGE_INTEGER)的;

也就是说这种方式需要先使用LookupPrivilegeValue方法查询令牌(比如SE_DEBUG_NAME)对应的特权值;

2)ntdll.dll——RtlAdjustPrivilege

[cpp]  view plain  copy
  1. //ntdll.dll  
  2. const unsigned long SE_DEBUG_PRIVILEGE = 0x14;  
  3. typedef int (__stdcall *fRtlAdjustPrivilege)(ULONGBOOLEANBOOLEANPBOOLEAN);  
  4.   
  5. void NtAdjustPrivilege()  
  6. {  
  7.     HMODULE hNtDll = LoadLibrary(_T("ntdll.dll"));  
  8.     if (!hNtDll)  
  9.         return;  
  10.     fRtlAdjustPrivilege funcAdjustPrivilege =  
  11.         (fRtlAdjustPrivilege)GetProcAddress(hNtDll, "RtlAdjustPrivilege");  
  12.     if (funcAdjustPrivilege)  
  13.     {  
  14.         BOOLEAN oldStatus;  
  15.         funcAdjustPrivilege(SE_DEBUG_PRIVILEGE, truefalse, &oldStatus);  
  16.     }  
  17.     FreeLibrary(hNtDll);  
  18. }  
这种导出RtlAdjustPrivilege的方式没有依赖其它方法,但是需要自己定义权限值SE_DEBUG_PRIVILEGE为0x14,显然这样写死的方式总是一种不太好的方式;

我们应该让windows自己定义这些值,我们通过变量名使用这些值,这样的设计更好;

当然,在特定的windows平台下,只要windows对ntdll.dll导出的函数改动不大,这样使用也可以。

总结一下,第一种方式使用的公开API,有官方文档,名正言顺,不用担心API的改动问题,但是需要用到不止一个方法(LookupPrivilegeValue与AdjustTokenPrivileges)组合使用,才能达到效果,稍显繁琐;第二种方式虽然不依赖其它方法就能达到效果,简洁强大,但是使用的非公开的导出方法RtlAdjustPrivilege名不正言不顺,说不定以后windows在以后的版本中对ntdll.dll的修改可能会引起API不兼容的问题;所以如果第一种方式能满足需求,尽量避免使用第二种方式,毕竟也多不了几行代码;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值