现在的位置: 首页 > 综合 > 正文

一句代码提升进程权限

2017年09月27日 ⁄ 综合 ⁄ 共 3069字 ⁄ 字号 评论关闭

博客分类: 

  • 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. }  

     

    抱歉!评论已关闭.