当前位置: 首页 > news >正文

驱动开发之遍历驱动

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

在内核中,每一个已加载的模块(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;}
http://www.cnnetsun.cn/news/29015.html

相关文章:

  • 7步掌握3D风场可视化神器:从零开始构建你的大气数据探索平台
  • 2025合规AI新范式:Apertus大模型如何重塑跨境业务与多语言服务
  • MiniMax-M2震撼发布:100亿激活参数改写大模型效率法则,开源模型全球性能榜首
  • Amlogic S9XXX Armbian 完整教程:从电视盒子到专业服务器的转变之路
  • WE Learn助手:网课学习的终极解决方案
  • 3步轻松搭建Kodi 115网盘原码播放系统:告别下载烦恼
  • Zotero Reading List终极指南:高效管理文献阅读进度的完整方案
  • Emu3.5-Image:20倍推理加速的多模态图像生成革命
  • 透明任务栏革命:用TranslucentTB解锁Windows桌面美学新境界
  • GetQzonehistory:QQ空间记忆一键永久保存的完整教程
  • AudioShare音频传输工具:5分钟实现Windows到安卓的无线音频共享
  • EdgeRemover:Windows系统Edge浏览器安全卸载终极指南
  • 资源嗅探工具实战宝典:解锁Cat-Catch高效媒体下载全攻略
  • Universal Pokemon Randomizer ZX:3分钟掌握宝可梦游戏终极定制方案
  • memtest_vulkan:专业级GPU显存稳定性检测完全指南
  • 11、Free Haven:匿名存储系统的设计与挑战
  • 26、Samba 4 配置与使用指南
  • 29、网络管理与 FreeIPA 部署全解析
  • 38、声誉系统的构建与优化
  • 41、声誉服务器:原理、架构与应用
  • 38、Samba网络维护与故障排除全解析
  • 突破生成式AI边界:NextStep-1模型实现文本到图像的高保真飞跃
  • 61亿激活参数挑战400亿性能壁垒:Ling-flash-2.0重新定义大模型效率标杆
  • 10、UNIX 系统电子邮件使用指南
  • 5、代码性能优化工作流指南
  • 9、Linux 性能监测:Perf 工具与事件基础设施详解
  • 5、神经网络模型基础:权重设置方法与时间处理策略
  • 17、利用神经网络模型探索行为进化
  • 敏捷第10讲:别再纠结用什么工具了,让信息流动起来才是关键
  • 10、PKI、证书与OpenSSL详解