要获取windows 内核中所有驱动模块信息,调用 系统服务函数 NtQuerySystemInformation,参数SystemInformationClass 传入SystemModuleInformation.

NtQuerySystemInformation申明如下:

  1. //
  2. // System Information Classes.
  3. //
  4. typedef enum _SYSTEM_INFORMATION_CLASS {
  5. SystemBasicInformation,
  6. SystemProcessorInformation,              // obsolete...delete
  7. SystemPerformanceInformation,
  8. SystemTimeOfDayInformation,
  9. SystemPathInformation,
  10. SystemProcessInformation,                //系统进程信息
  11. SystemCallCountInformation,
  12. SystemDeviceInformation,
  13. SystemProcessorPerformanceInformation,
  14. SystemFlagsInformation,
  15. SystemCallTimeInformation,
  16. SystemModuleInformation,     //系统模块
  17. SystemLocksInformation,
  18. SystemStackTraceInformation,
  19. SystemPagedPoolInformation,
  20. SystemNonPagedPoolInformation,
  21. SystemHandleInformation,
  22. SystemObjectInformation,
  23. SystemPageFileInformation,
  24. SystemVdmInstemulInformation,
  25. SystemVdmBopInformation,
  26. SystemFileCacheInformation,
  27. SystemPoolTagInformation,
  28. SystemInterruptInformation,
  29. SystemDpcBehaviorInformation,
  30. SystemFullMemoryInformation,
  31. SystemLoadGdiDriverInformation,
  32. SystemUnloadGdiDriverInformation,
  33. SystemTimeAdjustmentInformation,
  34. SystemSummaryMemoryInformation,
  35. SystemMirrorMemoryInformation,
  36. SystemPerformanceTraceInformation,
  37. SystemObsolete0,
  38. SystemExceptionInformation,
  39. SystemCrashDumpStateInformation,
  40. SystemKernelDebuggerInformation,
  41. SystemContextSwitchInformation,
  42. SystemRegistryQuotaInformation,
  43. SystemExtendServiceTableInformation,
  44. SystemPrioritySeperation,
  45. SystemVerifierAddDriverInformation,
  46. SystemVerifierRemoveDriverInformation,
  47. SystemProcessorIdleInformation,
  48. SystemLegacyDriverInformation,
  49. SystemCurrentTimeZoneInformation,
  50. SystemLookasideInformation,
  51. SystemTimeSlipNotification,
  52. SystemSessionCreate,
  53. SystemSessionDetach,
  54. SystemSessionInformation,
  55. SystemRangeStartInformation,
  56. SystemVerifierInformation,
  57. SystemVerifierThunkExtend,
  58. SystemSessionProcessInformation,
  59. SystemLoadGdiDriverInSystemSpace,
  60. SystemNumaProcessorMap,
  61. SystemPrefetcherInformation,
  62. SystemExtendedProcessInformation,
  63. SystemRecommendedSharedDataAlignment,
  64. SystemComPlusPackage,
  65. SystemNumaAvailableMemory,
  66. SystemProcessorPowerInformation,
  67. SystemEmulationBasicInformation,
  68. SystemEmulationProcessorInformation,
  69. SystemExtendedHandleInformation,
  70. SystemLostDelayedWriteInformation,
  71. SystemBigPoolInformation,
  72. SystemSessionPoolTagInformation,
  73. SystemSessionMappedViewInformation,
  74. SystemHotpatchInformation,
  75. SystemObjectSecurityMode,
  76. SystemWatchdogTimerHandler,
  77. SystemWatchdogTimerInformation,
  78. SystemLogicalProcessorInformation,
  79. SystemWow64SharedInformation,
  80. SystemRegisterFirmwareTableInformationHandler,
  81. SystemFirmwareTableInformation,
  82. SystemModuleInformationEx,
  83. SystemVerifierTriageInformation,
  84. SystemSuperfetchInformation,
  85. SystemMemoryListInformation,
  86. SystemFileCacheInformationEx,
  87. MaxSystemInfoClass   // MaxSystemInfoClass should always be the last enum
  88. } SYSTEM_INFORMATION_CLASS;
//
// System Information Classes.
//
typedef enum _SYSTEM_INFORMATION_CLASS {
SystemBasicInformation,
SystemProcessorInformation, // obsolete...delete
SystemPerformanceInformation,
SystemTimeOfDayInformation,
SystemPathInformation,
SystemProcessInformation, //系统进程信息
SystemCallCountInformation,
SystemDeviceInformation,
SystemProcessorPerformanceInformation,
SystemFlagsInformation,
SystemCallTimeInformation,
SystemModuleInformation, //系统模块
SystemLocksInformation,
SystemStackTraceInformation,
SystemPagedPoolInformation,
SystemNonPagedPoolInformation,
SystemHandleInformation,
SystemObjectInformation,
SystemPageFileInformation,
SystemVdmInstemulInformation,
SystemVdmBopInformation,
SystemFileCacheInformation,
SystemPoolTagInformation,
SystemInterruptInformation,
SystemDpcBehaviorInformation,
SystemFullMemoryInformation,
SystemLoadGdiDriverInformation,
SystemUnloadGdiDriverInformation,
SystemTimeAdjustmentInformation,
SystemSummaryMemoryInformation,
SystemMirrorMemoryInformation,
SystemPerformanceTraceInformation,
SystemObsolete0,
SystemExceptionInformation,
SystemCrashDumpStateInformation,
SystemKernelDebuggerInformation,
SystemContextSwitchInformation,
SystemRegistryQuotaInformation,
SystemExtendServiceTableInformation,
SystemPrioritySeperation,
SystemVerifierAddDriverInformation,
SystemVerifierRemoveDriverInformation,
SystemProcessorIdleInformation,
SystemLegacyDriverInformation,
SystemCurrentTimeZoneInformation,
SystemLookasideInformation,
SystemTimeSlipNotification,
SystemSessionCreate,
SystemSessionDetach,
SystemSessionInformation,
SystemRangeStartInformation,
SystemVerifierInformation,
SystemVerifierThunkExtend,
SystemSessionProcessInformation,
SystemLoadGdiDriverInSystemSpace,
SystemNumaProcessorMap,
SystemPrefetcherInformation,
SystemExtendedProcessInformation,
SystemRecommendedSharedDataAlignment,
SystemComPlusPackage,
SystemNumaAvailableMemory,
SystemProcessorPowerInformation,
SystemEmulationBasicInformation,
SystemEmulationProcessorInformation,
SystemExtendedHandleInformation,
SystemLostDelayedWriteInformation,
SystemBigPoolInformation,
SystemSessionPoolTagInformation,
SystemSessionMappedViewInformation,
SystemHotpatchInformation,
SystemObjectSecurityMode,
SystemWatchdogTimerHandler,
SystemWatchdogTimerInformation,
SystemLogicalProcessorInformation,
SystemWow64SharedInformation,
SystemRegisterFirmwareTableInformationHandler,
SystemFirmwareTableInformation,
SystemModuleInformationEx,
SystemVerifierTriageInformation,
SystemSuperfetchInformation,
SystemMemoryListInformation,
SystemFileCacheInformationEx,
MaxSystemInfoClass // MaxSystemInfoClass should always be the last enum
} SYSTEM_INFORMATION_CLASS;
  1. NTSTATUS
  2. NtQuerySystemInformation (
  3. IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
  4. OUT PVOID SystemInformation,
  5. IN ULONG SystemInformationLength,
  6. OUT PULONG ReturnLength OPTIONAL
  7. )
NTSTATUS
NtQuerySystemInformation (
IN SYSTEM_INFORMATION_CLASS SystemInformationClass,
OUT PVOID SystemInformation,
IN ULONG SystemInformationLength,
OUT PULONG ReturnLength OPTIONAL
)

根据泄漏出的widows 2000 部分源代码,NtQuerySystemInformation 有关 SystemModuleInformation的实现部分如下:

  1. case SystemModuleInformation:
  2. KeEnterCriticalRegion();
  3. ExAcquireResourceExclusive( &PsLoadedModuleResource, TRUE );
  4. ReleaseModuleResoure = TRUE;
  5. Status = ExpQueryModuleInformation( &PsLoadedModuleList,
  6. &MmLoadedUserImageList,
  7. (PRTL_PROCESS_MODULES)SystemInformation,
  8. SystemInformationLength,
  9. ReturnLength
  10. );
  11. ExReleaseResource (&PsLoadedModuleResource);
  12. ReleaseModuleResoure = FALSE;
  13. KeLeaveCriticalRegion();
  14. break;
case SystemModuleInformation:
KeEnterCriticalRegion();
ExAcquireResourceExclusive( &PsLoadedModuleResource, TRUE );
ReleaseModuleResoure = TRUE;
Status = ExpQueryModuleInformation( &PsLoadedModuleList,
&MmLoadedUserImageList,
(PRTL_PROCESS_MODULES)SystemInformation,
SystemInformationLength,
ReturnLength
);
ExReleaseResource (&PsLoadedModuleResource);
ReleaseModuleResoure = FALSE;
KeLeaveCriticalRegion();
break;

在Windows内核实现中,存在两个存储系统加载模块的两个链表,分别是PsLoadedModuleList和 MmLoadedUserImageList,两个全局变量 申明如下:

  1. LIST_ENTRY PsLoadedModuleList;//驱动模块列表
  2. LIST_ENTRY MmLoadedUserImageList;//应用程序映像列表
LIST_ENTRY PsLoadedModuleList;//驱动模块列表
LIST_ENTRY MmLoadedUserImageList;//应用程序映像列表

Windows就是通过这两个链表将代表系统模块的_LDR_DATA_ENTRY结构链接在一起。

_LDR_DATA_ENTRY结构体中有3个 _LIST_ENTRY,系统根据不同排列顺序串连系统中所加载的所有模块,情况就相当明显了,只要遍历任何一个双向链表,即可获得加载的模块信息。

在Windows 内核中,表示每个模块的数据结构是_LDR_DATA_TABLE_ENTRY,其结构申明为:

  1. kd> dt _LDR_DATA_TABLE_ENTRY
  2. nt!_LDR_DATA_TABLE_ENTRY
  3. +0x000 InLoadOrderLinks : _LIST_ENTRY
  4. +0x008 InMemoryOrderLinks : _LIST_ENTRY
  5. +0x010 InInitializationOrderLinks : _LIST_ENTRY
  6. +0x018 DllBase          : Ptr32 Void
  7. +0x01c EntryPoint       : Ptr32 Void
  8. +0x020 SizeOfImage      : Uint4B
  9. +0x024 FullDllName      : _UNICODE_STRING
  10. +0x02c BaseDllName      : _UNICODE_STRING
  11. +0x034 Flags            : Uint4B
  12. +0x038 LoadCount        : Uint2B
  13. +0x03a TlsIndex         : Uint2B
  14. +0x03c HashLinks        : _LIST_ENTRY
  15. +0x03c SectionPointer   : Ptr32 Void
  16. +0x040 CheckSum         : Uint4B
  17. +0x044 TimeDateStamp    : Uint4B
  18. +0x044 LoadedImports    : Ptr32 Void
  19. +0x048 EntryPointActivationContext : Ptr32 Void
  20. +0x04c PatchInformation : Ptr32 Void
kd> dt _LDR_DATA_TABLE_ENTRY
nt!_LDR_DATA_TABLE_ENTRY
+0x000 InLoadOrderLinks : _LIST_ENTRY
+0x008 InMemoryOrderLinks : _LIST_ENTRY
+0x010 InInitializationOrderLinks : _LIST_ENTRY
+0x018 DllBase : Ptr32 Void
+0x01c EntryPoint : Ptr32 Void
+0x020 SizeOfImage : Uint4B
+0x024 FullDllName : _UNICODE_STRING
+0x02c BaseDllName : _UNICODE_STRING
+0x034 Flags : Uint4B
+0x038 LoadCount : Uint2B
+0x03a TlsIndex : Uint2B
+0x03c HashLinks : _LIST_ENTRY
+0x03c SectionPointer : Ptr32 Void
+0x040 CheckSum : Uint4B
+0x044 TimeDateStamp : Uint4B
+0x044 LoadedImports : Ptr32 Void
+0x048 EntryPointActivationContext : Ptr32 Void
+0x04c PatchInformation : Ptr32 Void

jpg改rar

Windows内核遍历驱动模块源码分析的更多相关文章

  1. Linux 内核调度器源码分析 - 初始化

    导语 上篇系列文 混部之殇-论云原生资源隔离技术之CPU隔离(一) 介绍了云原生混部场景中CPU资源隔离核心技术:内核调度器,本系列文章<Linux内核调度器源码分析>将从源码的角度剖析内 ...

  2. 鸿蒙轻内核M核源码分析:LibC实现之Musl LibC

    摘要:本文学习了LiteOS-M内核Musl LibC的实现,特别是文件系统和内存分配释放部分. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列十九 Musl LibC>,作者:zhus ...

  3. HashSet 添加/遍历元素源码分析

    HashSet 类图 HashSet 简单说明 HashSet 实现了 Set 接口 HashSet 底层实际上是由 HashMap 实现的 public HashSet() { map = new ...

  4. 面经手册 · 第4篇《HashMap数据插入、查找、删除、遍历,源码分析》

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 在上一章节我们讲解并用数据验证了,HashMap中的,散列表的实现.扰动函数.负载因 ...

  5. ARMv8 Linux内核head.S源码分析

    ARMv8Linux内核head.S主要工作内容: 1. 从el2特权级退回到el1 2. 确认处理器类型 3. 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4. 验证设备树的地址是否有 ...

  6. 鸿蒙轻内核源码分析:文件系统FatFS

    摘要:本文为大家介绍FatFS文件系统结构体的结构体和全局变量,并分析FatFS文件操作接口. 本文分享自华为云社区<鸿蒙轻内核M核源码分析系列二一 03 文件系统FatFS>,作者:zh ...

  7. 鸿蒙轻内核源码分析:文件系统LittleFS

    摘要:本文先介绍下LFS文件系统结构体的结构体和全局变量,然后分析下LFS文件操作接口. 本文分享自华为云社区<# 鸿蒙轻内核M核源码分析系列二一 02 文件系统LittleFS>,作者: ...

  8. 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 百篇博客分析OpenHarmony源码 | v67.01

    百篇博客系列篇.本篇为: v67.xx 鸿蒙内核源码分析(字符设备篇) | 字节为单位读写的设备 | 51.c.h.o 文件系统相关篇为: v62.xx 鸿蒙内核源码分析(文件概念篇) | 为什么说一 ...

  9. 鸿蒙内核源码分析(GN应用篇) | GN语法及在鸿蒙的使用 | 百篇博客分析OpenHarmony源码 | v60.01

    百篇博客系列篇.本篇为: v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 | 51.c.h.o 编译构建相关篇为: v50.xx 鸿蒙内核源码分析(编译环境篇) | 编译鸿蒙 ...

随机推荐

  1. 如何判断自己的VPS是那种虚拟技术实现的

    我们知道VPS的虚拟技术有许多种,如Openvz.Xen.VMware vSphere.Hyper-V.KVM及Xen的HVM与PV等.在Xen中pv是半虚拟化,hvm是全虚拟化,pv只能用于linu ...

  2. FastJson的简单实用

    一.FastJson的理解 在工作中,经常客服端需要和服务端进行通信,目前很多项目都采用JSON的方式进行数据传输,简单的参数可以通过手动拼接JSON字符串,但如果请求的参数过多,采用手动拼接JSON ...

  3. Linux下因为系统编码问题造成乱码的解决办法

    2016年12月13日18:34:32 -------------------------------- 最近一段时间遇到一些润乾报表的应用在linux系统下面乱码的问题,最后检查后都发现是客户的li ...

  4. <<< sqlserver评估过期解决

    点击开始-所有程序-Microsoft SQL Server 2008-配置工具-SQL Server 安装中心然后点击左侧的维护,在点击右侧的版本升级,接着按照提示一直点下一步,到产品密钥的时候输入 ...

  5. Java的发展历程

    Java的发展历程充满了传奇色彩. 最初,Java是由Sun公司的一个研究小组开发出来的, 该小组起先的目标是想用软件实现对家用电器进行集成控制的小型控制装置. 开始,准备采用C++,但C++太复杂, ...

  6. HTTP超文本传输协议-HTTP/1.1中文版

    摘要 超文本传输协议(HTTP)是一种为分布式,合作式,多媒体信息系统服务,面向应用层的协议.它是一种通用的,不分状态(stateless)的协议,除了诸如名称服务和分布对象管理系统之类的超文本用途外 ...

  7. 探索ASP.NET MVC框架之控制器的查找与激活机制

    引言 前面一篇博文我们介绍了MVC框架的路由机制,我们知道一个URL请求如何从ASP.NET处理管线到达了IHttpHandler实例(MvcHandler).今天我们从MvcHandler来进行下一 ...

  8. [NHibernate]立即加载

    目录 写在前面 文档与系列文章 立即加载 一个例子 总结 写在前面 上篇文章介绍了nhibernate延迟加载的相关内容,简单回顾一下延迟加载,就是需要的时候再去加载,需要的时候再向数据库发出sql指 ...

  9. PHP慢脚本日志和Mysql的慢查询日志

    1.PHP慢脚本日志 间歇性的502,是后端 PHP-FPM 不可用造成的,间歇性的502一般认为是由于 PHP-FPM 进程重启造成的. 在 PHP-FPM 的子进程数目超过的配置中的数量时候,会出 ...

  10. UIScrollView的代理(delegate)

    很多时候,我们想在UIScrollView正在滚动 或 滚动到某个位置 或者 停止滚动 时做一些特定的操作 要想完成上述功能,前提条件就是能够监听到UIScrollView的整个滚动过程 当UIScr ...