0

0

windows内核提权,又一突破游戏进程保护的方法

絕刀狂花

絕刀狂花

发布时间:2025-05-30 08:14:30

|

699人浏览过

|

来源于php中文网

原创

windows内核提权,又一突破游戏保护的方式。一丶 句柄表1.1 介绍

当一个进程被保护的时候 比如无法获取其进程句柄权限 (openprocess) 或者无法获取内存读写访问权限的时候,则可以使用此方法来进行提权。

前置知识,了解windows系统句柄表的构成

可查看本博客链接:

x64windows内核句柄表PspCidTable原理与解析 - iBinary - 博客园 (cnblogs.com)

1.2 原理

句柄表项结构 HANDLE_TABLE_ENTRY 里面有一个成员记录了 当前句柄所需要得访问权限。

结构如下:

代码语言:javascript代码运行次数:0运行复制
//0x8 bytes (sizeof)union _HANDLE_TABLE_ENTRY{    volatile LONG VolatileLowValue;                                         //0x0    LONG LowValue;                                                          //0x0    struct    {        struct _HANDLE_TABLE_ENTRY_INFO* volatile InfoTable;                //0x0    LONG HighValue;                                                         //0x4    union _HANDLE_TABLE_ENTRY* NextFreeHandleEntry;                         //0x4        struct _EXHANDLE LeafHandleValue;                                   //0x4    };    ULONG Unlocked:1;                                                       //0x0    ULONG Attributes:2;                                                     //0x0    struct    {        ULONG ObjectPointerBits:29;                                         //0x0    LONG RefCountField;                                                     //0x4    ULONG GrantedAccessBits:25;                                             //0x4    ULONG ProtectFromClose:1;                                               //0x4    ULONG NoRightsUpgrade:1;                                                //0x4    };    ULONG RefCnt:5;                                                         //0x4}; 

其中他大部分是联合体组成,其核心字段则是 GrantedAccessBits

所以我们的做法是 首先拿到被降权的句柄,然后将此句柄的 权限修改为

完整权限,也就是 0x1fffff 。修改完成之后再用提权的句柄进行我们的操作。

二丶代码演示2.1 核心提权驱动代码

核心驱动代码很简单。

如下:

代码语言:javascript代码运行次数:0运行复制
#include #include typedef union _EXHANDLE{    struct    {        int TagBits : 2;        int Index : 30;    } u;    void* GenericHandleOverlay;    ULONG_PTR Value;} EXHANDLE, *PEXHANDLE;typedef struct _HANDLE_TABLE_ENTRY // Size=16{    union    {        ULONG_PTR VolatileLowValue; // Size=8 Offset=0        ULONG_PTR LowValue; // Size=8 Offset=0        struct _HANDLE_TABLE_ENTRY_INFO* InfoTable; // Size=8 Offset=0        struct        {            ULONG_PTR Unlocked : 1; // Size=8 Offset=0 BitOffset=0 BitCount=1            ULONG_PTR RefCnt : 16; // Size=8 Offset=0 BitOffset=1 BitCount=16            ULONG_PTR Attributes : 3; // Size=8 Offset=0 BitOffset=17 BitCount=3            ULONG_PTR ObjectPointerBits : 44; // Size=8 Offset=0 BitOffset=20 BitCount=44        };    };    union    {        ULONG_PTR HighValue; // Size=8 Offset=8        struct _HANDLE_TABLE_ENTRY* NextFreeHandleEntry; // Size=8 Offset=8        union _EXHANDLE LeafHandleValue; // Size=8 Offset=8        struct        {            ULONG GrantedAccessBits : 25; // Size=4 Offset=8 BitOffset=0 BitCount=25            ULONG NoRightsUpgrade : 1; // Size=4 Offset=8 BitOffset=25 BitCount=1            ULONG Spare : 6; // Size=4 Offset=8 BitOffset=26 BitCount=6        };    };    ULONG TypeInfo; // Size=4 Offset=12} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;typedef struct _HANDLE_TABLE{    ULONG NextHandleNeedingPool;    long ExtraInfoPages;    LONG_PTR TableCode;    PEPROCESS QuotaProcess;    LIST_ENTRY HandleTableList;    ULONG UniqueProcessId;    ULONG Flags;    EX_PUSH_LOCK HandleContentionEvent;    EX_PUSH_LOCK HandleTableLock;    // More fields here...} HANDLE_TABLE, *PHANDLE_TABLE;typedef BOOLEAN(*EX_ENUMERATE_HANDLE_ROUTINE)(    IN PHANDLE_TABLE HandleTable,    IN PHANDLE_TABLE_ENTRY HandleTableEntry,    IN HANDLE Handle,    IN PVOID EnumParameter    );#ifdef __cplusplusextern "C"{#endif    BOOLEAN NTAPI ExEnumHandleTable(        IN PHANDLE_TABLE HandleTable,        IN EX_ENUMERATE_HANDLE_ROUTINE EnumHandleProcedure,        IN PVOID EnumParameter,        OUT PHANDLE Handle);    VOID FASTCALL ExfUnblockPushLock(        IN OUT PEX_PUSH_LOCK PushLock,        IN OUT PVOID WaitBlock    );#ifdef __cplusplus}#endiftypedef struct _HANDLE_INFO{    unsigned long process_id;    unsigned long access;    unsigned long long handle;}HANDLE_INFO, *PHANDLE_INFO;unsigned char callback(    PHANDLE_TABLE pHandleTableAddress,    PHANDLE_TABLE_ENTRY pHandleTableEntryInfo,    HANDLE Handle,    PVOID pContext){#define ExpIsValidObjectEntry(Entry) ( (Entry) && (Entry->LowValue != 0) && (Entry->HighValue != -2) )    unsigned char result = 0;    if (MmIsAddressValid(pContext))    {        PHANDLE_INFO info = (PHANDLE_INFO)pContext;        if (info->handle == (unsigned long long)Handle            && MmIsAddressValid(pHandleTableEntryInfo)            && ExpIsValidObjectEntry(pHandleTableEntryInfo)            && pHandleTableEntryInfo->GrantedAccessBits != info->access)        {            pHandleTableEntryInfo->GrantedAccessBits = info->access;            result = 1;        }    }    if (pHandleTableEntryInfo) _InterlockedExchangeAdd8((char*)&pHandleTableEntryInfo->VolatileLowValue, 1);    if (pHandleTableAddress && pHandleTableAddress->HandleContentionEvent) ExfUnblockPushLock(&pHandleTableAddress->HandleContentionEvent, NULL);    return result;}void handleUpdateAccess(HANDLE_INFO info){    PEPROCESS process{ 0 };    NTSTATUS status = PsLookupProcessByProcessId((HANDLE)info.process_id, &process);    if (NT_SUCCESS(status))    {        //dt _EPROCESS find ObjectTable  offset replace ox418 of offset        PHANDLE_TABLE table_ptr = *(PHANDLE_TABLE*)((PUCHAR)process + 0x418);        if (MmIsAddressValid(table_ptr)) ExEnumHandleTable(table_ptr, &callback, &info, NULL);        ObDereferenceObject(process);    }}VOID DriverUnload(PDRIVER_OBJECT){}EXTERN_CNTSTATUSDriverEntry(    PDRIVER_OBJECT driver,    PUNICODE_STRING){    driver->DriverUnload = DriverUnload;    HANDLE_INFO info{ 0 };    info.process_id = 6288; //需要被提权的进程PID    info.access = 0x1fffff; //设置为所有权限    info.handle = 0xA4;     //提权进程拿到权限的句柄    handleUpdateAccess(info);    return STATUS_SUCCESS;}
2.2 用户程序以及使用说明例子

用户层面演示例子:

代码语言:javascript代码运行次数:0运行复制
// ShutDownProtectProcess.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。//#include #include using namespace std;int main(){    //可以拿到一个较低等级的权限  例如:PROCESS_QUERY_INFORMATION    HANDLE hProcess = OpenProcess(PROCESS_TERMINATE, FALSE, 7652);    BOOL bRet = FALSE;    cout << "HANDLE = " << hex << hProcess << endl;    cout << "Start Terminate Process " << endl;    bRet =  TerminateProcess(hProcess,0);    if (bRet == FALSE)    {        cout << "TerminateProcess Error try two Terminate" << endl;        system("pause"); //等待安装好内核文件,来进行权限提升,在按任意键继续        bRet = TerminateProcess(hProcess, 0);        if (bRet == FALSE)        {            cout << "Two TerminateProcess Error " << endl;            system("pause");            return 0;        }        {            cout << "Two TerminateProcess Success " << endl;            system("pause");            return 0;        }    }    else    {        cout << "one TerminateProcess Success " << endl;        system("pause");        return 0;    }    system("pause");    return 0;}

因为我没有封装内核通信。所以运行USER程序之后会等待用户自己手动安装驱动。

驱动里面的PID要改成USER程序的,也要把用户获取的HANDLE打印出来修改到驱动中。

Cutout.Pro
Cutout.Pro

AI驱动的视觉设计平台

下载

然后重新编译驱动,进行安装。 安装之后句柄就会被提权的。 此时用户程序继续运行即可结束被保护的notepad程序。

2.3 进程保护驱动Demo源码代码语言:javascript代码运行次数:0运行复制
#include #include #define PROCESS_TERMINATE         (0x0001)  // winnt#define PROCESS_CREATE_THREAD     (0x0002)  // winnt#define PROCESS_SET_SESSIONID     (0x0004)  // winnt#define PROCESS_VM_OPERATION      (0x0008)  // winnt#define PROCESS_VM_READ           (0x0010)  // winnt#define PROCESS_VM_WRITE          (0x0020)  // winnt// begin_ntddk begin_wdm begin_ntifs#define PROCESS_DUP_HANDLE        (0x0040)  // winnt// end_ntddk end_wdm end_ntifs#define PROCESS_CREATE_PROCESS    (0x0080)  // winnt#define PROCESS_SET_QUOTA         (0x0100)  // winnt#define PROCESS_SET_INFORMATION   (0x0200)  // winnt#define PROCESS_QUERY_INFORMATION (0x0400)  // winnt#define PROCESS_SET_PORT          (0x0800)#define PROCESS_SUSPEND_RESUME    (0x0800)  // winntPVOID g_ObjHandle;extern "C" NTKERNELAPIUCHAR * PsGetProcessImageFileName(__in PEPROCESS Process);OB_PREOP_CALLBACK_STATUS MyObjectCallBack(    PVOID RegistrationContext,    POB_PRE_OPERATION_INFORMATION OperationInformation){    UNREFERENCED_PARAMETER(RegistrationContext);    PEPROCESS pProcess = NULL;    CHAR *pszName = NULL;    pProcess = (PEPROCESS)OperationInformation->Object;    pszName = (CHAR*)PsGetProcessImageFileName(pProcess);    //判断标志是否要打开进程    if (OperationInformation->Operation == OB_OPERATION_HANDLE_CREATE)    {        //获取名字匹配        if (strstr(pszName, (CHAR*)"notepad"))        {            KdPrint(("%s \r\n", pszName));            //判断是不是结束            if ((OperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess                & PROCESS_TERMINATE) == 1)            {                //如果是我们的.则设置DesiredAccess权限.去掉结束权限.                OperationInformation->Parameters->CreateHandleInformation.DesiredAccess                    = (ULONG)~PROCESS_TERMINATE;                return OB_PREOP_SUCCESS;            }        }    }    return OB_PREOP_SUCCESS;}VOID InitHook(){    //进行HOOK 回调钩子写法.     OB_OPERATION_REGISTRATION oper; //你的回调函数以及类型都放在这个结构体中,可以是结构体数组.    OB_CALLBACK_REGISTRATION CallbackRegistration;    CallbackRegistration.Version = OB_FLT_REGISTRATION_VERSION; //版本号    CallbackRegistration.OperationRegistrationCount = 1;//下几个钩子,也就是结构体数组个数    RtlUnicodeStringInit(&CallbackRegistration.Altitude, L"600000");//给个UNICODEstring表明您是干啥的    CallbackRegistration.RegistrationContext = NULL;         //当你的回调函数到的时候参数是什么.由这里给出    CallbackRegistration.OperationRegistration = &oper; //钩子结构体类型设置.    //为钩子结构体赋值    oper.ObjectType = PsProcessType; //进程操作的类型.当进程操作回来. PsThreadType则是线程操作    oper.Operations = OB_OPERATION_HANDLE_CREATE; //操作的类型是将要打开.以及将要重复    oper.PreOperation = MyObjectCallBack; //有两个指针,前指针跟后指针.意思分别是 进程创建之前通知你还是之后    oper.PostOperation = NULL;    ObRegisterCallbacks(&CallbackRegistration, &g_ObjHandle);}VOID UnHook(){    ObUnRegisterCallbacks(g_ObjHandle);}VOIDDriverUnLoad(    _In_ struct _DRIVER_OBJECT *DriverObject){    UNREFERENCED_PARAMETER(DriverObject);    UnHook();}typedef struct _LDR_DATA_TABLE_ENTRY {    LIST_ENTRY64    InLoadOrderLinks;    LIST_ENTRY64    InMemoryOrderLinks;    LIST_ENTRY64    InInitializationOrderLinks;    PVOID            DllBase;    PVOID            EntryPoint;    ULONG            SizeOfImage;    UNICODE_STRING    FullDllName;    UNICODE_STRING     BaseDllName;    ULONG            Flags;    USHORT            LoadCount;    USHORT            TlsIndex;    PVOID            SectionPointer;    ULONG            CheckSum;    PVOID            LoadedImports;    PVOID            EntryPointActivationContext;    PVOID            PatchInformation;    LIST_ENTRY64    ForwarderLinks;    LIST_ENTRY64    ServiceTagLinks;    LIST_ENTRY64    StaticLinks;    PVOID            ContextInformation;    ULONG            OriginalBase;    LARGE_INTEGER    LoadTime;} LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;extern "C" NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegPath){    UNREFERENCED_PARAMETER(pRegPath);    PLDR_DATA_TABLE_ENTRY ldr;    ldr = (PLDR_DATA_TABLE_ENTRY)pDriverObj->DriverSection;    ldr->Flags |= 0x20;    pDriverObj->DriverUnload = DriverUnLoad;    InitHook();    return STATUS_SUCCESS;}

//比较完善的代码

代码语言:javascript代码运行次数:0运行复制
#define PROCESS_TERMINATE (0x0001)#define PROCESS_CREATE_THREAD (0x0002)#define PROCESS_SET_SESSIONID (0x0004)#define PROCESS_VM_OPERATION (0x0008)#define PROCESS_VM_READ (0x0010)#define PROCESS_VM_WRITE (0x0020)#define PROCESS_DUP_HANDLE (0x0040)#define PROCESS_CREATE_PROCESS (0x0080)#define PROCESS_SET_QUOTA (0x0100)#define PROCESS_SET_INFORMATION (0x0200)#define PROCESS_QUERY_INFORMATION (0x0400)#define PROCESS_SUSPEND_RESUME (0x0800)#define PROCESS_QUERY_LIMITED_INFORMATION (0x1000)#define PROCESS_SET_LIMITED_INFORMATION (0x2000)注意卸载:ObUnRegisterCallbacks(obHandle);NTSTATUS ProtectProcess(){OB_CALLBACK_REGISTRATION obReg;OB_OPERATION_REGISTRATION opReg;memset(&obReg, 0, sizeof(obReg));obReg.Version = ObGetFilterVersion();obReg.OperationRegistrationCount = 1;obReg.RegistrationContext = NULL;RtlInitUnicodeString(&obReg.Altitude, L"321000");memset(&opReg, 0, sizeof(opReg));opReg.ObjectType = PsProcessType;opReg.Operations = OB_OPERATION_HANDLE_CREATE | OB_OPERATION_HANDLE_DUPLICATE;opReg.PreOperation = (POB_PRE_OPERATION_CALLBACK)&preCall;obReg.OperationRegistration = &opReg;return ObRegisterCallbacks(&obReg, &obHandle);}OB_PREOP_CALLBACK_STATUS preCall(PVOID RegistrationContext, POB_PRE_OPERATION_INFORMATION pOperationInformation){HANDLE pid = PsGetProcessId((PEPROCESS)pOperationInformation->Object);if (pid == PID){if (pOperationInformation->Operation == OB_OPERATION_HANDLE_CREATE){if (pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess & PROCESS_TERMINATE)pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= (~PROCESS_TERMINATE);if (pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess & PROCESS_VM_OPERATION)pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= (~PROCESS_VM_OPERATION);if (pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess & PROCESS_VM_READ)pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= (~PROCESS_VM_READ);if (pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess & PROCESS_VM_WRITE)pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= (~PROCESS_VM_WRITE);if (pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess & PROCESS_SUSPEND_RESUME)pOperationInformation->Parameters->CreateHandleInformation.DesiredAccess &= (~PROCESS_SUSPEND_RESUME);}if (pOperationInformation->Operation == OB_OPERATION_HANDLE_DUPLICATE){if (pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess & PROCESS_TERMINATE)pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= (~PROCESS_TERMINATE);if (pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess & PROCESS_VM_OPERATION)pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= (~PROCESS_VM_OPERATION);if (pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess & PROCESS_VM_READ)pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= (~PROCESS_VM_READ);if (pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess & PROCESS_VM_WRITE)pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= (~PROCESS_VM_WRITE);if (pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess & PROCESS_SUSPEND_RESUME)pOperationInformation->Parameters->DuplicateHandleInformation.DesiredAccess &= (~PROCESS_SUSPEND_RESUME);}}return OB_PREOP_SUCCESS;}
三丶BlockBone代码实现

其实这个代码在BlockBone中已经实现了。

代码如下:

首先定义需要的结构

代码语言:javascript代码运行次数:0运行复制
#define EX_ADDITIONAL_INFO_SIGNATURE (ULONG_PTR)(-2)typedef union _EXHANDLE{    struct    {        int TagBits : 2;        int Index : 30;    } u;    void * GenericHandleOverlay;    ULONG_PTR Value;} EXHANDLE, *PEXHANDLE;typedef struct _HANDLE_TABLE{    ULONG NextHandleNeedingPool;    long ExtraInfoPages;    LONG_PTR TableCode;    PEPROCESS QuotaProcess;    LIST_ENTRY HandleTableList;    ULONG UniqueProcessId;    ULONG Flags;    EX_PUSH_LOCK HandleContentionEvent;    EX_PUSH_LOCK HandleTableLock;    // More fields here...} HANDLE_TABLE, *PHANDLE_TABLE;typedef struct _HANDLE_TABLE_ENTRY // Size=16{    union    {        ULONG_PTR VolatileLowValue; // Size=8 Offset=0        ULONG_PTR LowValue; // Size=8 Offset=0        struct _HANDLE_TABLE_ENTRY_INFO * InfoTable; // Size=8 Offset=0        struct        {            ULONG_PTR Unlocked : 1; // Size=8 Offset=0 BitOffset=0 BitCount=1            ULONG_PTR RefCnt : 16; // Size=8 Offset=0 BitOffset=1 BitCount=16            ULONG_PTR Attributes : 3; // Size=8 Offset=0 BitOffset=17 BitCount=3            ULONG_PTR ObjectPointerBits : 44; // Size=8 Offset=0 BitOffset=20 BitCount=44        };    };    union    {        ULONG_PTR HighValue; // Size=8 Offset=8        struct _HANDLE_TABLE_ENTRY * NextFreeHandleEntry; // Size=8 Offset=8        union _EXHANDLE LeafHandleValue; // Size=8 Offset=8        struct        {            ULONG GrantedAccessBits : 25; // Size=4 Offset=8 BitOffset=0 BitCount=25            ULONG NoRightsUpgrade : 1; // Size=4 Offset=8 BitOffset=25 BitCount=1            ULONG Spare : 6; // Size=4 Offset=8 BitOffset=26 BitCount=6        };    };    ULONG TypeInfo; // Size=4 Offset=12} HANDLE_TABLE_ENTRY, *PHANDLE_TABLE_ENTRY;/// /// Input for IOCTL_BLACKBONE_GRANT_ACCESS/// typedef struct _HANDLE_GRANT_ACCESS{    ULONGLONG  handle;      // Handle to modify    ULONG      pid;         // Process ID    ULONG      access;      // Access flags to grant} HANDLE_GRANT_ACCESS, *PHANDLE_GRANT_ACCESS;#define IOCTL_BLACKBONE_GRANT_ACCESS   (ULONG)CTL_CODE(FILE_DEVICE_BLACKBONE, 0x802, METHOD_BUFFERED, FILE_READ_ACCESS | FILE_WRITE_ACCESS)#define STATUS_WAIT_0                           ((NTSTATUS)0x00000000L) // winnttypedef BOOLEAN(*EX_ENUMERATE_HANDLE_ROUTINE)(#if !defined(_WIN7_)    IN PHANDLE_TABLE HandleTable,#endif    IN PHANDLE_TABLE_ENTRY HandleTableEntry,    IN HANDLE Handle,    IN PVOID EnumParameter    );extern "C" NTKERNELAPIBOOLEANExEnumHandleTable(    IN PHANDLE_TABLE HandleTable,    IN EX_ENUMERATE_HANDLE_ROUTINE EnumHandleProcedure,    IN PVOID EnumParameter,    OUT PHANDLE Handle);extern "C" NTKERNELAPIVOIDFASTCALLExfUnblockPushLock(    IN OUT PEX_PUSH_LOCK PushLock,    IN OUT PVOID WaitBlock);#define ExpIsValidObjectEntry(Entry) \    ( (Entry != NULL) && (Entry->LowValue != 0) && (Entry->HighValue != EX_ADDITIONAL_INFO_SIGNATURE) )

核心代码如下:

代码语言:javascript代码运行次数:0运行复制
/// /// Check if process is terminating/// /// Process/// If TRUE - terminatingBOOLEAN BBCheckProcessTermination(PEPROCESS pProcess){    LARGE_INTEGER zeroTime = { 0 };    return KeWaitForSingleObject(pProcess, Executive, KernelMode, FALSE, &zeroTime) == STATUS_WAIT_0;}/// /// Handle enumeration callback/// /// Process handle table/// Handle entry/// Handle value/// User context/// TRUE when desired handle is foundBOOLEAN BBHandleCallback(#if !defined(_WIN7_)    IN PHANDLE_TABLE HandleTable,#endif    IN PHANDLE_TABLE_ENTRY HandleTableEntry,    IN HANDLE Handle,    IN PVOID EnumParameter){    BOOLEAN result = FALSE;    ASSERT(EnumParameter);    if (EnumParameter != NULL)    {        PHANDLE_GRANT_ACCESS pAccess = (PHANDLE_GRANT_ACCESS)EnumParameter;        if (Handle == (HANDLE)pAccess->handle)        {            if (ExpIsValidObjectEntry(HandleTableEntry))            {                // Update access                HandleTableEntry->GrantedAccessBits = pAccess->access;                result = TRUE;            }            else            {            }        }    }#if !defined(_WIN7_)    // Release implicit locks    _InterlockedExchangeAdd8((char*)&HandleTableEntry->VolatileLowValue, 1);  // Set Unlocked flag to 1    if (HandleTable != NULL && HandleTable->HandleContentionEvent)        ExfUnblockPushLock(&HandleTable->HandleContentionEvent, NULL);#endif    return result;}/// /// Change handle granted access/// /// Request params/// Status codeNTSTATUS BBGrantAccess(IN PHANDLE_GRANT_ACCESS pAccess){    NTSTATUS status = STATUS_SUCCESS;    PEPROCESS pProcess = NULL;    status = PsLookupProcessByProcessId((HANDLE)pAccess->pid, &pProcess);    if (NT_SUCCESS(status) && BBCheckProcessTermination(pProcess))        status = STATUS_PROCESS_IS_TERMINATING;    if (NT_SUCCESS(status))    {        PHANDLE_TABLE pTable = *(PHANDLE_TABLE*)((PUCHAR)pProcess + 0x418);/*自己根据系统寻找每个EPROCESS的OBJECTTABLE偏移*/        BOOLEAN found = ExEnumHandleTable(pTable, &BBHandleCallback, pAccess, NULL);        if (found == FALSE)            status = STATUS_NOT_FOUND;    }    else    {    }    if (pProcess)        ObDereferenceObject(pProcess);    return status;}

使用方式同上。可以指定进程,然后指定这个进程的一个句柄,将这个句柄提权。

四丶效果图
windows内核提权,又一突破游戏进程保护的方法

可以看到 首先打印的HANDLE 然后进行首次关闭notepad. 因为保护驱动加载了,所以首次结束notepad是失败的。

然后尝试进行第二次结束notepad,此时会提示用户按任意键继续,在等待用户按任意键的时候先把提权驱动加载上,此时返回用户程序按任意键继续。

继续之后就会结束被保护的进程。

五 丶 突破游戏保护

本文以常规方式进行演示的,知道原理了那么自己突破应该明白了吧。(注入没有Open的权限Write的权限Virtual的权限,那么可以提权再用有权的句柄进行操作。。)

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
windows查看端口占用情况
windows查看端口占用情况

Windows端口可以认为是计算机与外界通讯交流的出入口。逻辑意义上的端口一般是指TCP/IP协议中的端口,端口号的范围从0到65535,比如用于浏览网页服务的80端口,用于FTP服务的21端口等等。怎么查看windows端口占用情况呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

808

2023.07.26

查看端口占用情况windows
查看端口占用情况windows

端口占用是指与端口关联的软件占用端口而使得其他应用程序无法使用这些端口,端口占用问题是计算机系统编程领域的一个常见问题,端口占用的根本原因可能是操作系统的一些错误,服务器也可能会出现端口占用问题。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

1129

2023.07.27

windows照片无法显示
windows照片无法显示

当我们尝试打开一张图片时,可能会出现一个错误提示,提示说"Windows照片查看器无法显示此图片,因为计算机上的可用内存不足",本专题为大家提供windows照片无法显示相关的文章,帮助大家解决该问题。

804

2023.08.01

windows查看端口被占用的情况
windows查看端口被占用的情况

windows查看端口被占用的情况的方法:1、使用Windows自带的资源监视器;2、使用命令提示符查看端口信息;3、使用任务管理器查看占用端口的进程。本专题为大家提供windows查看端口被占用的情况的相关的文章、下载、课程内容,供大家免费下载体验。

454

2023.08.02

windows无法访问共享电脑
windows无法访问共享电脑

在现代社会中,共享电脑是办公室和家庭的重要组成部分。然而,有时我们可能会遇到Windows无法访问共享电脑的问题。这个问题可能会导致数据无法共享,影响工作和生活的正常进行。php中文网给大家带来了相关的教程以及文章,欢迎大家前来阅读学习。

2355

2023.08.08

windows自动更新
windows自动更新

Windows操作系统的自动更新功能可以确保系统及时获取最新的补丁和安全更新,以提高系统的稳定性和安全性。然而,有时候我们可能希望暂时或永久地关闭Windows的自动更新功能。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

823

2023.08.10

windows boot manager
windows boot manager

windows boot manager无法开机的解决方法:1、系统文件损坏,使用Windows安装光盘或USB启动盘进入恢复环境,选择修复计算机,然后选择自动修复;2、引导顺序错误,进入恢复环境,选择命令提示符,输入命令"bootrec /fixboot"和"bootrec /fixmbr",然后重新启动计算机;3、硬件问题,使用硬盘检测工具进行扫描和修复;4、重装操作系统。本专题还提供其他解决

1647

2023.08.28

windows锁屏快捷键
windows锁屏快捷键

windows锁屏快捷键是Windows键+L、Ctrl+Alt+Del、Windows键+D、Windows键+P和Windows键+R。本专题为大家提供windows相关的文章、下载、课程内容,供大家免费下载体验。

1640

2023.08.30

C++ 设计模式与软件架构
C++ 设计模式与软件架构

本专题深入讲解 C++ 中的常见设计模式与架构优化,包括单例模式、工厂模式、观察者模式、策略模式、命令模式等,结合实际案例展示如何在 C++ 项目中应用这些模式提升代码可维护性与扩展性。通过案例分析,帮助开发者掌握 如何运用设计模式构建高质量的软件架构,提升系统的灵活性与可扩展性。

14

2026.01.30

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++教程
C++教程

共115课时 | 14.8万人学习

Java 教程
Java 教程

共578课时 | 53.6万人学习

Webpack4.x---十天技能课堂
Webpack4.x---十天技能课堂

共20课时 | 1.4万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号