枚举IoTimer
/***************************************************************************************
* AUTHOR : yifi
* DATE : 2015-11-5
* MODULE : EnumIoTimer.C
*
* Command:
* Source of IOCTRL Sample Driver
*
* Description:
* Demonstrates communications between USER and KERNEL.
*
****************************************************************************************
* Copyright (C) 2010 yifi.
****************************************************************************************/ //#######################################################################################
//# I N C L U D E S
//####################################################################################### #ifndef CXX_ENUMIOTIMER_H
# include "EnumIoTimer.h"
#endif NTSTATUS DriverEntry(PDRIVER_OBJECT DriverObject, PUNICODE_STRING RegisterPath)
{ DriverObject->DriverUnload = UnloadDriver; EnumIoTimer();
return STATUS_SUCCESS;
} BOOLEAN EnumIoTimer()
{
PLIST_ENTRY IoTimerQueueHead = ;
PUCHAR IoInitializeTimer = ;
KIRQL OldIrql;
PUCHAR StartSearchAddress = NULL;
PUCHAR EndSearchAddress = NULL;
PUCHAR i = NULL;
INT32 iOffset = ;
UCHAR v1 = , v2 = , v3 = ; IoInitializeTimer = (PUCHAR)GetExportVariableAddressFormNtosExportTableByVariableName(L"IoInitializeTimer");
if (IoInitializeTimer == NULL)
{
return FALSE;
}
StartSearchAddress = IoInitializeTimer;
EndSearchAddress = StartSearchAddress + 0x500; #ifdef _WIN64
for (i = StartSearchAddress;i<EndSearchAddress;i++)
{
if (MmIsAddressValid(i) && MmIsAddressValid(i + ) && MmIsAddressValid(i + ))
{
v1 = *i;
v2 = *(i + );
v3 = *(i + );
if (v1 == 0x48 && v2 == 0x8d && v3 == 0x0d)
{
memcpy(&iOffset, i + , );
IoTimerQueueHead = (PLIST_ENTRY)(iOffset + (ULONG64)i + );
break;
} }
} #else for (i = StartSearchAddress; i < EndSearchAddress; i++)
{
v1 = *i;
if (v1 == 0xb9)
{
IoTimerQueueHead = (PLIST_ENTRY)*(PULONG32)(i + );
break;
}
}
#endif if (IoTimerQueueHead == NULL)
{
return FALSE;
} DbgPrint("获得了\r\n");
OldIrql = KeRaiseIrqlToDpcLevel(); if (IoTimerQueueHead && MmIsAddressValid((PVOID)IoTimerQueueHead))
{
PLIST_ENTRY NextEntry = IoTimerQueueHead->Flink;
while (MmIsAddressValid(NextEntry) && NextEntry != (PLIST_ENTRY)IoTimerQueueHead)
{
PIO_TIMER Timer = CONTAINING_RECORD(NextEntry, IO_TIMER, TimerList); if (Timer && MmIsAddressValid(Timer))
{
DbgPrint("Timer 对象: %p\r\n", Timer);
}
NextEntry = NextEntry->Flink; }
}
KeLowerIrql(OldIrql);
return TRUE;
} VOID UnloadDriver(PDRIVER_OBJECT DriverObject)
{
return;
} PVOID
GetExportVariableAddressFormNtosExportTableByVariableName(WCHAR *wzVariableName)
{
UNICODE_STRING uniVariableName;
PVOID VariableAddress = NULL; if (wzVariableName && wcslen(wzVariableName) > )
{
RtlInitUnicodeString(&uniVariableName, wzVariableName); //从Ntos模块的导出表中获得一个导出变量的地址
VariableAddress = MmGetSystemRoutineAddress(&uniVariableName);
} return VariableAddress;
}
代码
/***************************************************************************************
* AUTHOR : yifi
* DATE : 2015-11-5
* MODULE : EnumIoTimer.H
*
* IOCTRL Sample Driver
*
* Description:
* Demonstrates communications between USER and KERNEL.
*
****************************************************************************************
* Copyright (C) 2010 yifi.
****************************************************************************************/ #ifndef CXX_ENUMIOTIMER_H
#define CXX_ENUMIOTIMER_H #include <ntifs.h> typedef struct _IO_TIMER_WIN7_X64
{
INT16 Type;
INT16 TimerFlag;
LONG32 Unknown;
LIST_ENTRY TimerList;
PVOID TimerRoutine;
PVOID Context;
PVOID DeviceObject;
}IO_TIMER_WIN7_X64, *PIO_TIMER_WIN7_X64; typedef struct _IO_TIMER_WINXP_X86
{
INT16 Type;
INT16 TimerFlag;
LIST_ENTRY TimerList;
PVOID TimerRoutine;
PVOID Context;
PVOID DeviceObject;
} IO_TIMER_WINXP_X86, *PIO_TIMER_WINXP_X86; #ifdef _WIN64
#define PIO_TIMER PIO_TIMER_WIN7_X64
#define IO_TIMER IO_TIMER_WIN7_X64
#else
#define PIO_TIMER PIO_TIMER_WINXP_X86
#define IO_TIMER IO_TIMER_WINXP_X86
#endif VOID UnloadDriver(PDRIVER_OBJECT DriverObject);
BOOLEAN EnumIoTimer();
PVOID GetExportVariableAddressFormNtosExportTableByVariableName(WCHAR *wzVariableName); #endif
代码
枚举IoTimer的更多相关文章
- 驱动开发:内核枚举IoTimer定时器
今天继续分享内核枚举系列知识,这次我们来学习如何通过代码的方式枚举内核IoTimer定时器,内核定时器其实就是在内核中实现的时钟,该定时器的枚举非常简单,因为在IoInitializeTimer初始化 ...
- 驱动开发:内核枚举DpcTimer定时器
在笔者上一篇文章<驱动开发:内核枚举IoTimer定时器>中我们通过IoInitializeTimer这个API函数为跳板,向下扫描特征码获取到了IopTimerQueueHead也就是I ...
- 驱动开发:Win10内核枚举SSDT表基址
三年前面朝黄土背朝天的我,写了一篇如何在Windows 7系统下枚举内核SSDT表的文章<驱动开发:内核读取SSDT表基址>三年过去了我还是个单身狗,开个玩笑,微软的Windows 10系 ...
- Swift enum(枚举)使用范例
//: Playground - noun: a place where people can play import UIKit var str = "Hello, playground& ...
- 编写高质量代码:改善Java程序的151个建议(第6章:枚举和注解___建议88~92)
建议88:用枚举实现工厂方法模式更简洁 工厂方法模式(Factory Method Pattern)是" 创建对象的接口,让子类决定实例化哪一个类,并使一个类的实例化延迟到其它子类" ...
- Objective-C枚举的几种定义方式与使用
假设我们需要表示网络连接状态,可以用下列枚举表示: enum CSConnectionState { CSConnectionStateDisconnected, CSConnectionStateC ...
- Help Hanzo (素数筛+区间枚举)
Help Hanzo 题意:求a~b间素数个数(1 ≤ a ≤ b < 231, b - a ≤ 100000). (全题在文末) 题解: a~b枚举必定TLE,普通打表MLE,真是头疼 ...
- 枚举:enum
枚举 所谓枚举就是指定好取值范围,所有内容只能从指定范围取得. 例如,想定义一个color类,他只能有RED,GREEN,BLUE三种植. 使用简单类完成颜色固定取值问题. 1,就是说,一个类只能完成 ...
- .NET 基础一步步一幕幕[方法、结构、枚举]
方法.结构.枚举 方法: 将一堆代码进行重用的一种机制. 语法: [访问修饰符] 返回类型 <方法名>(参数列表){ 方法主体: } 返回值类型:如果不需要写返回值,写void 方法名:P ...
随机推荐
- SAP接口编程 之 JCo3.0系列(03) : Table参数
Table参数作为export parameter BAPI_COMPANYCODE_GETDETAIL是一个适合演示的函数,没有import paramter参数,调用后COMPANYCODE_GE ...
- hibernate对象关系实现(三)多对多实现
单向n-n:(catogory-item)一个类别对应多个条目,一个条目对应多个类别 a.以类别类中有条目的集合的引用为例: b.数据库中的体现:建立一个新表,以类别和条目的主键关联的外键做新表的联合 ...
- Android_使用 OpenVPN
1. 需要 root http://www.doc88.com/p-847633362717.html http://bbs.gfan.com/android-3679297-1-1.html 需要 ...
- 关于inline-block 元素之间为何会产生间隔
关于inline-block 元素之间为何会产生间隔 现象: <body> <input type="text"> <input type=" ...
- JavaSE复习_11 IO流复习
△FileReader是使用默认码表读取文件, 如果需要使用指定码表读取, 那么可以使用InputStreamReader(字节流,编码表) FileWriter是使用默认码表写出文件, 如果需 ...
- -bash: jps: command not found
linux安装了jdk之后,打jps命令发现找不到这个命令: -bash: jps: command not found 查看java版本java -version,正常. java version ...
- 20160808_Qt570安装
1.安装的目录为 “/opt/Qt5.7.0/Tools/QtCreator/bin” 2.建立软连接 [root@localhost bin]# ln -s /opt/Qt5.7.0/Tools/Q ...
- 20160805_CentOS6_控制台切换
1. Ctrl + Alt + F1~F6 Ctrl + Alt + F1 是 图形界面(如果装了的话),后面的是 控制台界面 2. 3.
- css 颜色渐变
.top_nav { width: 100%; height: 29px; /* 如果浏览器不支持渐变,使用图像作为背景 */ background: u ...
- iOS开发 创建单例模式
+ (id)defaultNSObjectName { static id defaultNSObjectName = nil; static BOOL token = NO; if (!token) ...