美文网首页
无限阳光修改及驱动中的权限提升

无限阳光修改及驱动中的权限提升

作者: 温柔倾怀 | 来源:发表于2019-11-22 21:56 被阅读0次
我们要修改一个进程的访问令牌,首先要获得进程访问令牌的句柄,这可以通过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://www.haomeiwen.com/subject/jzfcwctx.html