一句代码提升进程权限

时间:2022-07-03 15:03:29

博客分类: 

VC

RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,1,0,NULL); 

这个函数封装在NtDll.dll中(在所有DLL加载之前加载),被微软严格保密,就是说你在MSDN上查不到关于他的任何信息。

.常量 SE_BACKUP_PRIVILEGE, "17", 公开
.常量 SE_RESTORE_PRIVILEGE, "18", 公开
.常量 SE_SHUTDOWN_PRIVILEGE, "19", 公开
.常量 SE_DEBUG_PRIVILEGE, "20", 公开


先来看看这个函数的定义(Winehq给出):

C代码   一句代码提升进程权限
  1. NTSTATUS RtlAdjustPrivilege  
  2. (  
  3. ULONG    Privilege,  
  4. BOOLEAN Enable,  
  5. BOOLEAN CurrentThread,  
  6. PBOOLEAN Enabled  
  7. )  

 参数的含义:
Privilege [In] Privilege index to change.                         
// 所需要的权限名称,可以到MSDN查找关于Process Token & Privilege内容可以查到

Enable [In] If TRUE, then enable the privilege otherwise disable. 
// 如果为True 就是打开相应权限,如果为False 则是关闭相应权限

CurrentThread [In] If TRUE, then enable in calling thread, otherwise process. 
// 如果为True 则仅提升当前线程权限,否则提升整个进程的权限

Enabled [Out] Whether privilege was previously enabled or disabled.
// 输出原来相应权限的状态(打开 | 关闭)

 

 

很多人大概没有听说过他的大名,但是相信有很多人见过进程提权的过程
拷一段我写的提权上来吧

C代码   一句代码提升进程权限
  1. BOOL ImproveProcPriv()  
  2. {  
  3.     HANDLE token;  
  4.     //提升权限  
  5.     if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&token))  
  6.     {  
  7.         MessageBox(NULL,"打开进程令牌失败...","错误",MB_ICONSTOP);  
  8.         return FALSE;  
  9.     }  
  10.     TOKEN_PRIVILEGES tkp;  
  11.     tkp.PrivilegeCount = 1;  
  12.     ::LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid);  
  13.     tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;  
  14.     if(!AdjustTokenPrivileges(token,FALSE,&tkp,sizeof(tkp),NULL,NULL))  
  15.     {  
  16.         MessageBox(NULL,"调整令牌权限失败...","错误",MB_ICONSTOP);  
  17.         return FALSE;  
  18.     }  
  19.     CloseHandle(token);  
  20.     return TRUE;  
  21. }  

 


看看吧,这个提权快要累死了...

但是 如果有这个函数就不一样了,你可以只用一个函数就实现这个功能,甚至功能远多于上面的代码...

通过恰当的IDE设置和必要的Defination,上面这个函数的功能你完全可以通过一行代码来实现。

RtlAdjustPrivilege(SE_DEBUG_NAME,1,0,NULL);

 

原文地址:http://bbs.pediy.com/showthread.php?t=104323

 

 

例子:强制关机

 

Cpp代码   一句代码提升进程权限
  1. // ExitWindow.cpp : Defines the entry point for the console application.  
  2. //  
  3.   
  4. #include "stdafx.h"  
  5. #include <Windows.h>  
  6. #include <stdio.h>  
  7.   
  8. //定义函数原型  
  9. typedef int (__stdcall *Func_RtlAdjustPrivilege)(ULONGBOOLEANBOOLEANPBOOLEAN);  
  10.   
  11. int main(int argc, char* argv[])  
  12. {  
  13.     //装载DLL  
  14.     HMODULE hModule = ::LoadLibrary("NTDLL.DLL");  
  15.     if(hModule == NULL) {  
  16.         printf("LoadLibrary error\n");  
  17.         return 0;  
  18.     }  
  19.   
  20.     //得到导出函数的地址  
  21.     Func_RtlAdjustPrivilege RtlAdjustPrivilege = (Func_RtlAdjustPrivilege)GetProcAddress(hModule, "Func_RtlAdjustPrivilege");  
  22.     if(RtlAdjustPrivilege == NULL) {  
  23.         printf("GetProcAddress error \n");  
  24.         return 0;  
  25.     }  
  26.       
  27.   
  28.     //HANDLE hToken;  
  29.     //TOKEN_PRIVILEGES tkp;  
  30.       
  31.     //取得系统版本  
  32.     OSVERSIONINFO osvi;  
  33.     osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);  
  34.     if(GetVersionEx(&osvi) == 0) {  
  35.         return false;  
  36.     }  
  37.   
  38.     if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {  
  39.         /* 
  40.         .常量 SE_BACKUP_PRIVILEGE, "17", 公开 
  41.         .常量 SE_RESTORE_PRIVILEGE, "18", 公开 
  42.         .常量 SE_SHUTDOWN_PRIVILEGE, "19", 公开 
  43.         .常量 SE_DEBUG_PRIVILEGE, "20", 公开 
  44.         */  
  45.         RtlAdjustPrivilege(19, 1, 0, NULL);  
  46.     }  
  47.   
  48.     //强制关机, 不向进程发送WM_QUERYENDSESSION消息  
  49.     ExitWindowsEx(EWX_FORCE, 0);  
  50.   
  51.     return 0;  
  52. }