|
楼主 |
发表于 2010-6-5 23:18:32
|
显示全部楼层
本帖最后由 Tesla.Angela 于 2010-6-5 23:20 编辑
还有驱动的源码:
- #include <NTDDK.H>
- #include <windef.h>
- #define NT_DEVICE_NAME L"\\Device\\UnHook"
- #define DOS_DEVICE_NAME L"\\DosDevices\\UnHook"
- #define IOCTL_UnHook CTL_CODE(FILE_DEVICE_UNKNOWN, 0x801, METHOD_BUFFERED, FILE_ANY_ACCESS)
- typedef struct _Unhook {
- ULONG TarAddr; //目标地址
- ULONG Length; //需要覆盖的长度
- BYTE OrigiData[MAX_PATH];//原始数据
- } UNHOOK, *PUNHOOK;
- NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath);
- NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);
- NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp);
- VOID UnloadDriver(IN PDRIVER_OBJECT DriverObject );
- void MemOpen()
- {
- __asm {
- cli
- mov eax,cr0
- and eax,not 10000h
- mov cr0,eax
- }
- }
- void MemClose()
- {
- __asm {
- mov eax,cr0
- or eax,10000h
- mov cr0,eax
- sti
- }
- }
- NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject,IN PUNICODE_STRING RegistryPath)
- {
- UNICODE_STRING uniDeviceName;
- UNICODE_STRING uniSymLink;
- NTSTATUS ntStatus;
- PDEVICE_OBJECT deviceObject = NULL;
- RtlInitUnicodeString(&uniDeviceName, NT_DEVICE_NAME);
- RtlInitUnicodeString(&uniSymLink, DOS_DEVICE_NAME);
- DriverObject->MajorFunction[IRP_MJ_CREATE] =
- DriverObject->MajorFunction[IRP_MJ_CLOSE] = DispatchCreateClose;
- DriverObject->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;
- DriverObject->DriverUnload = UnloadDriver;
- ntStatus = IoCreateDevice(DriverObject, 0,&uniDeviceName,FILE_DEVICE_UNKNOWN,
- FILE_DEVICE_SECURE_OPEN, FALSE,&deviceObject);
- if (!NT_SUCCESS(ntStatus)) return ntStatus;
- ntStatus = IoCreateSymbolicLink(&uniSymLink, &uniDeviceName);
- if (!NT_SUCCESS(ntStatus))
- {
- IoDeleteDevice(deviceObject);
- return ntStatus;
- }
- //DbgPrint("driver loaded!\n");
- return STATUS_SUCCESS;
- }
- NTSTATUS DispatchCreateClose(IN PDEVICE_OBJECT pDevObj, IN PIRP pIrp)
- {
- pIrp->IoStatus.Information = 0;
- pIrp->IoStatus.Status = STATUS_SUCCESS;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return STATUS_SUCCESS;
- }
- NTSTATUS DispatchIoctl(IN PDEVICE_OBJECT pDevObj,IN PIRP pIrp)
- {
-
- NTSTATUS ntStatus = STATUS_INVALID_DEVICE_REQUEST;//STATUS_UNSUCCESSFUL;//
- PIO_STACK_LOCATION pIrpStack = IoGetCurrentIrpStackLocation(pIrp);
- ULONG uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;
- ULONG inBufLength = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;
- ULONG outBufLength =pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;
-
- PVOID OutputBuffer = pIrp->UserBuffer;
- PVOID InputBuffer = pIrp->AssociatedIrp.SystemBuffer;
- switch(uIoControlCode)
- {
- case IOCTL_UnHook:
- {
- UNHOOK UnHook={0};
- memcpy(&UnHook,InputBuffer,sizeof(UNHOOK));
- MemOpen();
- memcpy((PVOID)UnHook.TarAddr,UnHook.OrigiData,UnHook.Length);
- MemClose();
- ntStatus = STATUS_SUCCESS;
- break;
- }
- }
- pIrp->IoStatus.Status = ntStatus;
- //pIrp->IoStatus.Information = outBufLength;
- IoCompleteRequest(pIrp, IO_NO_INCREMENT);
- return ntStatus;
- }
- VOID UnloadDriver( IN PDRIVER_OBJECT DriverObject )
- {
- PDEVICE_OBJECT deviceObject = DriverObject->DeviceObject;
- UNICODE_STRING uniSymLink;
- RtlInitUnicodeString(&uniSymLink, DOS_DEVICE_NAME);
-
- //DbgPrint("driver unloaded.\n");
- IoDeleteSymbolicLink(&uniSymLink);
- IoDeleteDevice(deviceObject);
- }
复制代码
需要说的是,这样子修改内核数据蓝屏的可能性很大,建议大家参考MySystemDebugControl修改内核数据的方法。 |
|