2023驱动保护学习 -- 通过驱动保护进程

简介: 2023驱动保护学习 -- 通过驱动保护进程

1、头文件源码,把涉及到的进程权限的常量值都添加进去

#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)  
void 安装进程保护();
void 卸载进程保护();
void 签名绕过(PDRIVER_OBJECT pDriverObj);

2、源文件

#include <ntifs.h>
#include "驱动保护.h"
OB_PREOP_CALLBACK_STATUS
回调函数(
  PVOID RegistrationContext,
  POB_PRE_OPERATION_INFORMATION OperationInformation
)
{
  DbgPrint("nxyn:sys pEPROCESS=%p ", OperationInformation->Object);
  if (OperationInformation->KernelHandle)
  {
    //内核创建
  }
  else
  {
    //用户层
    ACCESS_MASK 获取权限 = OperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess;
    ACCESS_MASK 获取新权限 = OperationInformation->Parameters->CreateHandleInformation.DesiredAccess;//将句柄权限清零
    //让结束进程的功能失效
    获取权限 &= ~PROCESS_TERMINATE; 
    //返回我们修改过的权限 OpenProcess
    OperationInformation->Parameters->CreateHandleInformation.DesiredAccess = 获取权限;
    DbgPrint("nxyn:获取权限=%X 获取新权限=%X", 获取权限, 获取新权限);
  }
  return OB_PREOP_SUCCESS;
};
HANDLE 返回句柄 = NULL;//用来存放返回的句柄  以方便卸载对应功能
void 安装内存保护()
{
  OB_CALLBACK_REGISTRATION 回调例程信息 = { 0 };
  OB_OPERATION_REGISTRATION 接收已注册回调例程 = { 0 };
  RtlInitUnicodeString(&回调例程信息.Altitude, L"321000");//指定驱动程序Altitude的Unicode字符串及长度
  回调例程信息.RegistrationContext = NULL;//可以传递给回调例程,这里用不到,暂时为null
  回调例程信息.Version = OB_FLT_REGISTRATION_VERSION;// 请求对象回调注册版本ObGetFilterVersion(); 
  回调例程信息.OperationRegistrationCount = 1;//注册数组的数目
  回调例程信息.OperationRegistration = &接收已注册回调例程;//可以理解为返回值
  接收已注册回调例程.ObjectType = PsProcessType; //拦截的是进程还是线程PsThreadType
  接收已注册回调例程.Operations = OB_OPERATION_HANDLE_CREATE;//创建操作句柄
  接收已注册回调例程.PostOperation = NULL;
  接收已注册回调例程.PreOperation = 回调函数;
  ObRegisterCallbacks(&回调例程信息, &返回句柄); // 注册该函数
  KdPrint(("nxyn:安装内存保护 返回句柄=%p", 返回句柄));
}
void 卸载内存保护()
{
  if (返回句柄)
  {
    ObUnRegisterCallbacks(返回句柄);
  }
  DbgPrint("nxyn:卸载内存保护");
}
void 签名绕过(PDRIVER_OBJECT pDriverObj)
{
  typedef struct _LDR_DATA
  {
    struct _LIST_ENTRY InLoadOrderLinks;
    struct _LIST_ENTRY InMemoryOrderLinks;
    struct _LIST_ENTRY InInitializationOrderLinks;
    VOID* DllBase;
    VOID* EntryPoint;
    ULONG32      SizeOfImage;
    UINT8        _PADDING0_[0x4];
    struct _UNICODE_STRING FullDllName;
    struct _UNICODE_STRING BaseDllName;
    ULONG32      Flags;
  }LDR_DATA, * PLDR_DATA;
  PLDR_DATA ldr;
  ldr = (PLDR_DATA)(pDriverObj->DriverSection);
  ldr->Flags |= 0x20;
}

3、入口函数调用

签名绕过(驱动对象);
  安装内存保护();

4、卸载驱动的时候卸载内存保护

void 卸载驱动回调函数(PDRIVER_OBJECT 驱动对象)
{
  卸载内存保护();
  删除设备(驱动对象);
  KdPrint(("nxyn:我被卸载了,驱动编号=%p", 驱动对象));
}

5、运行效果

 

目录
相关文章
|
1月前
|
Linux C语言 C++
C/C++进程超详细详解【下部分】(系统性学习day8)
C/C++进程超详细详解【下部分】(系统性学习day8)
|
1月前
|
消息中间件 Linux API
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
C/C++ 进程间通信system V IPC对象超详细讲解(系统性学习day9)
|
7天前
|
消息中间件 Unix Linux
Linux的学习之路:17、进程间通信(1)
Linux的学习之路:17、进程间通信(1)
21 1
|
7天前
|
存储 安全 Linux
Linux的学习之路:9、冯诺依曼与进程(1)
Linux的学习之路:9、冯诺依曼与进程(1)
18 0
|
1月前
|
消息中间件 Unix Linux
C/C++进程超详细详解【中部分】(系统性学习day07)
C/C++进程超详细详解【中部分】(系统性学习day07)
|
1月前
|
Shell Linux API
C/C++进程超详细详解【上部分】(系统性学习day06)
C/C++进程超详细详解【上部分】(系统性学习day06)
|
3月前
驱动保护 -- 通过PID保护指定进程
驱动保护 -- 通过PID保护指定进程
24 0
驱动保护 -- 通过PID保护指定进程
|
1月前
|
消息中间件 Linux 调度
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
【Linux 进程/线程状态 】深入理解Linux C++中的进程/线程状态:阻塞,休眠,僵死
73 0
|
6天前
|
NoSQL Linux 程序员
【linux进程信号(一)】信号的概念以及产生信号的方式
【linux进程信号(一)】信号的概念以及产生信号的方式
|
6天前
|
Java Shell Linux
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?
【linux进程控制(三)】进程程序替换--如何自己实现一个bash解释器?