设为首页 加入收藏

TOP

驱动开发:内核枚举Registry注册表回调(三)
2023-07-23 13:29:49 】 浏览:79
Tags:Registry
00 je nt!CmUnRegisterCallback+0x157 (fffff806`3a427297) Branch */ pAddress = SearchMemory(pCmUnRegisterCallback, (PVOID)((PUCHAR)pCmUnRegisterCallback + 0xFF), pSpecialData, ulSpecialDataSize); if (NULL == pAddress) { return pCallbackListHead; } // 先获取偏移再计算地址 lOffset = *(PLONG)((PUCHAR)pAddress + lSpecialOffset); pCallbackListHead = (PVOID)((PUCHAR)pAddress + lSpecialOffset + sizeof(LONG) + lOffset); return pCallbackListHead; } // 注册表回调函数结构体定义 typedef struct _CM_NOTIFY_ENTRY { LIST_ENTRY ListEntryHead; ULONG UnKnown1; ULONG UnKnown2; LARGE_INTEGER Cookie; PVOID Context; PVOID Function; }CM_NOTIFY_ENTRY, *PCM_NOTIFY_ENTRY; VOID UnDriver(PDRIVER_OBJECT Driver) { } NTSTATUS DriverEntry(IN PDRIVER_OBJECT Driver, PUNICODE_STRING RegistryPath) { PVOID pCallbackListHeadAddress = NULL; RTL_OSVERSIONINFOW osInfo = { 0 }; UCHAR pSpecialData[50] = { 0 }; ULONG ulSpecialDataSize = 0; LONG lSpecialOffset = 0; DbgPrint("hello lyshark.com \n"); // 查找 fffff806`3a4271b3 488d0d06eac3ff lea rcx,[nt!CallbackListHead (fffff806`3a065bc0)] /* lyshark.com> nt!CmUnRegisterCallback+0x6b: fffff806`3a4271ab 4533c0 xor r8d,r8d fffff806`3a4271ae 488d542438 lea rdx,[rsp+38h] fffff806`3a4271b3 488d0d06eac3ff lea rcx,[nt!CallbackListHead (fffff806`3a065bc0)] fffff806`3a4271ba e855e2e2ff call nt!CmListGetNextElement (fffff806`3a255414) fffff806`3a4271bf 488bf8 mov rdi,rax fffff806`3a4271c2 4889442440 mov qword ptr [rsp+40h],rax fffff806`3a4271c7 4885c0 test rax,rax fffff806`3a4271ca 0f84c7000000 je nt!CmUnRegisterCallback+0x157 (fffff806`3a427297) Branch */ pSpecialData[0] = 0x48; pSpecialData[1] = 0x8D; pSpecialData[2] = 0x0D; ulSpecialDataSize = 3; // 根据特征码获取地址 pCallbackListHeadAddress = SearchCallbackListHead(pSpecialData, ulSpecialDataSize, lSpecialOffset); DbgPrint("[LyShark.com] CallbackListHead => %p \n", pCallbackListHeadAddress); // 遍历链表结构 ULONG i = 0; PCM_NOTIFY_ENTRY pNotifyEntry = NULL; if (NULL == pCallbackListHeadAddress) { return FALSE; } // 开始遍历双向链表 pNotifyEntry = (PCM_NOTIFY_ENTRY)pCallbackListHeadAddress; do { // 判断pNotifyEntry地址是否有效 if (FALSE == MmIsAddressValid(pNotifyEntry)) { break; } // 判断回调函数地址是否有效 if (MmIsAddressValid(pNotifyEntry->Function)) { DbgPrint("[LyShark.com] 回调函数地址: 0x%p | 回调函数Cookie: 0x%I64X \n", pNotifyEntry->Function, pNotifyEntry->Cookie.QuadPart); } // 获取下一链表 pNotifyEntry = (PCM_NOTIFY_ENTRY)pNotifyEntry->ListEntryHead.Flink; } while (pCallbackListHeadAddress != (PVOID)pNotifyEntry); Driver->DriverUnload = UnDriver; return STATUS_SUCCESS; }

最终运行这个驱动程序,输出如下效果:

目前系统中有两个回调函数,这一点在第一张图片中也可以得到,枚举是正确的。

首页 上一页 1 2 3 下一页 尾页 3/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇VSCode搭建C和C++环境 下一篇菜鸟记录:c语言实现PAT甲级1002-..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目