news 2026/5/1 7:27:48

驱动开发之遍历驱动

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
驱动开发之遍历驱动

一、目标:遍历系统中所有已加载驱动

在内核中,每一个已加载的模块(exe / dll / sys)都会有一个
_LDR_DATA_TABLE_ENTRY结构体描述它。

对于驱动来说:会把“当前驱动对应的那个 _LDR_DATA_TABLE_ENTRY 的地址” 存放在 DriverObject->DriverSection 中。 DriverObject->DriverSection=当前驱动自己的 _LDR_DATA_TABLE_ENTRY

_LDR_DATA_TABLE_ENTRY并不是孤立存在的, 它的第一个成员InLoadOrderLinks表明:这个结构被设计成“可挂入链表的节点”。
换句话说:每一个模块的_LDR_DATA_TABLE_ENTRY,都和其它模块的_LDR_DATA_TABLE_ENTRY通过LIST_ENTRY相互连接

二、遍历的本质

遍历代码做的事情只有三步:

  1. 拿到当前驱动的_LDR_DATA_TABLE_ENTRY

  2. 通过它的InLoadOrderLinks.Flink找到“下一个节点”

  3. 再从这个节点还原出下一个模块的 _LDR_DATA_TABLE_ENTRY

遍历驱动

完整代码:

#include<ntddk.h>typedefstruct_LDR_DATA_TABLE_ENTRY{LIST_ENTRY InLoadOrderLinks;LIST_ENTRY InMemoryOrderLinks;LIST_ENTRY InInitializationOrderLinks;PVOID DllBase;PVOID EntryPoint;ULONG SizeOfImage;UNICODE_STRING FullDllName;UNICODE_STRING BaseDllName;ULONG Flags;USHORT LoadCount;USHORT TlsIndex;LIST_ENTRY HashLinks;PVOID SectionPointer;ULONG CheckSum;ULONG TimeDateStamp;PVOID LoadedImports;PVOID EntryPointActivationContext;PVOID PatchInformation;LIST_ENTRY ForwarderLinks;LIST_ENTRY ServiceTagLinks;LIST_ENTRY StaticLinks;PVOID ContextInformation;ULONG OriginalBase;LARGE_INTEGER LoadTime;}LDR_DATA_TABLE_ENTRY,*PLDR_DATA_TABLE_ENTRY;// 卸载函数VOIDDriverUnload(PDRIVER_OBJECT DriverObject){DbgPrint("(mydriver) 驱动程序停止运行了。\n");}NTSTATUSDriverEntry(PDRIVER_OBJECT DriverObject,PUNICODE_STRING RegistryPath){DbgPrint("(mydriver) DRIVER_OBJECT 地址:%p\n",DriverObject);DbgPrint("(mydriver) 驱动名称:%wZ\n",&DriverObject->DriverName);DbgPrint("(mydriver) 模块基址:%p\n",DriverObject->DriverStart);DbgPrint("(mydriver) 模块大小:0x%X\n",DriverObject->DriverSize);DbgPrint("(mydriver) -------开始遍历模块-------\n");// DriverSection 通常指向当前驱动自身的 LDR_DATA_TABLE_ENTRYPLDR_DATA_TABLE_ENTRY first=(PLDR_DATA_TABLE_ENTRY)DriverObject->DriverSection;if(first==NULL){DbgPrint("(mydriver) DriverSection 为空,无法遍历。\n");DriverObject->DriverUnload=DriverUnload;returnSTATUS_SUCCESS;}// 用 LIST_ENTRY 来做链表遍历PLIST_ENTRY head=&first->InLoadOrderLinks;PLIST_ENTRY cur=head->Flink;inti=0;while(cur!=head){// 从 LIST_ENTRY* 还原回 LDR_DATA_TABLE_ENTRY*PLDR_DATA_TABLE_ENTRY ldr=CONTAINING_RECORD(cur,LDR_DATA_TABLE_ENTRY,InLoadOrderLinks);if(ldr->FullDllName.Length!=0){DbgPrint("(mydriver) [%d] %wZ\n",i++,&ldr->FullDllName);// DbgPrint("(mydriver) Base: %wZ\n", &ldr->BaseDllName);// DbgPrint("(mydriver) BaseAddr: %p\n", ldr->DllBase);// DbgPrint("(mydriver) Size: 0x%X\n", ldr->SizeOfImage);}cur=cur->Flink;}DbgPrint("(mydriver) -------遍历结束-------\n");DriverObject->DriverUnload=DriverUnload;returnSTATUS_SUCCESS;}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/29 2:45:48

TranslucentTB开机自启动完全指南:问题树分析与实战解决方案

TranslucentTB开机自启动完全指南&#xff1a;问题树分析与实战解决方案 【免费下载链接】TranslucentTB 项目地址: https://gitcode.com/gh_mirrors/tra/TranslucentTB 你是否遇到过TranslucentTB开机自启动失效的困扰&#xff1f;明明设置了自启动&#xff0c;重启后…

作者头像 李华
网站建设 2026/4/30 12:46:03

PyPDF实战指南:从零开始掌握Python PDF处理

为什么选择PyPDF&#xff1f; 【免费下载链接】pypdf 项目地址: https://gitcode.com/gh_mirrors/pypd/pypdf 在Python生态中处理PDF文件时&#xff0c;你可能会遇到各种选择困难。PyPDF作为纯Python实现的PDF处理库&#xff0c;无需外部依赖即可完成大部分核心操作。相…

作者头像 李华
网站建设 2026/5/1 6:19:29

Vue2 老项目里,SCSS 和图片路径的“相爱相杀”——从踩坑到优雅

Vue2 老项目里&#xff0c;SCSS 和图片路径的“相爱相杀”——从踩坑到优雅Vue2 老项目里&#xff0c;SCSS 和图片路径的“相爱相杀”——从踩坑到优雅alias 不是“小老鼠”&#xff0c;它是任意门SCSS 引图片的“五连鞭”实战&#xff1a;让 sass-loader 乖乖叫“爸爸”翻车现…

作者头像 李华
网站建设 2026/5/1 6:18:11

CIDR合并工具:让IP地址管理变得简单高效

CIDR合并工具&#xff1a;让IP地址管理变得简单高效 【免费下载链接】cidr-merger A simple command line tool to merge ip/ip cidr/ip range, supports IPv4/IPv6 项目地址: https://gitcode.com/gh_mirrors/ci/cidr-merger 还在为管理复杂的IP地址段而烦恼吗&#xf…

作者头像 李华
网站建设 2026/5/1 6:18:51

终极ASMR下载指南:asmr-downloader让音频收藏变得如此简单

终极ASMR下载指南&#xff1a;asmr-downloader让音频收藏变得如此简单 【免费下载链接】asmr-downloader A tool for download asmr media from asmr.one(Thanks for the asmr.one) 项目地址: https://gitcode.com/gh_mirrors/as/asmr-downloader 在繁忙的现代生活中&am…

作者头像 李华