您的位置:首页 > 其它

对当前进程进行提升权限

2012-02-08 17:26 399 查看
对于进程提升权限主要用到下面三个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 {

DWORD
PrivilegeCount; //令牌属性的个数

LUID_AND_ATTRIBUTES
Privileges[]; //LUID和属性数组

} TOKEN_PRIVILEGES, *PTOKEN

BOOL AdjustTokenPrivileges(

  HANDLE
TokenHandle, //包含特权的句柄

  BOOL DisableAllPrivileges,//禁用所有权限标志

  PTOKEN_PRIVILEGESNewState,//新特权信息的指针(结构体)

  DWORD BufferLength, //缓冲数据大小,以字节为单位的PreviousState的缓存区(sizeof)

  PTOKEN_PRIVILEGES PreviousState,//接收被改变特权当前状态的Buffer

  PDWORD ReturnLength //接收PreviousState缓存区要求的大小

  );

看代码:



HANDLE TokenHandle;

if(!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &TokenHandle))

{

return ;

}

TOKEN_PRIVILEGES t_privileges = {0};

if(!LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME, &t_privileges.Privileges[0].Luid))

{

return ;

}

t_privileges.PrivilegeCount = 1;

t_privileges.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if(!AdjustTokenPrivileges(TokenHandle, FALSE, &t_privileges, sizeof(TOKEN_PRIVILEGES), NULL, NULL))

{

CloseHandle(TokenHandle);

return ;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: