目的

拿到类似于 PChunter 中的信息:

过程

首先,要拿到系统的 _KPRCB ,也就是 KiProcessorBlock 的地址:
我这里显示了 4 地址,这是因为我的 CPU 是 4 核 ——
(垃圾电脑勿喷)
对于 KiProcessorBlock 这个 API , Windows 没有导出:
但是可以通过另一种办法获取到这个地址:

// 获取特殊寄存器中的值,拿 _KPRCB
ULONG64 PrcbAddress = (ULONG64)__readmsr(0xC0000101) + 0x20;// PrcbAddress 是一个地址,这个地址存放了某个 CPU 的 _KPRCB 的地址
DbgPrint("[LYSM] *(ULONG_PTR*)PrcbAddress = %p\n", *(ULONG_PTR*)PrcbAddress);

因为当前 CPU 不一定运行在哪一个核上,所以我们用这个指令获取到的值可能是 fffff80396987180 也可能是 ffff80009eba0180


如果想要获取指定核心的 _KPRCB,则需要使用以下代码将当前线程绑定在指定的 CPU 上,具体方法之后再讲,这里先跳过。

获取到 _KPRCB 地址后,看一下它的结构:

lkd> dt _KPRCB fffff803`96987180

在 +0x3680 偏移处有一个成员 TimerTable(这个偏移在不同系统是不同的,win10是 0x3680,win7是 0x2200,其他的请自行查阅)
这是一个 _KTIMER_TABLE 结构,继续查看:

dt _KTIMER_TABLE 0xfffff80396987180+0x3680

在 +0x200 处有一个 _KTIMER_TABLE_ENTRY 类型的成员 TimerEntries[256]

dt _KTIMER_TABLE_ENTRY 0xfffff80396987180+0x3680+0x200

这是一个数组,大小为 0x20(其实就是两个指针加上一个结构体,这个结构体内也是两个指针,一共4个指针,4*8=32=0x20)继续观察 ,+0x08 处有一个 _LIST_ENTRY 类型的成员 Entry

再观察 Entry 的结构,它是一个双向链表:

dt _LIST_ENTRY 0xfffff80396987180+0x3680+0x200+0x08


那么它的数据结构我们大致清楚了,是对象数组+双向链表,由于我刚才重启了一次,现在的 _KPRCB 里的值已经变成了 0xfffff80109fde180:
按之前的计算方式,来到 0xfffff80109fde180+0x3680+0x200,来到对象数组的头部:① 其实就是对象数组中的 Lock,② 和 ③ 分别是双向链表的 FlinkBlink ,④ 是 对象数组中的 Time

Lock 恒等于 0,Time 是一个动态变化的值,这些都不需要关心。只需要关心 ② 即可:
(因为内存里的值变化较快,所以请参考新图中的数据)
(1)比如第一个 Entry 的 FLink 指向了它本身,说明这个双向链表是空的,可以直接 pass 掉:(2)往下找,找到一个不指向自己的 Fink:(我重新执行了下指令所以和上一个图不一样)
看到这个双向链表是有长度的:但是这种内存变化的非常快,我们无法对它实时的分析(当然双机调试除外),在这里我就只说下找到它的原理。剩余的用代码来完成。

首先访问这个 FLink 指向的地址,判断这个地址是否已经到达了双向链表的结尾(结尾就是头部,在上图中就是 fffff80109fe1b68),如果没有结束,则判断这个Flink 指向的地址是否非法,如果合法 —— 关键点来了!

如果合法,就计算 FLink 指针 - 0x20 ,为什么?
因为 FLink 是一个 PLIST_ENTRY 类型的指针,-0x20 就是反推出 _KTIMER 对象的地址:


而这个地址,其实就是 dpc 定时器中的 定时器对象地址
当然,拿到了 _KTIMER 对象后,也可以通过 Period 这个成员拿到 定时器的触发周期:继续划重点!
那么函数入口地址怎么拿呢?
_KTIMER 里有一个成员 *DPC,这个是一个结构体对象指针,它指向一个这样的结构:DeferredRoutine 就是我们想要的函数地址,其他的成员暂时不关心。

但有一点需要注意,当你拿到了 _KTIMER 对象了以后,通过 _KTIMER->Dpc 的方式拿到的其实是一个错误的 Dpc 地址,如果想要拿到正确的地址,我们要对这个错误地址进行解密!(我说的是 x64,x86下的是不需要解密的)

首先用 Windbg 找到 KeSetTimer 这个函数:
这知识一个空壳函数,真正的代码存放在 KiSetTimerEx 内(但只有 KeSetTimer 被导出了!):
大概意思就是一些 异或运算,循环右移,反序,如果看不明白可以参考下面的高级语言代码。

此处应该有掌声

x64驱动遍历 DPC 定时器相关推荐

  1. x64枚举DPC定时器

    @写在前面      不同于x86,x64的DPC是被加密了的.对于x64DPC的兴趣始于我已经流产的scalpel计划.当时问某牛怎么遍历,得到的答案是"500大洋给代码".真是 ...

  2. X64驱动开发和保护+X86X64游戏逆向分析课程

    老师教学范围和方式:木塔负责PC电脑端C语言基础和端游逆向分析部分内容,采用录制+部分直播课程教学,晚上还有专业老师讲解和指导.我要的是质量不是数量.老师备课,设计课件需要时间的. 学习周期:PC端3 ...

  3. vs2017添加C语言模版,「vs2017 项目模板」有没有大神知道vs2017怎么配置wdk10开发x64驱动...

    vs2017 项目模板: 有没有大神知道vs2017怎么配置wdk10开发x64驱动 设置目标或测试计算机是配置计算机以便进行自动驱动程序部署.测试和调试的过程.一个测试和调试环境具有两台计算机:主计 ...

  4. hp1015驱动64位_HP LaserJet1010 x64驱动下载|HP LaserJet1015 win7 x64驱动 - 驱动无忧

    HP LaserJet1010 LaserJet1015 win7 x64驱动添加说明: 按如下步骤执行即可解决问题: 1.正常安装HP官方驱动: 2.在设备管理器里带有"dot4" ...

  5. win7 x64驱动开发经验(三)windbg 双机调试配置 、问题及解决办法

    win7 x64驱动开发经验(三)windbg 双机调试配置 .问题及解决办法 http://www.cnblogs.com/witty/archive/2012/04/23/2466024.html ...

  6. Linux驱动-使用软定时器实现PWM输出

    Linux驱动-使用软定时器实现PWM输出 ​ 在没有pwm外设的情况下,可以使用定时器+GPIO的方法来实现pwm输出,实现pwm频率和占空比可控的功能.本文实现了一个Linux内核驱动,使用两个软 ...

  7. [VT虚拟化驱动]安装DPC回调检测CPU对VT的支持

    文章目录 前言 一.驱动基本框架 二.安装DPC回调 三.检测CPU对VT的支持 本章代码 def.h: DriverEntry.cpp util.cpp 前言 对于VT的介绍网上有很多详细的介绍,这 ...

  8. X64驱动:内核操作进线程/模块

    内核枚举进线程/模块 内核枚举进程: 进程就是活动起来的程序,每一个进程在内核里,都有一个名为 EPROCESS 的结构记录它的详细信息,其中就包括进程名,PID,PPID,进程路径等,通常在应用层枚 ...

  9. linux驱动中使用定时器

    我的内核是2.4.18的.Linux的内核中定义了一个定时器的结构: #include<linux/timer.h> struct timer_list { structlist_head ...

  10. 64位驱动 hp630打印机_HP Deskjet 1280打印机x64驱动下载|HP1280打印机windows7 x64位驱动 - 驱动无忧...

    支持windows7 32位及X64位系统的HP Deskjet 1280打印机驱动程序,解压后需要手动指定驱动位置方式安装.已测试能用. 32位驱动文件: HPF900AL.DLL HPFIMG50 ...

最新文章

  1. 设计中最常用的CSS选择器
  2. Android之UI控件
  3. Java黑皮书课后题第8章:**8.4(计算每个雇员每周工作的小时数)假定所有雇员每周工作的小时数存储在一个二维数组中。1行包含7列,记录了一个雇员7天的工作小时数。编写一个程序,按照总工时降序显示
  4. 解决remove @override annotation
  5. java nio技术_攻破JAVA NIO技术壁垒
  6. 为什么手机网速太慢_手机明明是满格信号,为什么网速却非常慢?原来是这些功能在捣鬼...
  7. 测试开发工程师面试题目
  8. linux fat32分区容量,FAT32格式对硬盘分区容量有限制的吗?
  9. Sqlite日期查询
  10. OA实施案例:服务性行业如何选型OA系统
  11. 计算机机箱架硬盘托架是什么,机械硬盘托架 笔记本光驱位硬盘托架到底靠不靠谱?有人说会烧主板,我都害怕了,......
  12. 220817笔试(速腾聚创)
  13. Asymmetric numeral systems (ANS)非对称数字系统最全资料整理
  14. SPI的4种采样模式
  15. 使用zabbix监控数据并实现邮件、电话、微信报警
  16. 剑指offer73:狒狒吃香蕉
  17. 局域网中最常见的十大错误及解决方法
  18. 2022年全国职业技能大赛网络安全竞赛试题B模块自己解析思路(10)
  19. 一篇带你了解深圳入户办理的条件
  20. 480集课程-打通Python开发的任督二脉 轻松掌握Python高级开发技术 Python超级学科课程

热门文章

  1. 超声波传感器闪光|乐高EV3教学
  2. 计算机主机和音箱之间的接口电路是(),《多媒体技术及应用》按章复习题
  3. 多年 iOS 开发经验总结
  4. 微型计算机控制技术第三版第四章课后答案,微型计算机控制技术第4章习题答案.doc...
  5. 如何用Scapy写一个端口扫描器?
  6. Linux centos7系统下JBoss7.1的部署安装
  7. 分享996个实用的JavaScript特效你要的全在这里
  8. Android开发 无线Wifi+WifiUtil工具类,直面秋招
  9. f1c200s核心板_F1C200s NS 2009 驱动
  10. javascript异步机制 — call stack