对当前进程进行提升权限

来源:互联网 发布:阿里云备案拍照地址 编辑:程序博客网 时间:2024/04/29 08:38

对于进程提升权限主要用到下面三个API      

           OpenProcessToken();        打开权限令牌 
           LookupPrivilegeValue();      检索一个唯一的本地标识符  LUID
            AdjustTokenPrivileges();   调整令牌特权

          BOOL OpenProcessToken(

   HANDLE ProcessHandle, //要修改访问权限的进程句柄
  DWORD DesiredAccess, //指定你要进行的操作类型
   PHANDLE TokenHandle //返回的访问令牌指针
  );
             


  
      BOOL LookupPrivilegevalue(

  LPCTSTR lpSystemName, //表示所要查看的系统,本地系统直接用NULL
  LPCTSTR lpName, //表示所要查看的特权信息的名称
  PLUID lpLuid //
接收所返回的制定特权名称的信息
  );      
  

 

    LUID是用来填充如下结构体的

typedef struct _TOKEN_PRIVILEGES {  

DWORDPrivilegeCount;     //令牌属性的个数

  LUID_AND_ATTRIBUTESPrivileges[];  //LUID和属性数组

 } TOKEN_PRIVILEGES, *PTOKEN




              BOOL AdjustTokenPrivileges(
  HANDLE
TokenHandle, //包含特权的句柄
  BOOL DisableAllPrivileges,//禁用所有权限标志
  PTOKEN_PRIVILEGESNewState,//新特权信息的指针(结构体)
  DWORD BufferLength, //缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)
  PTOKEN_PRIVILEGES PreviousState,//接收被改变特权当前状态的Buffer
  PDWORD ReturnLength //接收PreviousState缓存区要求的大小
  
);


看代码:

 

  1. HANDLE TokenHandle;
  2.         if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TokenHandle))
  3.         {
  4.                 return ;
  5.         }

  6.         TOKEN_PRIVILEGES t_privileges = {0};
  7.         if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &t_privileges.Privileges[0].Luid))
  8.         {
  9.                 return ;
  10.         }
  11.         t_privileges.PrivilegeCount = 1;
  12.         t_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

  13.         if(!AdjustTokenPrivileges(TokenHandle, FALSE, &t_privileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))
  14.         {
  15.                 CloseHandle(TokenHandle);
  16.                 return ;
  17.         }
原创粉丝点击