您的位置:首页 > 编程语言

一句代码提升进程权限

2014-09-11 19:26 381 查看


博客分类:

VC

PHPBBSIDEWindowsthread

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代码


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.

// 输出原来相应权限的状态(打开 | 关闭)

很多人大概没有听说过他的大名,但是相信有很多人见过进程提权的过程

拷一段我写的提权上来吧

C代码


BOOL ImproveProcPriv()

{

HANDLE token;

//提升权限

if(!OpenProcessToken(GetCurrentProcess(),TOKEN_ADJUST_PRIVILEGES,&token))

{

MessageBox(NULL,"打开进程令牌失败...","错误",MB_ICONSTOP);

return FALSE;

}

TOKEN_PRIVILEGES tkp;

tkp.PrivilegeCount = 1;

::LookupPrivilegeValue(NULL,SE_DEBUG_NAME,&tkp.Privileges[0].Luid);

tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;

if(!AdjustTokenPrivileges(token,FALSE,&tkp,sizeof(tkp),NULL,NULL))

{

MessageBox(NULL,"调整令牌权限失败...","错误",MB_ICONSTOP);

return FALSE;

}

CloseHandle(token);

return TRUE;

}

看看吧,这个提权快要累死了...

但是 如果有这个函数就不一样了,你可以只用一个函数就实现这个功能,甚至功能远多于上面的代码...

通过恰当的IDE设置和必要的Defination,上面这个函数的功能你完全可以通过一行代码来实现。

RtlAdjustPrivilege(SE_DEBUG_NAME,1,0,NULL);

原文地址:http://bbs.pediy.com/showthread.php?t=104323

例子:强制关机

Cpp代码


// ExitWindow.cpp : Defines the entry point for the console application.

//

#include "stdafx.h"

#include <Windows.h>

#include <stdio.h>

//定义函数原型

typedef int (__stdcall *Func_RtlAdjustPrivilege)(ULONG, BOOLEAN, BOOLEAN, PBOOLEAN);

int main(int argc, char* argv[])

{

//装载DLL

HMODULE hModule = ::LoadLibrary("NTDLL.DLL");

if(hModule == NULL) {

printf("LoadLibrary error\n");

return 0;

}

//得到导出函数的地址

Func_RtlAdjustPrivilege RtlAdjustPrivilege = (Func_RtlAdjustPrivilege)GetProcAddress(hModule, "Func_RtlAdjustPrivilege");

if(RtlAdjustPrivilege == NULL) {

printf("GetProcAddress error \n");

return 0;

}

//HANDLE hToken;

//TOKEN_PRIVILEGES tkp;

//取得系统版本

OSVERSIONINFO osvi;

osvi.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);

if(GetVersionEx(&osvi) == 0) {

return false;

}

if(osvi.dwPlatformId == VER_PLATFORM_WIN32_NT) {

/*

.常量 SE_BACKUP_PRIVILEGE, "17", 公开

.常量 SE_RESTORE_PRIVILEGE, "18", 公开

.常量 SE_SHUTDOWN_PRIVILEGE, "19", 公开

.常量 SE_DEBUG_PRIVILEGE, "20", 公开

*/

RtlAdjustPrivilege(19, 1, 0, NULL);

}

//强制关机, 不向进程发送WM_QUERYENDSESSION消息

ExitWindowsEx(EWX_FORCE, 0);

return 0;

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