一、设计界面
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);
四、测试应用