欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

遍历内核中的DpcTimer

遍历内核中的DpcTimer



其实本篇帖子是对于之前一篇帖子的补完 http://bbs.pediy.com/showthread.php?t=140344
遍历系统内核DpcTimer是一个比较烦人的事情,记得当初弄的时候蓝脸N次
而且作为系统底层内核中的底层,遍历它也不是那么安全的事情,
主要因为不知道有没有相关的系统锁能够让我们在遍历的时候加以利用,
来使我们的操作更加安全,希望有相关信息的朋友能指点我一下,呵呵
当初在遍历DpcTimer的时候网上都没搜到相关信息,
后来对某工具进行了一下逆向,才找到的线索
写这篇帖子之前又搜了一下,已经有零星的介绍,大家可以去搜索一下
废话不多说了,DpcTimer这条链在xp 2k3 win7下的遍历方法都有些许的不同
首先看 win xp 
我们还是从已知入手:
我们的驱动可以注册Dpc定时器的,系统接受我们的注册之后就应当会把它放入一个链表中.
所以先看一下注册Dpc定时器的相关函数:
KeInitializeDpc    初始化一个DPC对象
KeSetTimerEx    设置定时器,其中可以加入DPC对象
KeSetTimerEx之后我们的DPC过程就能在指定的时间被调用了,说明已被加入了系统底层链表中
我们在IDA中打开 xp 的ntkrnlpa.exe, 定位到KeSetTimerEx的实现部分:

这里并没有发现有对于系统级全局变量的引用,
不过通过观察名称发现KiInsertTreeTimer应该与插入一个定时器到链表有点关系.看一下:

对于参数进行了一些处理之后调用了KiInsertTimerTable,继续追寻:

这里对全局变量KiInsertTimerTable进行了引用,看名称就是全局的定时器链表了

同时我们在这里也可以发现一些其他的线索,
在调用了KiComputeTimerTableIndex之后直接使用其返回值进行KiTimerTableListHead对应项的索引,
而步进是8,所以KiTimerTableListHead应该就是8字节为大小的结构数组的首地址,
而这个结构数组有多少成员呢?
看一下有那些地方对KiTimerTableListHead进行了引用,在IDA中的KiTimerTableListHead上按x可以看到:

其中有KiInitSystem对其的引用,应该就是对于结构数据的初始化地方了:

这里我们就得到了两个重要的信息:
1是这个结构数组项数为 0x100 = 256
2是这个结构数组每一项都是一个ListEntry结构,因为这里出现了明显的初始化片段
所以我们遍历这256个ListEntry就能得到所有的定时器了,
到现在唯一还需要得知的就是ListEntry上每一个结构的定义形式,
而这个结构在WDK中已经定义好了,就是KeSetTimerEx传入的KTIMER

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功