hook ZwSetSystemTime 保护系统时间

#include
#include
#include
#include
#include "systimeprotectsys.h"

#define NTDEVICE_NAME L"//Device//systimeprotectsys"
#define DOSLINK_NAME L"//DosDevices//systimeprotectsys"

#pragma pack(1)
typedef struct ServiceDescriptorEntry {
   unsigned int *ServiceTableBase;
   unsigned int *ServiceCounterTableBase; //Used only in checked build
   unsigned int NumberOfServices;
   unsigned char *ParamTableBase;
} ServiceDescriptorTableEntry_t, *PServiceDescriptorTableEntry_t;
#pragma pack()

__declspec(dllimport)  ServiceDescriptorTableEntry_t KeServiceDescriptorTable;
#define SYSTEMSERVICE(_function) KeServiceDescriptorTable.ServiceTableBase[ *(PULONG)((PUCHAR)_function+1)]
#define SDT     SYSTEMSERVICE



#define MemOpen()    __asm CLI; __asm MOV EAX, CR0; __asm MOV EAX, NOT 10000H; __asm MOV CR0, EAX;


#define MemClose()   __asm MOV EAX, CR0;__asm OR EAX, 10000H;__asm MOV  CR0, EAX __asm STI;

BOOLEAN g_Hooked = FALSE;

extern NTSYSAPI NTSTATUS NTAPI ZwSetSystemTime(PLARGE_INTEGER NewTime,PLARGE_INTEGER OldTime);

typedef NTSTATUS (*ZWSETSYSTEMTIME)(PLARGE_INTEGER NewTime,PLARGE_INTEGER OldTime);

NTSTATUS HookZwSetSystemTime(PLARGE_INTEGER NewTime,PLARGE_INTEGER OldTime);

static ZWSETSYSTEMTIME          RealZwSetSystemTime;
int i;

void Hook()
{
if(!g_Hooked)
{
   g_Hooked=TRUE;
   
   //MemOpen();
__asm
{
   push  eax
   mov    eax, CR0
   and    eax, 0FFFEFFFFh
   mov    CR0, eax
   pop    eax
}

   RealZwSetSystemTime  = (ZWSETSYSTEMTIME) InterlockedExchange((PLONG) &SDT(ZwSetSystemTime), (LONG)HookZwSetSystemTime);
   DbgPrint("%x",RealZwSetSystemTime);

//  MemClose();
__asm
{
   push  eax
   mov    eax, CR0
   or    eax, NOT 0FFFEFFFFh
   mov    CR0, eax
   pop    eax
}
}
}

void UnHook()
{
if(g_Hooked)
{
   g_Hooked=FALSE;
__asm
{
   push  eax
   mov    eax, CR0
   and    eax, 0FFFEFFFFh
   mov    CR0, eax
   pop    eax
}
//  MemOpen();

   InterlockedExchange( (PLONG) &SDT(ZwSetSystemTime) , (LONG) RealZwSetSystemTime);
__asm
{
   push  eax
   mov    eax, CR0
   or    eax, NOT 0FFFEFFFFh
   mov    CR0, eax
   pop    eax
}
//  MemClose();
  }
}

//


NTSTATUS HookZwSetSystemTime(PLARGE_INTEGER NewTime,PLARGE_INTEGER OldTime)
{
DbgPrint("Returned ...");
return STATUS_SUCCESS;
}





VOID DriverUnload (IN PDRIVER_OBJECT    pDriverObject)
{
   UNICODE_STRING  nameString;
DbgPrint("Driver Unloading.../n");


UnHoo();
   
RtlInitUnicodeString( &nameString, DOSLINK_NAME );   
   IoDeleteSymbolicLink(&nameString);
IoDeleteDevice(pDriverObject->DeviceObject);
   return;
}


NTSTATUS MyDrvDispatch( IN PDEVICE_OBJECT DeviceObject, IN PIRP pIrp)
{
NTSTATUS status;
PIO_STACK_LOCATION irpStack;
//   PVOID inputBuffer, outputBuffer;
//   ULONG inputBufferLength, outputBufferLength;
ULONG ioControlCode;

pIrp->IoStatus.Status = STATUS_SUCCESS;
pIrp->IoStatus.Information = 0;

irpStack = IoGetCurrentIrpStackLocation( pIrp);
DbgPrint("MyDrvDispatch...");


ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;

//
///


switch( irpStack->MajorFunction)
{
   case IRP_MJ_CREATE:
     DbgPrint("IRP_MJ_CREATE...");
                                               Hook();
     break;

   case IRP_MJ_SHUTDOWN:
     //当系统关闭..
     DbgPrint("IRP_MJ_SHUTDOWN...");
                                               UnHook();
     break;
   case IRP_MJ_CLOSE:
     //驱动关闭,释放所有缓冲
     DbgPrint("IRP_MJ_CLOSE...");//UnHookRegAPI();

     break;

   case IRP_MJ_DEVICE_CONTROL:
         //处理通讯指令

       DbgPrint("IRP_MJ_DEVICE_CONTROL/n");
       ioControlCode = irpStack->Parameters.DeviceIoControl.IoControlCode;

       switch (ioControlCode)
       {
         // ioctl 设置开始HOOK
         case IOCTL_TIME_HOOK:
         {
                                                  Hook();
           
           DbgPrint("IOCTL_TIME_HOOK...");

           break;
         }
         // ioctl 设置取消HOOK
         case IOCTL_TIME_UNHOOK:
         {
           UnHook();
           DbgPrint("IOCTL_TIME_UNHOOK...");
           break;
         }

         default:
           pIrp->IoStatus.Status = STATUS_INVALID_PARAMETER;
           DbgPrint("unknown IRP_MJ_DEVICE_CONTROL/n");
           break;
       }
     break;
   }

IoCompleteRequest( pIrp, IO_NO_INCREMENT);
status = STATUS_SUCCESS;
return status;
}

//
// 驱动入口
//

NTSTATUS  DriverEntry( IN PDRIVER_OBJECT DriverObject,  IN PUNICODE_STRING RegistryPath )
{
PDEVICE_OBJECT          deviceObject = NULL;
NTSTATUS        status = STATUS_SUCCESS;
   UNICODE_STRING      ntDeviceName;
UNICODE_STRING      win32DeviceName;

DbgPrint("DriverEntry.../n");

   RtlInitUnicodeString(&ntDeviceName, NTDEVICE_NAME);
   
//建立一个驱动设备
   status = IoCreateDevice (DriverObject, 0, &ntDeviceName, FILE_DEVICE_UNKNOWN, 0, TRUE, &deviceObject);
   
if (!NT_SUCCESS (status))
{
       goto ERROR;
   }
  
RtlInitUnicodeString(&win32DeviceName, DOSLINK_NAME);

   status = IoCreateSymbolicLink( &win32DeviceName, &ntDeviceName );
   if (!NT_SUCCESS(status))   
   {                        
       goto ERROR;
   }

   for (i = 0; i  {
   DriverObject->MajorFunction[i] = MyDrvDispatch;
   }

   DriverObject->DriverUnload = DriverUnload;

   return(STATUS_SUCCESS);

ERROR:
   if(deviceObject)
       IoDeleteDevice(deviceObject);
   
DbgPrint( "Leave DriverEntry failed/n" );
   return status;
}


 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值