驱动保护 -- 通过PID保护指定进程

简介: 驱动保护 -- 通过PID保护指定进程

一、设计界面

1、添加一个编辑框输入要保护的进程PID,并添加两个按钮,一个保护进程,一个解除保护

2、右击编辑框,添加变量

二、驱动层代码实现

1、声明一个受保护的进程PID数组

static UINT32 受保护的进程PID[256] = { 0 };

2、添加PID到保护函数

void 添加PID到保护(UINT32 pid) 
{
  for (size_t i = 0; i < 256; i++)
  {
    if (受保护的进程PID[i]==0|| 受保护的进程PID[i]==pid)
    {
      受保护的进程PID[i] = pid;
      break;
    }
  }
}

3、删除PID保护函数

void 删除PID保护(UINT32 pid)
{
  for (size_t i = 0; i < 256; i++)
  {
    if (受保护的进程PID[i] == pid)
    {
      受保护的进程PID[i] = 0;
      break;
    }
  }
}

4、清空PID保护函数

void 清空PID保护()
{
  memset(受保护的进程PID, 0, sizeof(受保护的进程PID));
}

5、PID是否受保护函数

BOOLEAN PID是否受保护(UINT32 pid)
{
  for (size_t i = 0; i < 256; i++)
  {
    if (pid==0)
    {
      return 0;
    }
    if (受保护的进程PID[i] == pid)
    {
      return TRUE;
    }
  }
  return FALSE;
}

6、将函数在头文件声明一下

void 添加PID到保护(UINT32 pid);
void 删除PID保护(UINT32 pid);
void 清空PID保护();
int PID是否受保护(UINT32 pid);

7、获取PID

UINT32 当前进程PID = PsGetCurrentProcessId();
    HANDLE PID = PsGetProcessId((PEPROCESS)OperationInformation->Object);
    if (PID是否受保护(PID)==1)
    {
    DbgPrint("nxyn:sys pEPROCESS=%p ", OperationInformation->Object);
     DbgPrint("nxyn:被保护的PID:%d \n", PID);
      ACCESS_MASK 获取权限 = OperationInformation->Parameters->CreateHandleInformation.OriginalDesiredAccess;
      ACCESS_MASK 获取新权限 = OperationInformation->Parameters->CreateHandleInformation.DesiredAccess;//将句柄权限清零
      //让结束进程的功能失效
      获取权限 &= ~PROCESS_TERMINATE;
      获取权限 &= ~PROCESS_VM_OPERATION;
      获取权限 &= ~PROCESS_VM_WRITE;
      获取权限 &= ~PROCESS_VM_READ;
      //返回我们修改过的权限 OpenProcess
      OperationInformation->Parameters->CreateHandleInformation.DesiredAccess = 获取权限;
      DbgPrint("nxyn:获取权限=%X 获取新权限=%X", 获取权限, 获取新权限);
    }

8、添加控制码

#define irp添加PID到保护   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804,     METHOD_BUFFERED,FILE_ANY_ACCESS)
#define irp删除PID保护   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805,     METHOD_BUFFERED,FILE_ANY_ACCESS)

9、通过控制码实现添加和删除保护

else if (控制码== irp添加PID到保护)
    {
      IRP添加PID到保护(IRP指针);
    }
    else if (控制码 == irp删除PID保护)
    {
      IRP删除PID保护(IRP指针);
    }

10、添加和删除的代码具体实现

void IRP添加PID到保护(PIRP IRP指针)
{  
  int* 缓冲区 = (int*)IRP指针->AssociatedIrp.SystemBuffer;
  int 计算结果 = 0;
  if (缓冲区)
  {
    UINT32* pPID = (UINT32*)缓冲区;
    UINT32 pid = pPID[0];
    添加PID到保护(pid);
    IRP指针->IoStatus.Information = sizeof(int);//设置操作的字节数
    IRP指针->IoStatus.Status = STATUS_SUCCESS;//返回状态
    IoCompleteRequest(IRP指针, IO_NO_INCREMENT);//完成一个IRP请求
    KdPrint(("nxyn:PID已添加到保护"));
  }
}
void IRP删除PID保护(PIRP IRP指针)
{
  int* 缓冲区 = (int*)IRP指针->AssociatedIrp.SystemBuffer;
  int 计算结果 = 0;
  if (缓冲区)
  {
    UINT32* pPID = (UINT32*)缓冲区;
    UINT32 pid = pPID[0];
    删除PID保护(pid);
    IRP指针->IoStatus.Information = sizeof(int);//设置操作的字节数
    IRP指针->IoStatus.Status = STATUS_SUCCESS;//返回状态
    IoCompleteRequest(IRP指针, IO_NO_INCREMENT);//完成一个IRP请求
    KdPrint(("nxyn:PID已删除保护"));
  }
}

三、应用层代码实现

1、添加控制码

#define irp添加PID到保护   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x804,     METHOD_BUFFERED,FILE_ANY_ACCESS)
#define irp删除PID保护   CTL_CODE(FILE_DEVICE_UNKNOWN, 0x805,     METHOD_BUFFERED,FILE_ANY_ACCESS)

2、双击保护进程按钮

UpdateData(TRUE);//将窗口的数据更新到变量
  char 缓存区[256];
  sprintf_s(缓存区, "nxyn:应用程序保护PID控制码为%X\n", irp添加PID到保护);
  OutputDebugStringA(缓存区);
  UINT32 输入数据 = m_PID;
  int 返回数据;
  DWORD 实际读取字节数;
  DeviceIoControl(
    设备句柄,
    irp添加PID到保护,
    &输入数据,
    sizeof(输入数据),
    &返回数据,
    sizeof(返回数据),
    &实际读取字节数,
    NULL);

3、双击解除进程保护按钮

UpdateData(TRUE);//将窗口的数据更新到变量
  char 缓存区[256];
  sprintf_s(缓存区, "nxyn:应用程序删除PID控制码为%X\n", irp删除PID保护);
  OutputDebugStringA(缓存区);
  UINT32 输入数据 = m_PID;
  int 返回数据;
  DWORD 实际读取字节数;
  DeviceIoControl(
    设备句柄,
    irp删除PID保护,
    &输入数据,
    sizeof(输入数据),
    &返回数据,
    sizeof(返回数据),
    &实际读取字节数,
    NULL);

四、测试应用


目录
相关文章
|
8月前
|
Linux Shell
【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
【Linux】解决:为什么重复创建同一个【进程pid会变化,而ppid父进程id不变?】
|
8月前
驱动保护 -- 通过PID保护指定进程
驱动保护 -- 通过PID保护指定进程
77 0
驱动保护 -- 通过PID保护指定进程
|
8月前
2023驱动保护学习 -- 通过驱动保护进程
2023驱动保护学习 -- 通过驱动保护进程
50 0
|
8月前
|
监控 Unix Linux
C语言进程(第一章进程基础,fork()函数,pid_t, pid, getpid())
C语言进程(第一章进程基础,fork()函数,pid_t, pid, getpid())
385 0
|
SQL Windows
Windows 下80端口被进程 System & PID=4 占用的解决方法
Windows 下80端口被进程 System & PID=4 占用的解决方法
862 0
|
7月前
|
监控 Linux 应用服务中间件
探索Linux中的`ps`命令:进程监控与分析的利器
探索Linux中的`ps`命令:进程监控与分析的利器
146 13
|
6月前
|
运维 关系型数据库 MySQL
掌握taskset:优化你的Linux进程,提升系统性能
在多核处理器成为现代计算标准的今天,运维人员和性能调优人员面临着如何有效利用这些处理能力的挑战。优化进程运行的位置不仅可以提高性能,还能更好地管理和分配系统资源。 其中,taskset命令是一个强大的工具,它允许管理员将进程绑定到特定的CPU核心,减少上下文切换的开销,从而提升整体效率。
掌握taskset:优化你的Linux进程,提升系统性能
|
6月前
|
弹性计算 Linux 区块链
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
203 4
Linux系统CPU异常占用(minerd 、tplink等挖矿进程)
|
5月前
|
算法 Linux 调度
探索进程调度:Linux内核中的完全公平调度器
【8月更文挑战第2天】在操作系统的心脏——内核中,进程调度算法扮演着至关重要的角色。本文将深入探讨Linux内核中的完全公平调度器(Completely Fair Scheduler, CFS),一个旨在提供公平时间分配给所有进程的调度器。我们将通过代码示例,理解CFS如何管理运行队列、选择下一个运行进程以及如何对实时负载进行响应。文章将揭示CFS的设计哲学,并展示其如何在现代多任务计算环境中实现高效的资源分配。
下一篇
开通oss服务