VC 一句代码提升进程权限

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", 公开


先来看看这个函数的定义

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.
// 输出原来相应权限的状态(打开 | 关闭)


 很多人大概没有听说过他的大名,但是相信有很多人见过进程提权的过程
拷一段我写的提权上来吧

BOOL EnableDebugPrivilege()
{
    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;
}

 

bool EnableDebugPrivilege()   
{   
    HANDLE hToken;   
    LUID sedebugnameValue;   
    TOKEN_PRIVILEGES tkp;   
    if (!OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    {   
        return   FALSE;   
    }   
    if (!LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &sedebugnameValue))  
    {   
        CloseHandle(hToken);   
        return false;   
    }   
    tkp.PrivilegeCount = 1;   
    tkp.Privileges[0].Luid = sedebugnameValue;   
    tkp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;   
    if (!AdjustTokenPrivileges(hToken, FALSE, &tkp, sizeof(tkp), NULL, NULL)) 
    {   
        CloseHandle(hToken);   
        return false;   
    }   
    return true;   
}

 

例子:强制关机

// 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;
}

 

附注:

#define SE_CREATE_TOKEN_NAME              TEXT("SeCreateTokenPrivilege")
#define SE_ASSIGNPRIMARYTOKEN_NAME        TEXT("SeAssignPrimaryTokenPrivilege")
#define SE_LOCK_MEMORY_NAME               TEXT("SeLockMemoryPrivilege")
#define SE_INCREASE_QUOTA_NAME            TEXT("SeIncreaseQuotaPrivilege")
#define SE_UNSOLICITED_INPUT_NAME         TEXT("SeUnsolicitedInputPrivilege")
#define SE_MACHINE_ACCOUNT_NAME           TEXT("SeMachineAccountPrivilege")
#define SE_TCB_NAME                       TEXT("SeTcbPrivilege")
#define SE_SECURITY_NAME                  TEXT("SeSecurityPrivilege")
#define SE_TAKE_OWNERSHIP_NAME            TEXT("SeTakeOwnershipPrivilege")
#define SE_LOAD_DRIVER_NAME               TEXT("SeLoadDriverPrivilege")
#define SE_SYSTEM_PROFILE_NAME            TEXT("SeSystemProfilePrivilege")
#define SE_SYSTEMTIME_NAME                TEXT("SeSystemtimePrivilege")
#define SE_PROF_SINGLE_PROCESS_NAME       TEXT("SeProfileSingleProcessPrivilege")
#define SE_INC_BASE_PRIORITY_NAME         TEXT("SeIncreaseBasePriorityPrivilege")
#define SE_CREATE_PAGEFILE_NAME           TEXT("SeCreatePagefilePrivilege")
#define SE_CREATE_PERMANENT_NAME          TEXT("SeCreatePermanentPrivilege")
#define SE_BACKUP_NAME                    TEXT("SeBackupPrivilege")
#define SE_RESTORE_NAME                   TEXT("SeRestorePrivilege")
#define SE_SHUTDOWN_NAME                  TEXT("SeShutdownPrivilege")
#define SE_DEBUG_NAME                     TEXT("SeDebugPrivilege")
#define SE_AUDIT_NAME                     TEXT("SeAuditPrivilege")
#define SE_SYSTEM_ENVIRONMENT_NAME        TEXT("SeSystemEnvironmentPrivilege")
#define SE_CHANGE_NOTIFY_NAME             TEXT("SeChangeNotifyPrivilege")
#define SE_REMOTE_SHUTDOWN_NAME           TEXT("SeRemoteShutdownPrivilege")
#define SE_UNDOCK_NAME                    TEXT("SeUndockPrivilege")
#define SE_SYNC_AGENT_NAME                TEXT("SeSyncAgentPrivilege")
#define SE_ENABLE_DELEGATION_NAME         TEXT("SeEnableDelegationPrivilege")
#define SE_MANAGE_VOLUME_NAME             TEXT("SeManageVolumePrivilege")

注: 完整列表请参考 http://msdn.microsoft.com/en-us/library/bb530716(v=vs.85).aspx
 

注:本文转载自:http://bbs.pediy.com/showthread.php?t=104323

                                http://pengranxiang.iteye.com/blog/771038

  • 0
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 进程的互斥是一种保证多个进程在访问共享资源时不会发生冲突的方法。在VC6.0中,我们可以使用互斥对象来实现进程的互斥。 首先,我们需要定义一个互斥对象。在VC6.0中,可以使用CreateMutex函数来创建一个互斥对象。例如: HANDLE hMutex = CreateMutex(NULL, FALSE, "MyMutex"); 其中,第一个参数为一个LPSECURITY_ATTRIBUTES指针,用于指定互斥对象的安全属性,一般设为NULL即可;第二个参数为BOOL类型的初始状态,一般设为FALSE;第三个参数为一个LPCTSTR类型的字符串,用于指定互斥对象的名称。 接下来,我们可以使用WaitForSingleObject函数来等待互斥对象。例如: DWORD dwWaitResult = WaitForSingleObject(hMutex, INFINITE); 其中,第一个参数为互斥对象的句柄;第二个参数为等待的时间,INFINITE表示无限等待。 如果返回值为WAIT_OBJECT_0,表示成功获取到互斥对象,可以继续访问共享资源。否则,表示等待超时或出现错误。 最后,我们使用ReleaseMutex函数来释放互斥对象。例如: BOOL bReleaseResult = ReleaseMutex(hMutex); 其中,参数为互斥对象的句柄。 通过这样的方式,我们可以在多个进程之间实现资源的互斥访问,避免了数据的冲突和竞争条件的出现。 ### 回答2: 进程的互斥是指确保在多进程环境下同时只有一个进程可以访问临界资源(如共享内存、文件等),以避免数据竞争和不一致的问题。 在VC6.0中,可以通过使用Windows API函数来实现进程的互斥。以下是一个示例代码: ```cpp #include <windows.h> int main() { // 创建一个互斥对象 HANDLE hMutex = CreateMutex(NULL, FALSE, "MyMutex"); // 检查互斥对象是否已经存在 if (ERROR_ALREADY_EXISTS == GetLastError()) { // 如果互斥对象已经存在,说明已有进程正在访问临界资源,直接退出程序 return 0; } // 这里是临界区代码,对共享资源的访问操作 // 在访问完共享资源后,释放互斥对象 ReleaseMutex(hMutex); // 关闭互斥对象的句柄 CloseHandle(hMutex); return 0; } ``` 在上面的代码中,首先使用`CreateMutex`函数创建了一个名为"MyMutex"的互斥对象。如果互斥对象已经存在(即其他进程已经创建了该互斥对象),则直接退出程序。 如果进程是第一个创建该互斥对象的进程,那么就可以执行临界区代码,对共享资源进行访问。在访问完共享资源后,通过调用`ReleaseMutex`函数来释放该互斥对象。 最后,需要关闭互斥对象的句柄,以释放资源。 这样,通过使用互斥对象,确保了在多进程环境下只有一个进程能够访问临界资源,实现了进程的互斥。 ### 回答3: 进程的互斥是指在多个进程同时访问共享资源时,通过互斥机制保证同一时间只有一个进程能够访问该资源。下面是一个用VC6.0编写的进程互斥的示例代码: ```cpp #include <windows.h> int main() { HANDLE hMutex = CreateMutex(NULL, FALSE, "Mutex"); // 创建一个互斥体 if (hMutex == NULL) { // 互斥体创建失败,处理错误 return 1; } // 在使用共享资源之前,请求互斥体的所有权 WaitForSingleObject(hMutex, INFINITE); // 访问共享资源的代码 // ... // 使用完共享资源后,释放互斥体的所有权 ReleaseMutex(hMutex); CloseHandle(hMutex); // 关闭互斥体句柄 return 0; } ``` 在这段代码中,通过CreateMutex函数创建了一个名为"Mutex"的互斥体,并将其句柄保存到hMutex变量中。然后使用WaitForSingleObject函数请求互斥体的所有权,这样如果有其他进程正在访问该互斥体,当前进程会被阻塞直到其它进程释放该互斥体。在获取到互斥体的所有权后,可以进行对共享资源的访问操作。完成共享资源的使用后,通过调用ReleaseMutex函数释放互斥体的所有权。 最后,通过CloseHandle函数关闭互斥体的句柄,释放相关资源。 这段代码的作用是通过互斥体实现了对共享资源的互斥访问,保证同一时间只有一个进程能够访问该资源,从而避免了进程间的竞争和冲突。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值