这三个函数主要用来提升进程的权限
1 OpenProcessToken()函数:获取进程的令牌句柄
OpenProcessToken的原型.
BOOL WINAPI OpenProcessToken(
__in HANDLE ProcessHandle,
__in DWORD DesiredAccess,
__out PHANDLE TokenHandle
);
第一个参数 进程句柄(当前进程为GetCurrentProcess()为参数)
第二个参数 访问令牌特权(可以参考msdnhttps://msdn.microsoft.com/zh-cn/library/aa374905)
第三个参数 令牌句柄 返回的参数 就是AdjustTokenPrivileges的第一个参数
2LookupPrivilegeValue()函数:
在认识这个函数之前我们需要了解一下结构体
TOKEN_PRIVILEGES结构体
typedef struct _TOKEN_PRIVILEGES
{
DWORD PrivilegeCount;
LUID_AND_ATTRIBUTES Privileges[ANYSIZE_ARRAY];
}TOKEN_PRIVILEGES;
第一个参数是个特权数组。
第二个参数是要修改的特权数目
LUID_AND_ATTRIBUTES 结构体
typedef struct _LUID_AND_ATTRIBUTES
{
LUID Luid;
DWORD Attributes;
} LUID_AND_ATTRIBUTES;
LookupPrivilegeValue的原型
BOOL WINAPI LookupPrivilegeValue(
__in_opt LPCTSTR lpSystemName,
__in LPCTSTR lpName,
__out PLUID lpLuid
);
第一个参数是系统的名字,如果为NULL,就是本地名字(这里就填NULL)
第二个参数是特权的名字,要查看详细特权,在这里写SE_DEBUG_NAME
第三个参数就可以通过指针返回一个LUID类型的Luid的标识了。 通过这个值就可以填入刚才的结构体里了。
3 AdjustTokenPrivileges()函数
BOOL WINAPI AdjustTokenPrivileges(
__in HANDLE TokenHandle,
__in BOOL DisableAllPrivileges,
__in_opt PTOKEN_PRIVILEGES NewState,
__in DWORD BufferLength,
__out_opt PTOKEN_PRIVILEGES PreviousState,
__out_opt PDWORD ReturnLength
);
第一个参数为OpenProcessToken第三个指针参数传出的句柄值
第二个参数为是否禁用所有所有的特权(这里填false)
第三个参数为新的TOKEN_PRIVILEGES的特权结构体指针
第四个参数是上面结构体的字节长度(sizeof)
第五个参数是 接受原先的特权的结构体
第六个参数也是这个结构体的字节长度的指针
最后要记得调用CloseHandle()函数
我们可以将上述函数组合为一个方法
void EenableDebugPriv() { HANDLE hToken; TOKEN_PRIVILEGES tkp; OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken); LookupPrivilegeValue(NULL, SE_SHUTDOWN_NAME,&tkp.Privileges[0].Luid); tkp.PrivilegeCount = 1; tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED; AdjustTokenPrivileges(hToken, FALSE, &tkp, 0,(PTOKEN_PRIVILEGES)NULL, 0); CloseHandle( hToken ); }
这样就可以修改相关进程的权限了
原贴地址:https://blog.csdn.net/cxq_1993/article/details/48053997