|
本帖最后由 HoviDelphic 于 2010-3-7 01:12 编辑
核心源码来自互联网,能让PxNxxx和IxxLxxxx无法正常工作。
BanCrtPT.c
- #include "BanCrtPT.h"
- #include "dbghelp.h"
- #include <windef.h>
- NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObject, PUNICODE_STRING pRegString);
- NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObject, PIRP pIrp);
- NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObject, PIRP pIrp);
- VOID DriverUnload(PDRIVER_OBJECT pDrvObject);
- NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObject, PIRP pIrp);
- HANDLE FileHandle;
- VOID OccupyFileTest()
- {
- NTSTATUS ntStatus;
- OBJECT_ATTRIBUTES ObjectAttributes;
- UNICODE_STRING UniFileName;
- IO_STATUS_BLOCK IoStatusBlock;
- PCWSTR FileName = L"\\??\\C:\\WINDOWS\\system32\\ntkrnlpa.exe";
- RtlInitUnicodeString(&UniFileName , FileName);
- InitializeObjectAttributes(&ObjectAttributes,&UniFileName,OBJ_CASE_INSENSITIVE | OBJ_KERNEL_HANDLE,NULL,NULL);
- ntStatus=ZwCreateFile(&FileHandle,GENERIC_READ,&ObjectAttributes,&IoStatusBlock,0,FILE_ATTRIBUTE_NORMAL,0,FILE_OPEN_IF,FILE_NON_DIRECTORY_FILE,NULL,0);
- if(!NT_SUCCESS(ntStatus))
- {
- DbgPrint("[OccupyFile] = %d", ntStatus);
- }
- else
- {
- DbgPrint("[OccupyFile] Success.");
- }
- }
- NTSTATUS DriverEntry(PDRIVER_OBJECT pDrvObject, PUNICODE_STRING pRegString)
- {
- NTSTATUS status = STATUS_SUCCESS;
- UNICODE_STRING ustrLinkName;
- UNICODE_STRING ustrDevName;
- PDEVICE_OBJECT pDevObject;
- //
- dprintf("[OccupyFile] DriverEntry: %S\n",pRegString->Buffer);
- //
- pDrvObject->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;
- pDrvObject->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;
- pDrvObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
- pDrvObject->DriverUnload = DriverUnload;
- //
- RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);
- //
- status = IoCreateDevice(pDrvObject,
- 0,
- &ustrDevName,
- FILE_DEVICE_UNKNOWN,
- 0,
- FALSE,
- &pDevObject);
- //
- dprintf("[OccupyFile] Device Name %S",ustrDevName.Buffer);
-
- if(!NT_SUCCESS(status))
- {
- dprintf("[OccupyFile] IoCreateDevice = 0x%x\n", status);
- return status;
- }
- //
- RtlInitUnicodeString(&ustrLinkName, LINK_NAME);
- //
- status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName);
- if(!NT_SUCCESS(status))
- {
- dprintf("[OccupyFile] IoCreateSymbolicLink = 0x%x\n", status);
- IoDeleteDevice(pDevObject);
- return status;
- }
- dprintf("[OccupyFile] SymbolicLink:%S",ustrLinkName.Buffer);
- //
- //OccupyFileTest();
- return STATUS_SUCCESS;
- }
- VOID DriverUnload(PDRIVER_OBJECT pDrvObject)
- {
- UNICODE_STRING strLink;
- RtlInitUnicodeString(&strLink, LINK_NAME);
- IoDeleteSymbolicLink(&strLink);
- IoDeleteDevice(pDrvObject->DeviceObject);
- //
- //ZwClose(FileHandle);
- dprintf("[OccupyFile] Unloaded\n");
- }
- NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObject, PIRP pIrp)
- {
- pIrp->IoStatus.Status = STATUS_SUCCESS;
- pIrp->IoStatus.Information = 0;
- dprintf("[OccupyFile] IRP_MJ_CREATE\n");
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return STATUS_SUCCESS;
- }
- NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObject, PIRP pIrp)
- {
- pIrp->IoStatus.Status = STATUS_SUCCESS;
- pIrp->IoStatus.Information = 0;
- dprintf("[OccupyFile] IRP_MJ_CLOSE\n");
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return STATUS_SUCCESS;
- }
- NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObject, 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_StartOF:
- {
- OccupyFileTest();
- status = STATUS_SUCCESS;
- break;
- }
- case IOCTL_EndOF:
- {
- ZwClose(FileHandle);
- status = STATUS_SUCCESS;
- 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;
- }
复制代码
BanCrtPT.h
- #include <devioctl.h>
- #ifndef _INLINEOBREFERENCEOBJECTBYHANDLE_H
- #define _INLINEOBREFERENCEOBJECTBYHANDLE_H 1
- //============================================
- #define DEVICE_NAME L"\\Device\\devOccupyFile" //Driver Name
- #define LINK_NAME L"\\DosDevices\\OccupyFile" //Link Name
- //============================================
- #define IOCTL_BASE 0x800
- #define MY_CTL_CODE(i) \
- CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_BASE+i, METHOD_BUFFERED, FILE_ANY_ACCESS)
- #define IOCTL_StartOF MY_CTL_CODE(1) //开始独占
- #define IOCTL_EndOF MY_CTL_CODE(2) //停止独占
- //============================================
- #endif
复制代码
dbghelp.h
- #ifndef _DBGHELP_H
- #define _DBGHELP_H 1
- #include <ntddk.h>
- #define dprintf if (DBG) DbgPrint
- #define nprintf DbgPrint
- #define kmalloc(_s) ExAllocatePoolWithTag(NonPagedPool, _s, 'SYSQ')
- //#define kfree(_p) ExFreePoolWithTag(_p, 'SYSQ')
- #define kfree(_p) ExFreePool(_p)
- #endif
复制代码
- PCWSTR FileName = L"\\??\\C:\\WINDOWS\\system32\\ntkrnlpa.exe";
复制代码
在“BanCrtPT.c”中,这句是硬编码,内核文件的路径和名字可以动态获得,这里为叙述方便而省略。 |
|