如上汇编代码KiSetTimerEx
中就是DPC加密细节 , 如果需要解密只需要逆操作即可 , 此处我就具体分析下加密细节 , 分析这个东西我建议你使用记事本带着色的 。
分析思路是这样的 , 首先这里要传入待加密的DPC数据 , 然后经过KiWaitNever
和KiWaitAlways
对数据进行xor,ror,bswap
等操作 。
文章插图
将解密流程通过代码的方式实现 。
#include <ntddk.h>#include <ntstrsafe.h>// 解密DPCvoid DPC_Print(PKTIMER ptrTimer){ULONG_PTR ptrDpc = (ULONG_PTR)ptrTimer->Dpc;KDPC* DecDpc = NULL;DWORD nShift = (p2dq(ptrKiWaitNever) & 0xFF);// _RSI->Dpc = (_KDPC *)v19;// _RSI = Timer;ptrDpc ^= p2dq(ptrKiWaitNever);// v19 = KiWaitNever ^ v18;ptrDpc = _rotl64(ptrDpc, nShift);// v18 = __ROR8__((unsigned __int64)Timer ^ _RBX, KiWaitNever);ptrDpc ^= (ULONG_PTR)ptrTimer;ptrDpc = _byteswap_uint64(ptrDpc);// __asm { bswaprbx }ptrDpc ^= p2dq(ptrKiWaitAlways);// _RBX = (unsigned __int64)DPC ^ KiWaitAlways;// real DPCif (MmIsAddressValid((PVOID)ptrDpc)){DecDpc = (KDPC*)ptrDpc;DbgPrint("DPC = %p | routine = %p \n", DecDpc, DecDpc->DeferredRoutine);}}VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint("卸载完成... \n");}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){DbgPrint("hello lyshark.com");PKTIMER ptrTimer = NULL;DPC_Print(ptrTimer);Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}
接着将这些功能通过代码实现 , 首先得到我们需要的函数地址 , 这些地址包括 。ULONG_PTR ptrKiProcessorBlock = 0xfffff80770a32cc0;ULONG_PTR ptrOffsetKTimerTable = 0x3680;ULONG_PTR ptrKiWaitNever = 0xfffff80770a316f8;ULONG_PTR ptrKiWaitAlways = 0xfffff80770a318e8;
此处我把它分为三步走 , 第一步找到KiProcessorBlock
函数地址 , 第二步找到KeSetTimer
并从里面寻找KeSetTimerEx
, 第三步根据KiSetTimerEx
地址 , 搜索到KiWaitNever(),KiWaitAlways()
这两个函数内存地址 , 最终循环链表并解密DPC队列 。第一步: 找到
KiProcessorBlock
函数地址 , 该地址可通过__readmsr()
寄存器相加偏移得到 。在WinDBG中可以输入
rdmsr c0000082
得到MSR地址 。文章插图
MSR寄存器
使用代码获取
也是很容易 , 只要找到MSR地址在加上0x20
即可得到KiProcessorBlock
的地址了 。/*lyshark.com 0: kd> dp !KiProcessorBlockfffff807`70a32cc0fffff807`6f77c180 ffffbe81`3cee0180fffff807`70a32cd000000000`00000000 00000000`00000000fffff807`70a32ce000000000`00000000 00000000`00000000fffff807`70a32cf000000000`00000000 00000000`00000000fffff807`70a32d0000000000`00000000 00000000`00000000fffff807`70a32d1000000000`00000000 00000000`00000000fffff807`70a32d2000000000`00000000 00000000`00000000fffff807`70a32d3000000000`00000000 00000000`00000000*/#include <ntddk.h>#include <ntstrsafe.h>// 得到KiProcessorBlock地址ULONG64 GetKiProcessorBlock(){ULONG64 PrcbAddress = 0;PrcbAddress = (ULONG64)__readmsr(0xC0000101) + 0x20;if (PrcbAddress != 0){// PrcbAddress 是一个地址 这个地址存放了某个 CPU 的 _KPRCB 的地址return *(ULONG_PTR*)PrcbAddress;}return 0;}VOID UnDriver(PDRIVER_OBJECT driver){DbgPrint("卸载完成... \n");}NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath){DbgPrint("hello lyshark.com \n");ULONG64 address = GetKiProcessorBlock();if (address != 0){DbgPrint("KiProcessorBlock = %p \n", address);}Driver->DriverUnload = UnDriver;return STATUS_SUCCESS;}
经验总结扩展阅读
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- 如何更新电脑的显卡驱动(笔记本显卡驱动要不要更新)
- 你Win7系统如何将显卡驱动更新到最新版本
- envoy开发调试环境搭建
- 云原生时代的DevOps平台设计之道
- IOS12未受信任的企业级开发者怎么解决
- Taurus.MVC 微服务框架 入门开发教程:项目部署:7、微服务节点的监控与告警。
- 如何解决未受信任的企业级开发者的问题(如何安装未受信任的企业级开发者)
- ipad未受信任的企业级开发者怎么解决(ipad开发者模式)
- 未受信任的企业级开发者怎么设置(未受信任的企业级开发者有危险吗)
- ipad未受信任的企业级开发者怎么打开(软件在ipad上不受信任)