龙马谷

 找回密码
 立即注册

QQ登录

只需一步,快速开始

龙马谷VIP会员办理客服QQ:82926983(如果临时会话没有收到回复,请先加QQ好友再发。)
1 [已完结] GG修改器新手入门与实战教程 31课 2 [已完结] GG修改器美化修改教程 6课 3 [已完结] GG修改器Lua脚本新手入门教程 12课
4 [已完结] 触动精灵脚本新手入门必学教程 22课 5 [已完结] 手游自动化脚本入门实战教程 9课 6 [已完结] C++射击游戏方框骨骼透视与自瞄教程 27课
7 [已完结] C++零基础UE4逆向开发FPS透视自瞄教程 29课 8 [已完结] C++零基础大漠模拟器手游自动化辅助教程 22课 9 [已完结] C++零基础开发DXF内存脚本辅助教程 32课
以下是天马阁VIP教程,本站与天马阁合作,赞助VIP可以获得天马阁对应VIP会员,名额有限! 点击进入天马阁论坛
1 [已完结] x64CE与x64dbg入门基础教程 7课 2 [已完结] x64汇编语言基础教程 16课 3 [已完结] x64辅助入门基础教程 9课
4 [已完结] C++x64内存辅助实战技术教程 149课 5 [已完结] C++x64内存检测与过检测技术教程 10课 6 [已完结] C+x64二叉树分析遍历与LUA自动登陆教程 19课
7 [已完结] C++BT功能原理与x64实战教程 29课 8 [已完结] C+FPS框透视与自瞄x64实现原理及防护思路
查看: 5711|回复: 0

VS2019遍历DPC定时器源码

[复制链接]

11

主题

1

回帖

23

积分

编程入门

Rank: 1

龙马币
114

VS2019遍历DPC定时器源码

  1. #include <ntddk.h>
  2. #include <windef.h>

  3. /*---------------------------------自定义函数声明------------------------------------*/
  4. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject); //前置说明 卸载例程
  5. ULONG QueryTimerTableListHead();
  6. ULONG GetDpcTimerInformation_XP();


  7. /*---------------------------------驱动入口函数驱动卸载函数实现------------------------------------*/
  8. VOID DriverUnload(IN PDRIVER_OBJECT DriverObject)
  9. {
  10.         DbgPrint("[MyDriver]Unloaded...\n");
  11.         return;
  12. }

  13. NTSTATUS DriverEntry(IN PDRIVER_OBJECT DriverObject, IN PUNICODE_STRING RegistryPath)
  14. {
  15.         DriverObject->DriverUnload = DriverUnload;
  16.         DbgPrint("[MyDriver]Loaded...\n");
  17.         GetDpcTimerInformation_XP();
  18.         return STATUS_SUCCESS;
  19. }


  20. /*---------------------------------自定义函数实现------------------------------------*/
  21. ULONG GetDpcTimerInformation_XP()
  22. {
  23.         ULONG  NumberOfTimerTable = NULL;
  24.         ULONG  i;
  25.         ULONG  ulCount = 0;
  26.         PLIST_ENTRY  pList = NULL;
  27.         PLIST_ENTRY pNextList = NULL;
  28.         PKTIMER  pTimer = NULL;

  29.         NumberOfTimerTable = 0x100;

  30.         pList = (PLIST_ENTRY)QueryTimerTableListHead();                    //取得链表头
  31.         if (pList == NULL)
  32.         {
  33.                 KdPrint(("timer table failed\n"));
  34.                 return 0;
  35.         }
  36.         for (i = 0; i < NumberOfTimerTable; i++, pList++)                      //NumberOfTimerTable 个list
  37.         {
  38.                 if (!MmIsAddressValid((PVOID)&pList))
  39.                 {
  40.             KdPrint(("pList Failed\r\n"));
  41.                         return NULL;
  42.                 }
  43.                 if (!MmIsAddressValid((PVOID)pList->Blink) ||
  44.                         !MmIsAddressValid((PVOID)pList->Flink))
  45.                 {
  46.                         KdPrint(("Blink Failed\r\n"));
  47.                         continue;      
  48.                 }
  49.                 for (pNextList = pList->Blink; pNextList != pList; pNextList = pNextList->Blink)    //遍历blink链
  50.                 {


  51.                         if (!MmIsAddressValid(pNextList))
  52.                         {
  53.                                 break;               
  54.                         }
  55.                         pTimer = CONTAINING_RECORD(pNextList, KTIMER, TimerListEntry);            //得到结构首

  56.                         //检查pTimer以及各成员
  57.                         if (!MmIsAddressValid((PVOID)pTimer))
  58.                         {
  59.                                 break;               
  60.                         }
  61.                         if (!MmIsAddressValid((PVOID)pTimer->Dpc))
  62.                         {
  63.                                 break;            
  64.                         }
  65.                         if (MmIsAddressValid((PVOID)pTimer) &&
  66.                                 MmIsAddressValid((PVOID)pTimer->Dpc) &&
  67.                                 MmIsAddressValid((PVOID)pTimer->Dpc->DeferredRoutine) &&
  68.                                 MmIsAddressValid((PVOID)&pTimer->Period))                 
  69.                         {
  70.                                 DbgPrint("定时器对象:%08x 函数入口:%08x\n", pTimer, pTimer->Dpc->DeferredRoutine);
  71.                                 ulCount++;                                
  72.                         }
  73.                         if (!MmIsAddressValid(pNextList->Blink))
  74.                         {
  75.                                 break;           
  76.                         }
  77.                 }
  78.         }
  79.         return ulCount;
  80. }


  81. ULONG QueryTimerTableListHead()
  82. {
  83.         UNICODE_STRING UnicodeTimerHead;
  84.         ULONG ulTimerTable;
  85.         PUCHAR i;
  86.         ULONG ulTimerTableListHead;
  87.         
  88.         RtlInitUnicodeString(&UnicodeTimerHead, (PWCHAR)L"KeUpdateSystemTime");
  89.         ulTimerTable = (ULONG)MmGetSystemRoutineAddress(&UnicodeTimerHead);
  90.         if (ulTimerTable == 0) return 0;

  91.         for (i = ulTimerTable; i < ulTimerTable + 200; i++)
  92.         {
  93.                         if (*i == 0x8d)
  94.                         {
  95.                                 ulTimerTableListHead = *(PULONG)(i + 3);
  96.                                 if (MmIsAddressValid(ulTimerTableListHead))
  97.                                 {
  98.                                         DbgPrint("ulTimerTableListHead%08x", ulTimerTableListHead);
  99.                                         return ulTimerTableListHead;
  100.                                 }
  101.                         }               
  102.         }
  103.         return NULL;
  104. }
复制代码

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

龙马谷| C/C++辅助教程| 安卓逆向安全| 论坛导航| 免责申明|Archiver|
拒绝任何人以任何形式在本论坛发表与中华人民共和国法律相抵触的言论,本站内容均为会员发表,并不代表龙马谷立场!
任何人不得以任何方式翻录、盗版或出售本站视频,一经发现我们将追究其相关责任!
我们一直在努力成为最好的编程论坛!
Copyright© 2018-2021 All Right Reserved.
在线客服
快速回复 返回顶部 返回列表