zoukankan      html  css  js  c++  java
  • 枚举IoTimer

      1 /***************************************************************************************
      2 * AUTHOR : yifi
      3 * DATE   : 2015-11-5
      4 * MODULE : EnumIoTimer.C
      5 * 
      6 * Command: 
      7 *    Source of IOCTRL Sample Driver
      8 *
      9 * Description:
     10 *        Demonstrates communications between USER and KERNEL.
     11 *
     12 ****************************************************************************************
     13 * Copyright (C) 2010 yifi.
     14 ****************************************************************************************/
     15 
     16 //#######################################################################################
     17 //# I N C L U D E S
     18 //#######################################################################################
     19 
     20 #ifndef CXX_ENUMIOTIMER_H
     21 #    include "EnumIoTimer.h"
     22 #endif
     23 
     24 
     25 NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
     26 {
     27 
     28     DriverObject->DriverUnload = UnloadDriver;
     29 
     30     EnumIoTimer();
     31     return STATUS_SUCCESS;
     32 }
     33 
     34 
     35 BOOLEAN EnumIoTimer()
     36 {
     37     PLIST_ENTRY IoTimerQueueHead = 0;
     38     PUCHAR IoInitializeTimer = 0;
     39     KIRQL OldIrql;
     40     PUCHAR StartSearchAddress = NULL;
     41     PUCHAR EndSearchAddress = NULL;
     42     PUCHAR i = NULL;
     43     INT32 iOffset = 0;
     44     UCHAR v1 = 0, v2 = 0, v3 = 0;
     45 
     46     IoInitializeTimer = (PUCHAR)GetExportVariableAddressFormNtosExportTableByVariableName(L"IoInitializeTimer");
     47     if (IoInitializeTimer == NULL)
     48     {
     49         return FALSE;
     50     }
     51     StartSearchAddress = IoInitializeTimer;
     52     EndSearchAddress = StartSearchAddress + 0x500;
     53 
     54 #ifdef _WIN64
     55     for (i = StartSearchAddress;i<EndSearchAddress;i++)
     56     {
     57         if (MmIsAddressValid(i) && MmIsAddressValid(i + 1) && MmIsAddressValid(i + 2))
     58         {
     59             v1 = *i;
     60             v2 = *(i + 1);
     61             v3 = *(i + 2);
     62             if (v1 == 0x48 && v2 == 0x8d && v3 == 0x0d)
     63             {
     64                 memcpy(&iOffset, i + 3, 4);
     65                 IoTimerQueueHead = (PLIST_ENTRY)(iOffset + (ULONG64)i + 7);
     66                 break;
     67             }
     68 
     69         }
     70     }
     71 
     72 #else
     73 
     74     for (i = StartSearchAddress; i < EndSearchAddress; i++)
     75     {
     76         v1 = *i;
     77         if (v1 == 0xb9)
     78         {
     79             IoTimerQueueHead = (PLIST_ENTRY)*(PULONG32)(i + 1);
     80             break;
     81         }
     82     }
     83 #endif
     84 
     85     if (IoTimerQueueHead == NULL)
     86     {
     87         return FALSE;
     88     }
     89 
     90     DbgPrint("获得了
    ");
     91     OldIrql = KeRaiseIrqlToDpcLevel();
     92 
     93     if (IoTimerQueueHead && MmIsAddressValid((PVOID)IoTimerQueueHead))
     94     {
     95         PLIST_ENTRY NextEntry = IoTimerQueueHead->Flink;
     96         while (MmIsAddressValid(NextEntry) && NextEntry != (PLIST_ENTRY)IoTimerQueueHead)
     97         {
     98             PIO_TIMER Timer = CONTAINING_RECORD(NextEntry, IO_TIMER, TimerList);
     99 
    100             if (Timer && MmIsAddressValid(Timer))
    101             {
    102                 DbgPrint("Timer 对象: %p
    ", Timer);
    103             }
    104             NextEntry = NextEntry->Flink;
    105 
    106         }
    107     }
    108     KeLowerIrql(OldIrql);
    109     return TRUE;
    110 }
    111 
    112 VOID UnloadDriver(PDRIVER_OBJECT DriverObject)
    113 {
    114     return;
    115 }
    116 
    117 
    118 
    119 PVOID
    120 GetExportVariableAddressFormNtosExportTableByVariableName(WCHAR *wzVariableName)
    121 {
    122     UNICODE_STRING uniVariableName;
    123     PVOID VariableAddress = NULL;
    124 
    125     if (wzVariableName && wcslen(wzVariableName) > 0)
    126     {
    127         RtlInitUnicodeString(&uniVariableName, wzVariableName);
    128 
    129         //从Ntos模块的导出表中获得一个导出变量的地址
    130         VariableAddress = MmGetSystemRoutineAddress(&uniVariableName);
    131     }
    132 
    133     return VariableAddress;
    134 }
    代码
     1 /***************************************************************************************
     2 * AUTHOR : yifi
     3 * DATE   : 2015-11-5
     4 * MODULE : EnumIoTimer.H
     5 *
     6 * IOCTRL Sample Driver
     7 *
     8 * Description:
     9 *        Demonstrates communications between USER and KERNEL.
    10 *
    11 ****************************************************************************************
    12 * Copyright (C) 2010 yifi.
    13 ****************************************************************************************/
    14 
    15 #ifndef CXX_ENUMIOTIMER_H
    16 #define CXX_ENUMIOTIMER_H
    17 
    18 #include <ntifs.h>
    19 
    20 
    21 typedef struct _IO_TIMER_WIN7_X64
    22 {
    23     INT16        Type;
    24     INT16        TimerFlag;
    25     LONG32        Unknown;
    26     LIST_ENTRY    TimerList;
    27     PVOID        TimerRoutine;
    28     PVOID        Context;
    29     PVOID        DeviceObject;
    30 }IO_TIMER_WIN7_X64, *PIO_TIMER_WIN7_X64;
    31 
    32 
    33 typedef struct _IO_TIMER_WINXP_X86
    34 {
    35     INT16        Type;
    36     INT16        TimerFlag;
    37     LIST_ENTRY    TimerList;
    38     PVOID        TimerRoutine;
    39     PVOID        Context;
    40     PVOID        DeviceObject;
    41 } IO_TIMER_WINXP_X86, *PIO_TIMER_WINXP_X86;
    42 
    43 #ifdef _WIN64
    44 #define PIO_TIMER PIO_TIMER_WIN7_X64
    45 #define IO_TIMER  IO_TIMER_WIN7_X64
    46 #else
    47 #define PIO_TIMER PIO_TIMER_WINXP_X86
    48 #define IO_TIMER  IO_TIMER_WINXP_X86
    49 #endif
    50 
    51 
    52 
    53 VOID UnloadDriver(PDRIVER_OBJECT DriverObject);
    54 BOOLEAN EnumIoTimer();
    55 PVOID GetExportVariableAddressFormNtosExportTableByVariableName(WCHAR *wzVariableName);
    56 
    57 #endif
    代码
    爱程序 不爱bug 爱生活 不爱黑眼圈 我和你们一样 我和你们不一样 我不是凡客 我要做geek
  • 相关阅读:
    Linux中大括号{}的应用
    shell script编程(1)>>学生成绩管理系统
    不同版本的Linux防火墙关闭和开启
    shell script的执行方式区别
    包管理介绍(DPKG,APT,RPM,YUM,DNF)
    MBR与GPT,BIOS与UEFI..总结
    Windows10下安装Ubuntu的错误总结
    学生管理系统及票务管理系统总结
    python 3.x和python 2.x下的换行问题
    输出整数各位数字
  • 原文地址:https://www.cnblogs.com/yifi/p/4940054.html
Copyright © 2011-2022 走看看