|
这个可以干什么就不多说了,自己琢磨吧。。。
======
核心驱动代码:
#include <ntddk.h>
#define DEVICE_NAME L"\\Device\\MySystemDebugControl" //Driver Name
#define LINK_NAME L"\\DosDevices\\MySystemDebugControl" //Link Name
#define IOCTL_BASE 0x800
#define TEMPLATE_CTL_CODE(i) \
CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_BASE+i, METHOD_BUFFERED, FILE_ANY_ACCESS)
#define IOCTL_SET_ADDRESS TEMPLATE_CTL_CODE(1)
#define IOCTL_ReadKernelMemory TEMPLATE_CTL_CODE(2)
#define IOCTL_WriteKernelMemory TEMPLATE_CTL_CODE(3)
#define IOCTL_GetEmptySubAddress TEMPLATE_CTL_CODE(4)
#define IOCTL_ClearEmptySub TEMPLATE_CTL_CODE(5)
#define IOCTL_CallEmptySub TEMPLATE_CTL_CODE(6)
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString);
NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp);
NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp);
VOID DriverUnload(PDRIVER_OBJECT pDriverObj);
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp);
static KIRQL OldIrql;
ULONG EmptySubAddr=0;
VOID WpOffAndToDpcLevel();
VOID WpOn();
VOID EmptySub();
NTSTATUS ReadKernelMemory(PVOID Address, ULONG Size, PVOID OutBuffer);
NTSTATUS WriteKernelMemory(PVOID Address, ULONG Size, PVOID InBuffer);
PVOID AddressSet = 0;
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
NTSTATUS status = STATUS_SUCCESS;
UNICODE_STRING ustrLinkName;
UNICODE_STRING ustrDevName;
PDEVICE_OBJECT pDevObj;
DbgPrint("Drv DriverEntry: %S\n",pRegistryString->Buffer);
// Create dispatch points for device control, create, close.
pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
pDriverObj->DriverUnload = DriverUnload;
RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
status = IoCreateDevice(pDriverObj,
0,
&ustrDevName,
FILE_DEVICE_UNKNOWN,
0,
FALSE,
&pDevObj);
DbgPrint("Drv Device Name %S",ustrDevName.Buffer);
if(!NT_SUCCESS(status))
{
DbgPrint("Drv IoCreateDevice = 0x%x\n", status);
return status;
}
RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);
if(!NT_SUCCESS(status))
{
DbgPrint("Drv IoCreateSymbolicLink = 0x%x\n", status);
IoDeleteDevice(pDevObj);
return status;
}
DbgPrint("Drv SymbolicLink:%S",ustrLinkName.Buffer);
EmptySubAddr=(ULONG)EmptySub;
DbgPrint("EmptySub Address=%x",EmptySubAddr);
return STATUS_SUCCESS;
}
NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;
PIO_STACK_LOCATION pIrpStack;
ULONG uIoControlCode;
PVOID pIoBuffer;
ULONG uInSize;
ULONG uOutSize;
pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
uIoControlCode = pIrpStack->;Parameters.DeviceIoControl.IoControlCode;
pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;
uInSize = pIrpStack->;Parameters.DeviceIoControl.InputBufferLength;
uOutSize = pIrpStack->;Parameters.DeviceIoControl.OutputBufferLength;
switch(uIoControlCode)
{
//设置地址
case IOCTL_SET_ADDRESS:
{
__try
{
AddressSet = *(PVOID *)pIoBuffer;
DbgPrint("Add:%d",AddressSet);
status = STATUS_SUCCESS;
}
__except (EXCEPTION_EXECUTE_HANDLER)
{
status = GetExceptionCode();
break;
}
}break;
//读内核内存
case IOCTL_ReadKernelMemory:
{
DbgPrint("Read Add:%d",AddressSet);
status = ReadKernelMemory(AddressSet, uOutSize, pIoBuffer);
AddressSet = 0;
break;
}
//写内核内存
case IOCTL_WriteKernelMemory:
{
DbgPrint("Write Add:%d",AddressSet);
status = WriteKernelMemory(AddressSet, uInSize, pIoBuffer);
AddressSet = 0;
break;
}
//得到空函数地址
case IOCTL_GetEmptySubAddress:
{
EmptySubAddr=(ULONG)EmptySub;
memcpy(pIoBuffer, &EmptySubAddr, sizeof(ULONG));
status = STATUS_SUCCESS;
break;
}
//清空空白函数
case IOCTL_ClearEmptySub:
{
memset((PVOID)(EmptySubAddr+2), 0x90, 256);
break;
}
//调用空白函数
case IOCTL_CallEmptySub:
{
EmptySub();
break;
}
}
if(status == STATUS_SUCCESS)
pIrp->IoStatus.Information = uOutSize;
else
pIrp->IoStatus.Information = 0;
pIrp->IoStatus.Status = status;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
return status;
}
VOID DriverUnload(PDRIVER_OBJECT pDriverObj)
{
UNICODE_STRING strLink;
RtlInitUnicodeString(&strLink, LINK_NAME);
IoDeleteSymbolicLink(&strLink);
IoDeleteDevice(pDriverObj->DeviceObject);
DbgPrint("Driver Unloaded\n");
}
NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DbgPrint("Driver IRP_MJ_CREATE\n");
return STATUS_SUCCESS;
}
NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp)
{
pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;
IoCompleteRequest(pIrp, IO_NO_INCREMENT);
DbgPrint("Driver IRP_MJ_CLOSEE\n");
return STATUS_SUCCESS;
}
VOID WpOffAndToDpcLevel()
{
OldIrql = KeRaiseIrqlToDpcLevel();
__asm
{
cli
push eax
mov eax, cr0
and eax, 0FFFEFFFFh
mov cr0, eax
pop eax
}
}
VOID WpOn()
{
__asm
{
push eax
mov eax, cr0
or eax, 10000h
mov cr0, eax
pop eax
sti
}
KeLowerIrql(OldIrql);
}
NTSTATUS ReadKernelMemory(PVOID Address, ULONG Size, PVOID OutBuffer)
{
NTSTATUS st = STATUS_UNSUCCESSFUL;
PMDL pMdl = 0;
PVOID pAddress = 0;
if (!Address) return st;
pMdl = IoAllocateMdl(Address, Size, FALSE, FALSE, 0);
if (pMdl)
{
MmBuildMdlForNonPagedPool(pMdl);
pAddress = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
if (pAddress)
{
__try
{
RtlCopyMemory(OutBuffer, pAddress, Size);
st = STATUS_SUCCESS;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
}
IoFreeMdl(pMdl);
}
return st;
}
NTSTATUS WriteKernelMemory(PVOID Address, ULONG Size, PVOID InBuffer)
{
NTSTATUS st = STATUS_UNSUCCESSFUL;
PMDL pMdl = 0;
PVOID pAddress = 0;
KSPIN_LOCK spinlock;
KIRQL oldirql;
if (!Address) return st;
pMdl = IoAllocateMdl(Address, Size, FALSE, FALSE, 0);
if (pMdl)
{
MmBuildMdlForNonPagedPool(pMdl);
pAddress = MmGetSystemAddressForMdlSafe(pMdl, NormalPagePriority);
if (pAddress)
{
__try
{
KeInitializeSpinLock(&spinlock);
KeAcquireSpinLock(&spinlock,&oldirql);
WpOffAndToDpcLevel();
RtlCopyMemory(pAddress, InBuffer, Size);
WpOn();
KeReleaseSpinLock(&spinlock, oldirql);
st = STATUS_SUCCESS;
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
}
}
IoFreeMdl(pMdl);
}
return st;
}
VOID EmptySub()
{
_asm
{
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
nop
}
} |
|