RtlAdjustPrivilege() 这玩意是在 NTDLL.DLL 里的一个不为人知的函数,MS没有公开,原因就是这玩意实在是太NB了,以至于不需要任何其他函数的帮助,仅凭这一个函数就可以获得进程ACL的任意权限!
先来看看这个函数的定义(Winehq给出):
NTSTATUS RtlAdjustPrivilege
(
ULONG Privilege,
BOOLEAN Enable,
BOOLEAN CurrentThread,
PBOOLEAN Enabled
)
参数的含义:
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.
// 输出原来相应权限的状态(打开 | 关闭), 注意:该参数赋予空指针会出错,我测试过。
附上 Delphi 定义和例子,我测试过的:
function RtlAdjustPrivilege(Privilege:ULONG;
Enable:BOOL;
CurrentThread:BOOL;
var Enabled:BOOL):DWORD; stdcall; external 'ntdll';
const
SE_BACKUP_PRIVILEGE = $11;
SE_RESTORE_PRIVILEGE = $12;
SE_SHUTDOWN_PRIVILEGE = $13; //关机权限
SE_DEBUG_PRIVILEGE = $14; //调试权限
Delphi 调用例子:
var
Enabled:BOOL;
begin
if RtlAdjustPrivilege(SE_DEBUG_PRIVILEGE,true,false,Enabled)) = 0 then
showmessage('ok');
end;
瞬间关机代码VC
#include <windows.h>}
如果是c++ 需要主要调用约定问题 函数本身是C调用方式 C++是标准调用方式 所以在申明函数的时候要加上_stdcall
typedef int (_stdcall *axi)(int, bool, bool, int*);
typedef int (_stdcall * type_RtlAdjustPrivilege)(int, bool, bool, int*);
关于返回值也需要特别说明下: 实验了下 提权成功了 但是返回值还是NULL 如果这个时候验证返回值将不准确了 所以成功与否还是只能看后边的打开进程是否成功