枚举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 ...
随机推荐
- JSP的隐式对象
JSP支持九个自动定义的变量,江湖人称隐含对象.这九个隐含对象的简介见下表: 参考资料:http://www.runoob.com/jsp/jsp-syntax.html
- Maven核心概念之依赖,聚合与继承
一.依赖 我们项目中依赖的jar包可以通过依赖的方式(dependencies元素下添加dependency子元素)引入. <dependency> <groupId>juni ...
- Git的优势
分布式,强调个体 公共服务器压力和数据量都不会太大 速度快.灵活 任意两个开发者之间可以很容易的解决冲突 离线工作
- Android手机分辨率基础知识(DPI,DIP计算)二
dp = dip : device independent pixels(设备独立像素). 不同设备有不同的显示效果,这个和设备硬件有关,一般我们为了支持WVGA.HVGA和QVGA 推荐使用这个,不 ...
- maven Connection refused: connect
现象: 本地可以访问错误提示中的地址.但使用maven无法下载jar包. 环境: 浏览器上网需要使用代理 解决方法: 设置成正常代理可以.具体方法可以下载一个代理工具.只要IE配置成能直接访问http ...
- PHP_解析xss攻击、sql注入
/** * PHP解决XSS(跨站脚本攻击)的调用函数 * PHP跨站脚本漏洞补丁,去除XSS(跨站脚本攻击)的函数,把以下代码保存在function.php文件中,在需要防御的页面中include ...
- 20160808_Qt570安装
1.安装的目录为 “/opt/Qt5.7.0/Tools/QtCreator/bin” 2.建立软连接 [root@localhost bin]# ln -s /opt/Qt5.7.0/Tools/Q ...
- VIM 打造 c/c++ IDE
1. vim 的安装 $sudo apt-get install vim vim-scripts vim-doc <br> 其中vim-scripts包含了vim的一些基本插件,包括语法高 ...
- toolbar
toolbar= (Toolbar) findViewById(R.id.toolbar_mainactivity); // 设置主标题及其颜色 toolbar.setTitle("Andr ...
- unity3d模型制作规范
1. 单位,比例统一 在建模型前先设置好单位,在同一场景中会用到的模型的单位设置必须一样,模型与模型之间的比例要正确,和程序的导入单位一致,即便到程序需要缩放也可以统一调整缩放比例.统一单位为米. 2 ...