我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过OpenProcessToken得到,函数的原型如下:
OpenProcessToken 得到进程的令牌句柄
BOOL OpenProcessToken(
HANDLE ProcessHandle, //要修改访问权限的进程句柄
DWORD DesiredAccess, //指定你要进行的操作类型,TOKEN_ADJUST_PRIVILEGES表示你下面将要进行“修改令牌的访问权限”的操作。
PHANDLE TokenHandle //返回的访问令牌指针
);
AdjustTokenPrivileges的原型如下:
BOOL AdjustTokenPrivileges(
HANDLE TokenHandle, // 访问令牌的句柄
BOOL DisableAllPrivileges, // 是进行权限修改还是除能(Disable)所有权限
PTOKEN_PRIVILEGES NewState, // 指明要修改的权限,是一个指向TOKEN_PRIVILEGES结构的指针,该结构包含一个数组,数据组的每个项指明了权限的类型和要进行的操作
DWORD BufferLength, // 结构PreviousState的长度,如果PreviousState为空,该参数应为NULL
PTOKEN_PRIVILEGES PreviousState, // 也是一个指向TOKEN_PRIVILEGES结构的指针,存放修改前的访问权限的信息,可空
PDWORD ReturnLength // 实际PreviousState结构返回的大小
);
TOKEN_PRIVILEGES 这个结构,其声明如下:
typedef struct _TOKEN_PRIVILEGES {
DWORD PrivilegeCount; //数组原素的个数
LUID_AND_ATTRIBUTES Privileges[]; //一个LUID_AND_ATTRIBUTES类型的数组
} TOKEN_PRIVILEGES, *PTOKEN_PRIVILEGES;
再来看一下LUID_AND_ATTRIBUTES这个结构的内容,声明如下:
typedef struct _LUID_AND_ATTRIBUTES {
LUID Luid; //指权限的类型
DWORD Attributes; //指明了我们要进行的操作类型
} LUID_AND_ATTRIBUTES, *PLUID_AND_ATTRIBUTES
#include <stdio.h>
#include <stdlib.h>
#include <Windows.h>
#include <Tlhelp32.h>
// 提升权限
BOOL EnableDebugPrivilege() {
HANDLE hToken;
BOOL fOK = FALSE;
//1. 获取进程访问令牌的句柄
if (OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES, &hToken)){
TOKEN_PRIVILEGES tp;
tp.PrivilegeCount = 1;
//2. 查询进程的权限 LookupPrivilegeValue
LookupPrivilegeValue(NULL, SE_DEBUG_NAME, &tp.Privileges[0].Luid);
tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
//3. 对这个访问令牌进行修改 AdjustTokenPrivileges
AdjustTokenPrivileges(hToken, FALSE, &tp, sizeof(tp), NULL, NULL);
fOK = (GetLastError() == ERROR_SUCCESS);
CloseHandle(hToken);
}
return fOK;
}
//获取进程ID
int GetProcessID(WCHAR * szProcessName){
HANDLE hSnapshot = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if (INVALID_HANDLE_VALUE == hSnapshot){
return 0;
}
PROCESSENTRY32 pi;
pi.dwSize = sizeof(PROCESSENTRY32); //第一次使用必须初始化成员
BOOL bRet = Process32First(hSnapshot, &pi);
while (bRet){
/*
循环遍历添加自己的额外代码
*/
//判断进程名是否一致,返回0代表一致
int flag = wcscmp(pi.szExeFile, szProcessName);
if (flag==0)
{
printf("EQUAL");
return pi.th32ProcessID;//进程一致,返回进程ID
}
bRet = Process32Next(hSnapshot, &pi);
}
return 0;
}
//修改内存中的静态地址
int main() {
//目标是锁定阳光的数量
//WriteProcessMemory Windows系统API 1.进程句柄 2.地址(基址,静态地址) 3.值(值得地址) 4.写入的数据宽度 5.写入的宽度(传出的,SIZE_T地址)
//OpenProcess 权限,是否继承句柄,进程ID(PID),
//手动输入进程ID,下一节我们自动获取ID了 26452
//判断ID是否合法
//循环修改目标值
int procId = GetProcessID(L"PlantsVsZombies.exe");
if (procId){
HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, procId);
if (hProcess == NULL){
printf("open process fail;\n");
system("pause");
}else{
int nValue = 5000;
SIZE_T dwByte = 0;
LPVOID lpAddr = (LPVOID)0x0FE56CD0;
while (true){
bool flag = WriteProcessMemory(hProcess, lpAddr, &nValue, 4, &dwByte);
if (flag != true){
printf("write process memory fail;\n");
system("pause");
}
}
}
}
return 0;
}
提升权限
如果上述代码提升权限还不够用,进行如下设置
![](https://img.haomeiwen.com/i18609861/ae1d63a9d552e3be.png)
网友评论