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、运行效果

 

目录
相关文章
|
6月前
|
存储 缓存 NoSQL
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
Redis系列学习文章分享---第十三篇(Redis多级缓存--JVM进程缓存+Lua语法)
84 1
|
6月前
|
编解码 算法 程序员
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
老程序员分享:OpenGL学习进程(10)第七课:四边形绘制与动画基础
|
6月前
|
存储 数据安全/隐私保护 Windows
逆向学习Windows篇:进程句柄操作详解
逆向学习Windows篇:进程句柄操作详解
259 0
|
7月前
|
Java 调度
【JAVA学习之路 | 提高篇】进程与线程(Thread)
【JAVA学习之路 | 提高篇】进程与线程(Thread)
|
7月前
|
消息中间件 Unix Linux
Linux的学习之路:17、进程间通信(1)
Linux的学习之路:17、进程间通信(1)
61 1
|
7月前
|
自然语言处理 Java Linux
【Linux】开始学习进程替换吧!
通过学习进程替换,我们可以体会到多语言混搭的快乐,可以从C语言直接蹦到python ,也可以从c++里运行java代码。是不是很厉害!这是通过调度多个进程的效果,联系我们之前学习的进程,进程控制等概念。我们可以想要运行其他代码可以通过创建子进程来实现,但是这样也肯定是同一种语言,如果想要运行其他语言,那是不是有种方法可以调度一个进程来当做子进程呢??? 我们开始今天的学习吧!
43 0
|
5月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
5月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
192 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
4月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。