驱动代码
#include <ntifs.h>
#include <wdm.h>
#include <ntddk.h>
#define HIDE CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define SHOW CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ANY_ACCESS)
PDEVICE_OBJECT devObj;
UNICODE_STRING symbolLink;
NTSTATUS DEVICE_CONTROL_Dispatch(PDEVICE_OBJECT pDevObj, PIRP pIrp);
NTSTATUS DEVICE_CREATE_Dispatch(PDEVICE_OBJECT pDevObj, PIRP pIrp);
NTSTATUS DEVICE_CLOSE_Dispatch(PDEVICE_OBJECT pDevObj, PIRP pIrp);
PULONG DebugPort = NULL;
HANDLE hThread;
BOOLEAN flag = 1;
VOID DriverUnload(PDRIVER_OBJECT pDriver)
{
IoDeleteSymbolicLink(&symbolLink);
IoDeleteDevice(devObj);
DbgPrint("卸载成功!!!\n");
}
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegPath)
{
try {
pDriver->DriverUnload = DriverUnload;
UNICODE_STRING deviceName;
RtlInitUnicodeString(&deviceName,L"\\Device\\firstDevice");
NTSTATUS status = IoCreateDevice(
pDriver,
0,
&deviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&devObj
);
DbgPrint("创建设备 : %d~~\n", status);
RtlInitUnicodeString(&symbolLink,L"\\??\\MYKILLTOOL");
IoCreateSymbolicLink(&symbolLink,&deviceName);
pDriver->Flags |= DO_BUFFERED_IO;
pDriver->MajorFunction[IRP_MJ_CREATE] = DEVICE_CREATE_Dispatch;
pDriver->MajorFunction[IRP_MJ_CLOSE] = DEVICE_CLOSE_Dispatch;
pDriver->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DEVICE_CONTROL_Dispatch;
} __except(EXCEPTION_EXECUTE_HANDLER) {
DbgPrint("run error~~\n");
return STATUS_SUCCESS;
}
return STATUS_SUCCESS;
}
VOID HideThread(_In_ PVOID StartContext)
{
while (flag)
{
*DebugPort = 0;
}
}
NTSTATUS DEVICE_CONTROL_Dispatch(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
UINT32 DATA;
NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
PIO_STACK_LOCATION psLocation = IoGetCurrentIrpStackLocation(pIrp);
ULONG code = psLocation->Parameters.DeviceIoControl.IoControlCode;
PVOID bufferAddress = pIrp->AssociatedIrp.SystemBuffer;
ULONG threeLength = psLocation->Parameters.DeviceIoControl.InputBufferLength;
ULONG zeroLength = psLocation->Parameters.DeviceIoControl.OutputBufferLength;
PETHREAD peprocess;
switch (code)
{
case HIDE:
RtlMoveMemory(&DATA, bufferAddress,4);
if (PsLookupProcessByProcessId((HANDLE)DATA,&peprocess) == STATUS_SUCCESS)
{
DbgPrint("PID : %d ,目前 EPROCESS 地址为:%08x\n", DATA, peprocess);
DebugPort = (ULONG*)((ULONG)peprocess + 0xbc);
PsCreateSystemThread(&hThread, GENERIC_ALL, NULL, NULL, NULL, HideThread, NULL);
DbgPrint("执行成功!!!");
break;
}
else
{
status = STATUS_INVALID_HANDLE;
}
break;
case SHOW:
flag = 0;
break;
default:
break;
}
DbgPrint("3环发送的数据长度 %d~~\n", threeLength);
DbgPrint("0环发送的数据长度 %d~~\n", zeroLength);
pIrp->IoStatus.Status = status;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS DEVICE_CREATE_Dispatch(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
DbgPrint("CREATE SUCCESS~~\n");
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp,IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
NTSTATUS DEVICE_CLOSE_Dispatch(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
DbgPrint("CLOSE SUCCESS~~\n");
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return STATUS_SUCCESS;
}
3环代码
#include "stdafx.h"
#include <windows.h>
#include <winioctl.h>
#include <stdlib.h>
#define HIDE CTL_CODE(FILE_DEVICE_UNKNOWN,0x800,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define SHOW CTL_CODE(FILE_DEVICE_UNKNOWN,0x801,METHOD_BUFFERED,FILE_ANY_ACCESS)
#define SYMBOL_LINK_NAME L"\\\\.\\MYKILLTOOL"
int main(int argc, char* argv[])
{
HANDLE h_device = CreateFileW(
SYMBOL_LINK_NAME,
GENERIC_READ | GENERIC_WRITE,
0,
0,
OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL,
NULL);
if (h_device == INVALID_HANDLE_VALUE)
{
printf("访问驱动符号链接失败!\n");
system("pause");
return 0;
}
DWORD pid;
DWORD outBuffer;
DWORD lbret = 0;
printf("请输入需要反调试的进程的PID : \n");
scanf("%d",&pid);
if (DeviceIoControl(h_device,HIDE,&pid,sizeof(DWORD),&outBuffer,sizeof(outBuffer),&lbret,NULL))
{
printf("hide process %08x success , please test......\n",pid);
}
system("pause");
if (DeviceIoControl(h_device,SHOW,&pid,sizeof(DWORD),&outBuffer,sizeof(outBuffer),&lbret,NULL))
{
printf("show process %08x success , please test......\n",pid);
}
system("pause");
CloseHandle(h_device);
return 0;
}