110,532
社区成员
发帖
与我相关
我的任务
分享
#ifdef __cplusplus
extern "C" {
#endif
#include <ntddk.h>
#include <wdm.h>
#include <string.h>
#include <windef.h>
#ifdef __cplusplus
}; // extern "C"
#endif
#include "HookNtCreateFile.h"
#ifdef __cplusplus
namespace {
#endif
PDRIVER_OBJECT pdoGlobalDrvObj = 0;
#ifdef __cplusplus
};
#endif
DWORD NtCreateFileIndex=0;
PDWORD isChange=0;
HANDLE hEvent=NULL;
typedef struct ServiceDescriptorTable
{
DWORD ServiceTableBase;
PVOID pvServiceCounterTable;
ULONG ulNumberOfServices;
PVOID pvParamTableBase;
}SSDT, *PSSDT;
extern "C" PSSDT KeServiceDescriptorTable;
typedef NTSTATUS (NTAPI *_RealNtCreateFile)(__out PHANDLE FileHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__out PIO_STATUS_BLOCK IoStatusBlock,
__in_opt PLARGE_INTEGER AllocationSize,
__in ULONG FileAttributes,
__in ULONG ShareAccess,
__in ULONG CreateDisposition,
__in ULONG CreateOptions,
__in_opt PVOID EaBuffer,
__in ULONG EaLength);
_RealNtCreateFile RealNtCreateFile;
NTSTATUS GetNtCreateFileIndex(VOID)
{
UNICODE_STRING usZwCreateFile;
RtlInitUnicodeString(&usZwCreateFile,L"ZwCreateFile");
DWORD ZwCreateFile_func= (DWORD)MmGetSystemRoutineAddress(&usZwCreateFile);
NtCreateFileIndex = *(DWORD*)(ZwCreateFile_func + 1);
KdPrint(("NtCreateFile 函数在SSDT表中的序号是: %x\n",NtCreateFileIndex));
RealNtCreateFile=(_RealNtCreateFile)(*(DWORD*)(KeServiceDescriptorTable->ServiceTableBase+NtCreateFileIndex*4));
KdPrint(("NtCreateFile 函数的地址是:%x",(DWORD)RealNtCreateFile));
return STATUS_SUCCESS;
}
NTSTATUS NTAPI MyNtCreateFile(__out PHANDLE FileHandle,
__in ACCESS_MASK DesiredAccess,
__in POBJECT_ATTRIBUTES ObjectAttributes,
__out PIO_STATUS_BLOCK IoStatusBlock,
__in_opt PLARGE_INTEGER AllocationSize,
__in ULONG FileAttributes,
__in ULONG ShareAccess,
__in ULONG CreateDisposition,
__in ULONG CreateOptions,
__in_opt PVOID EaBuffer,
__in ULONG EaLength)
{
UNICODE_STRING FilePath;
RtlInitUnicodeString(&FilePath,L"\\??\\C:\\1.txt");
if(!RtlCompareUnicodeString(&FilePath,ObjectAttributes->ObjectName,TRUE)) //如果是你指定的文件名则返回失败
{
KdPrint((ObjectAttributes->ObjectName->Buffer));
return STATUS_UNSUCCESSFUL;
}
return RealNtCreateFile(
FileHandle,
DesiredAccess,
ObjectAttributes,
IoStatusBlock,
AllocationSize,
FileAttributes,
ShareAccess,
CreateDisposition,
CreateOptions,
EaBuffer,
EaLength);
}
NTSTATUS HookNtCreateFile(VOID)
{
GetNtCreateFileIndex();
__asm
{
cli
mov eax, cr0
and eax, not 10000h
mov cr0, eax
}
*(DWORD*)(KeServiceDescriptorTable->ServiceTableBase+NtCreateFileIndex*4)=(DWORD)MyNtCreateFile;
__asm
{
mov eax, cr0
or eax, 10000h
mov cr0, eax
sti
}
if(*(DWORD*)(KeServiceDescriptorTable->ServiceTableBase+NtCreateFileIndex*4)==(DWORD)MyNtCreateFile)
return STATUS_SUCCESS;
else
return STATUS_UNSUCCESSFUL;
}
NTSTATUS UnHookNtCreateFile(VOID)
{
__asm
{
cli
mov eax, cr0
and eax, not 10000h
mov cr0, eax
}
if(RealNtCreateFile)
{
*(DWORD*)(KeServiceDescriptorTable->ServiceTableBase+NtCreateFileIndex*4)=(DWORD)RealNtCreateFile;
KdPrint(("NtCreateFile Restored!\n"));
}
__asm
{
mov eax, cr0
or eax, 10000h
mov cr0, eax
sti
}
if(RealNtCreateFile)
{
return STATUS_SUCCESS;
}
else
{
return STATUS_UNSUCCESSFUL;
}
}
NTSTATUS HOOKNTCREATEFILE_DispatchCreateClose(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
NTSTATUS status = STATUS_SUCCESS;
Irp->IoStatus.Status = status;
Irp->IoStatus.Information = 0;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
NTSTATUS HOOKNTCREATEFILE_DispatchDeviceControl(
IN PDEVICE_OBJECT DeviceObject,
IN PIRP Irp
)
{
NTSTATUS status = STATUS_SUCCESS;
PIO_STACK_LOCATION irpSp = IoGetCurrentIrpStackLocation(Irp);
PVOID InBuffer,OutBuffer;
InBuffer = OutBuffer = (PCHAR)Irp->AssociatedIrp.SystemBuffer;
ULONG uOutSize=irpSp->Parameters.DeviceIoControl.OutputBufferLength;
//isChange=(DWORD*)MmMapIoSpace(MmGetPhysicalAddress((void*)(*(DWORD*)InBuffer)),4,MmNonCached);
switch(irpSp->Parameters.DeviceIoControl.IoControlCode)
{
case IOCTL_HOOKNTCREATEFILE_OPERATION:
// status = SomeHandlerFunction(irpSp);
if(HookNtCreateFile()==STATUS_SUCCESS)
{
CHAR cInfo[] = "Hook NtCreateFile成功了";
int cInfoLen = strlen(cInfo)+1;
memcpy(OutBuffer,cInfo,cInfoLen);
Irp->IoStatus.Status = STATUS_SUCCESS;
}
break;
default:
Irp->IoStatus.Status = STATUS_INVALID_DEVICE_REQUEST;
Irp->IoStatus.Information = 0;
break;
}
if(status==STATUS_SUCCESS)
Irp->IoStatus.Information=uOutSize;
else
Irp->IoStatus.Information=0;
status = Irp->IoStatus.Status;
IoCompleteRequest(Irp, IO_NO_INCREMENT);
return status;
}
VOID HOOKNTCREATEFILE_DriverUnload(
IN PDRIVER_OBJECT DriverObject
)
{
UnHookNtCreateFile();
ZwClose(hEvent);
PDEVICE_OBJECT pdoNextDeviceObj = pdoGlobalDrvObj->DeviceObject;
IoDeleteSymbolicLink(&usSymlinkName);
while(pdoNextDeviceObj)
{
PDEVICE_OBJECT pdoThisDeviceObj = pdoNextDeviceObj;
pdoNextDeviceObj = pdoThisDeviceObj->NextDevice;
IoDeleteDevice(pdoThisDeviceObj);
}
}
#ifdef __cplusplus
extern "C" {
#endif
NTSTATUS DriverEntry(
IN OUT PDRIVER_OBJECT DriverObject,
IN PUNICODE_STRING RegistryPath
)
{
PDEVICE_OBJECT pdoDeviceObj = 0;
NTSTATUS status = STATUS_UNSUCCESSFUL;
pdoGlobalDrvObj = DriverObject;
if(!NT_SUCCESS(status = IoCreateDevice(
DriverObject,
0,
&usDeviceName,
FILE_DEVICE_UNKNOWN,
FILE_DEVICE_SECURE_OPEN,
FALSE,
&pdoDeviceObj
)))
{
return status;
};
if(!NT_SUCCESS(status = IoCreateSymbolicLink(
&usSymlinkName,
&usDeviceName
)))
{
IoDeleteDevice(pdoDeviceObj);
return status;
}
DriverObject->MajorFunction[IRP_MJ_CREATE] =
DriverObject->MajorFunction[IRP_MJ_CLOSE] = HOOKNTCREATEFILE_DispatchCreateClose;
DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = HOOKNTCREATEFILE_DispatchDeviceControl;
DriverObject->DriverUnload = HOOKNTCREATEFILE_DriverUnload;
return STATUS_SUCCESS;
}
#ifdef __cplusplus
}; // extern "C"
#endif