驱动开发:内核枚举DpcTimer定时器

在笔者上一篇文章《驱动开发:内核枚举IoTimer定时器》中我们通过IoInitializeTimer这个API函数为跳板 , 向下扫描特征码获取到了IopTimerQueueHead也就是IO定时器的队列头 , 本章学习的枚举DPC定时器依然使用特征码扫描 , 唯一不同的是在新版系统中DPC是被异或加密的 , 想要找到正确的地址 , 只是需要在找到DPC表头时进行解密操作即可 。

驱动开发:内核枚举DpcTimer定时器

文章插图
DPC定时器的作用: 在内核中可以使用DPC定时器设置任意定时任务 , 当到达某个节点时自动触发定时回调 , 定时器的内部使用KTIMER对象 , 当设置任务时会自动插入到DPC队列 , 由操作系统循环读取DPC队列并执行任务 , 枚举DPC定时器可得知系统中存在的DPC任务 。
要想在新版系统中得到DPC定时器则需要执行以下步骤
  • 1.找到KiProcessorBlock地址并解析成_KPRCB结构
  • 2.在_KPRCB结构中得到_KTIMER_TABLE偏移
  • 3.解析_KTIMER_TABLE_ENTRY得到加密后的双向链表
首先_KPRCB这个结构体与CPU内核对应 , 获取方式可通过一个未导出的变量nt!KiProcessorBlock来得到 , 如下双核电脑 , 结构体存在两个与之对应的结构地址 。
lyshark.com 0: kd> dq nt!KiProcessorBlockfffff807`70a32cc0fffff807`6f77c180 ffffbe81`3cee0180fffff807`70a32cd000000000`00000000 00000000`00000000fffff807`70a32ce000000000`00000000 00000000`00000000KiProcessorBlock是一个数组 , 其第一个结构体TimerTable则是结构体的偏移 。
lyshark.com 0: kd> dt _KPRCB fffff807`6f77c180ntdll!_KPRCB+0x000 MxCsr: 0x1f80+0x3680 TimerTable: _KTIMER_TABLE (此处)+0x5880 DpcGate: _KGATE接下来是把所有的KTIMER都枚举出来 , KTIMER在TimerTable中的存储方式是数组+双向链表 。
【驱动开发:内核枚举DpcTimer定时器】lyshark.com 0: kd> dt _KTIMER_TABLEntdll!_KTIMER_TABLE+0x000 TimerExpiry: [64] Ptr64 _KTIMER+0x200 TimerEntries: [256] _KTIMER_TABLE_ENTRY (此处)到了_KTIMER_TABLE_ENTRY这里 , Entry开始的双向链表 , 每一个元素都对应一个Timer也就是说我们已经可以遍历所有未解密的Time变量了 。
lyshark.com 0: kd> dt _KTIMER_TABLE_ENTRY 0xfffff807`6f77c180 + 0x3680ntdll!_KTIMER_TABLE_ENTRY+0x000 Lock: 0+0x008 Entry: _LIST_ENTRY [ 0x00000000`00000000 - 0x00000000`00000000 ]+0x018 Time: _ULARGE_INTEGER 0x0lyshark.com 0: kd> dt _KTIMER_TABLE_ENTRY 0xfffff807`6f77c180 + 0x3680 + 0x200ntdll!_KTIMER_TABLE_ENTRY+0x000 Lock: 0+0x008 Entry: _LIST_ENTRY [ 0xffffa707`a0d3e1a0 - 0xffffa707`a0d3e1a0 ]+0x018 Time: _ULARGE_INTEGER 0x00000001`a8030353至于如何解密 , 我们需要得到加密位置 , 如下通过KeSetTimer找到KeSetTimerEx从中得到DCP加密流程 。
lyshark.com 0: kd> u nt!KeSetTimernt!KeSetTimer:fffff803`0fc63a40 4883ec38subrsp,38hfffff803`0fc63a44 4c89442420movqword ptr [rsp+20h],r8fffff803`0fc63a49 4533c9xorr9d,r9dfffff803`0fc63a4c 4533c0xorr8d,r8dfffff803`0fc63a4f e80c000000callnt!KiSetTimerEx (fffff803`0fc63a60)fffff803`0fc63a54 4883c438addrsp,38hfffff803`0fc63a58 c3retfffff803`0fc63a59 ccint30: kd> u nt!KiSetTimerEx l50nt!KiSetTimerEx:fffff803`0fc63a60 48895c2408movqword ptr [rsp+8],rbxfffff803`0fc63a65 48896c2410movqword ptr [rsp+10h],rbpfffff803`0fc63a6a 4889742418movqword ptr [rsp+18h],rsifffff803`0fc63a6f 57pushrdifffff803`0fc63a70 4154pushr12fffff803`0fc63a72 4155pushr13fffff803`0fc63a74 4156pushr14fffff803`0fc63a76 4157pushr15fffff803`0fc63a78 4883ec50subrsp,50hfffff803`0fc63a7c 488b057d0c5100movrax,qword ptr [nt!KiWaitNever (fffff803`10174700)]fffff803`0fc63a83 488bf9movrdi,rcxfffff803`0fc63a86 488b35630e5100movrsi,qword ptr [nt!KiWaitAlways (fffff803`101748f0)]fffff803`0fc63a8d 410fb6e9movzxebp,r9bfffff803`0fc63a91 4c8bac24a0000000 movr13,qword ptr [rsp+0A0h]fffff803`0fc63a99 458bf8movr15d,r8dfffff803`0fc63a9c 4933f5xorrsi,r13fffff803`0fc63a9f 488bdamovrbx,rdxfffff803`0fc63aa2 480fcebswaprsifffff803`0fc63aa5 4833f1xorrsi,rcxfffff803`0fc63aa8 8bc8movecx,eaxfffff803`0fc63aaa 48d3cerorrsi,clfffff803`0fc63aad 4833f0xorrsi,raxfffff803`0fc63ab0 440f20c1movrcx,cr8fffff803`0fc63ab4 48898c24a0000000 movqword ptr [rsp+0A0h],rcxfffff803`0fc63abc b802000000moveax,2fffff803`0fc63ac1 440f22c0movcr8,raxfffff803`0fc63ac5 8b05dd0a5100moveax,dword ptr [nt!KiIrqlFlags (fffff803`101745a8)]fffff803`0fc63acb 85c0testeax,eaxfffff803`0fc63acd 0f85b72d1a00jnent!KiSetTimerEx+0x1a2e2a (fffff803`0fe0688a)fffff803`0fc63ad3 654c8b342520000000 movr14,qword ptr gs:[20h]fffff803`0fc63adc 33d2xoredx,edxfffff803`0fc63ade 488bcfmovrcx,rdifffff803`0fc63ae1 e86aa2fdffcallnt!KiCancelTimer (fffff803`0fc3dd50)fffff803`0fc63ae6 440fb6e0movzxr12d,alfffff803`0fc63aea 48897730movqword ptr [rdi+30h],rsifffff803`0fc63aee 33c0xoreax,eaxfffff803`0fc63af0 44897f3cmovdword ptr [rdi+3Ch],r15dfffff803`0fc63af4 8b0fmovecx,dword ptr [rdi]fffff803`0fc63af6 4889442430movqword ptr [rsp+30h],raxfffff803`0fc63afb 894c2430movdword ptr [rsp+30h],ecxfffff803`0fc63aff 488bcbmovrcx,rbxfffff803`0fc63b02 48c1e920shrrcx,20hfffff803`0fc63b06 4889442438movqword ptr [rsp+38h],raxfffff803`0fc63b0b 4889442440movqword ptr [rsp+40h],raxfffff803`0fc63b10 40886c2431movbyte ptr [rsp+31h],bplfffff803`0fc63b15 85c9testecx,ecxfffff803`0fc63b17 0f89c0000000jnsnt!KiSetTimerEx+0x17d (fffff803`0fc63bdd)fffff803`0fc63b1d 33c9xorecx,ecxfffff803`0fc63b1f 8bd1movedx,ecxfffff803`0fc63b21 40f6c5fctestbpl,0FChfffff803`0fc63b25 0f85a3000000jnent!KiSetTimerEx+0x16e (fffff803`0fc63bce)fffff803`0fc63b2b 48894c2420movqword ptr [rsp+20h],rcxfffff803`0fc63b30 48b80800000080f7ffff mov rax,0FFFFF78000000008hfffff803`0fc63b3a 4d8bc5movr8,r13fffff803`0fc63b3d 488b00movrax,qword ptr [rax]fffff803`0fc63b40 804c243340orbyte ptr [rsp+33h],40hfffff803`0fc63b45 482bc3subrax,rbxfffff803`0fc63b48 48894718movqword ptr [rdi+18h],raxfffff803`0fc63b4c 4803c2addrax,rdxfffff803`0fc63b4f 48c1e812shrrax,12hfffff803`0fc63b53 488bd7movrdx,rdifffff803`0fc63b56 440fb6c8movzxr9d,alfffff803`0fc63b5a 44884c2432movbyte ptr [rsp+32h],r9bfffff803`0fc63b5f 8b442430moveax,dword ptr [rsp+30h]fffff803`0fc63b63 8907movdword ptr [rdi],eaxfffff803`0fc63b65 894f04movdword ptr [rdi+4],ecxfffff803`0fc63b68 498bcemovrcx,r14fffff803`0fc63b6b e8209ffdffcallnt!KiInsertTimerTable (fffff803`0fc3da90)fffff803`0fc63b70 84c0testal,alfffff803`0fc63b72 0f8495000000jent!KiSetTimerEx+0x1ad (fffff803`0fc63c0d)fffff803`0fc63b78 f7058608510000000200 test dword ptr [nt!PerfGlobalGroupMask+0x8 (fffff803`10174408)],20000hfffff803`0fc63b82 0f852f2d1a00jnent!KiSetTimerEx+0x1a2e57 (fffff803`0fe068b7)fffff803`0fc63b88 f081277ffffffflock and dword ptr [rdi],0FFFFFF7Fhfffff803`0fc63b8f 488b8424a0000000 movrax,qword ptr [rsp+0A0h]fffff803`0fc63b97 4533c9xorr9d,r9dfffff803`0fc63b9a 33d2xoredx,edxfffff803`0fc63b9c 88442420movbyte ptr [rsp+20h],alfffff803`0fc63ba0 498bcemovrcx,r14fffff803`0fc63ba3 458d4101lear8d,[r9+1]fffff803`0fc63ba7 e8044efeffcallnt!KiExitDispatcher (fffff803`0fc489b0)

经验总结扩展阅读