要获取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. 面经手册 · 第4篇《HashMap数据插入、查找、删除、遍历,源码分析》

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

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

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

  3. Linux内核源码分析方法

    一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...

  4. Linux内核源码分析 day01——内存寻址

    前言 Linux内核源码分析 Antz系统编写已经开始了内核部分了,在编写时同时也参考学习一点Linux内核知识. 自制Antz操作系统 一个自制的操作系统,Antz .半图形化半命令式系统,同时嵌入 ...

  5. 一步步实现windows版ijkplayer系列文章之六——SDL2源码分析之OpenGL ES在windows上的渲染过程

    一步步实现windows版ijkplayer系列文章之一--Windows10平台编译ffmpeg 4.0.2,生成ffplay 一步步实现windows版ijkplayer系列文章之二--Ijkpl ...

  6. Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7)【转】

    原文地址:Linux内核源码分析--内核启动之(6)Image内核启动(do_basic_setup函数)(Linux-3.0 ARMv7) 作者:tekkamanninja 转自:http://bl ...

  7. 【转】Linux内核源码分析方法

    一.内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次.如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径.我们都 ...

  8. 内核通信之Netlink源码分析-用户内核通信原理2

    2017-07-05 上文以一个简单的案例描述了通过Netlink进行用户.内核通信的流程,本节针对流程中的各个要点进行深入分析 sock的创建 sock管理结构 sendmsg源码分析  sock的 ...

  9. Linux内核2.6.14源码分析-双向循环链表代码分析(巨详细)

    Linux内核源码分析-链表代码分析 分析人:余旭 分析时间:2005年11月17日星期四 11:40:10 AM 雨 温度:10-11度 编号:1-4 类别:准备工作 Email:yuxu97101 ...

随机推荐

  1. 一张图看懂normal,static,sealed,abstract 的 区别

    +-------------------------+---+--------+--------+--------+----------+ | Class Type | | normal | stat ...

  2. httpclient模拟post请求json封装表单数据

    好长时间不更博了,主要肚子里没什么好墨水,哈哈.废话不说上代码. public static String httpPostWithJSON(String url) throws Exception ...

  3. About vector

    今天打vector又打炸了不!高!兴! vecotr头文件 #include<vector> 定义域 using namespace std; 或using std::vector; 初始 ...

  4. ubuntu上mysql服务器安装后只能本地连接不能远程连接的问题

    安装好mysql后,想使用另一个电脑进行远程登录,在登录时 提示拒绝连接 百度后,发现需要两个步骤解决该问题 /etc/mysql/my.cnf 里修改bind_address = 0.0.0.0  ...

  5. poj -3262 Protecting the Flowers (贪心)

    http://poj.org/problem?id=3262 开始一直是理解错题意了!!导致不停wa. 这题是农夫有n头牛在花园里啃花朵,然后农夫要把它们赶回棚子,每次只能赶一头牛,并且给出赶回每头牛 ...

  6. css笔记14:css文件之间可以相互引用

    css文件之间相互引用是通过@import指令完成的 格式: @import  url("被引用的css文件"); 顺便说一句,如果希望在html或者php文件中引用某个xxx.c ...

  7. Nhibernate 多对多级联更新

    问题是这样的,有两个表:文章(Article)和分类(Lable),这两者之间的关系是多对多关联,如果你用Nhibernate来保存数据的话非常的好操作,新建Article,然后把Lable值赋值给A ...

  8. 【初码干货】关于.NET玩爬虫这些事

    这几天在微信群里又聊到.NET可以救中国但是案例太少不深的问题,我说.NET玩爬虫简直就是宇宙第一,于是大神朱永光说,你为何不来写一篇总结一下? 那么今天就全面的来总结一下,在.NET生态下,如何玩爬 ...

  9. 转载:selenium webdriver定位不到元素的五种原因及解决办法

    1.动态id定位不到元素for example:        //WebElement xiexin_element = driver.findElement(By.id("_mail_c ...

  10. Docker(十九)-Docker监控容器资源的占用情况

    启动一个容器并限制资源 启动一个centos容器,限制其内存为1G ,可用cpu数为2 [root@localhost ~]# docker run --name os1 -it -m 1g --cp ...