找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 47230|回复: 76

[科普]通过VAD枚举进程模块

 火... [复制链接]

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2017-10-31 18:07:59 | 显示全部楼层 |阅读模式
众所周知,进程模块的信息分别存在于PEB和VAD里。枚举PEB的文章很多,我就不赘述了。枚举VAD的文章很少,而且代码写得乱七八糟,于是决定写篇文章科普一下。由于VAD并不是微软公开的结构,所以不同系统的变化比较大,在我看来基本分为三个阶段:WINXP、WIN2K3~WIN8、WIN8.1~WIN10(目前版本是16299)。不过,所谓变化,都是形变神不变,这里以XP系统举例,因为XP系统的VAD结构最简单,方便理解。

VAD入口是EPROCESS->VadRoot。在XP下,WINDBG显示VadRoot的类型为PVOID,实际上它是MMVAD结构体的指针:
  1. /*lkd> dt_mmvad
  2. nt!_MMVAD
  3.    +0x000 StartingVpn      : Uint4B
  4.    +0x004 EndingVpn        : Uint4B
  5.    +0x008 Parent           : Ptr32 _MMVAD
  6.    +0x00c LeftChild        : Ptr32 _MMVAD
  7.    +0x010 RightChild       : Ptr32 _MMVAD
  8.    +0x014 u                : __unnamed
  9.    +0x018 ControlArea      : Ptr32 _CONTROL_AREA
  10.    +0x01c FirstPrototypePte : Ptr32 _MMPTE
  11.    +0x020 LastContiguousPte : Ptr32 _MMPTE
  12.    +0x024 u2               : __unnamed*/
  13. typedef struct _MMVAD2600
  14. {
  15.         ULONG StartingVpn;
  16.         ULONG EndingVpn;
  17.         struct _MMVAD2600 *Parent;
  18.         struct _MMVAD2600 *LeftChild;
  19.         struct _MMVAD2600 *RightChild;
  20.         void *u;
  21.         PCONTROL_AREA2600 ControlArea;
  22. }MMVAD2600, *PMMVAD2600;
复制代码
VAD结构本身并没有模块名称和模块地址,它们存储在ControlArea的下级结构里:
  1. /*lkd> dt_CONTROL_AREA
  2. nt!_CONTROL_AREA
  3.    +0x000 Segment          : Ptr32 _SEGMENT
  4.    +0x004 DereferenceList  : _LIST_ENTRY
  5.    +0x00c NumberOfSectionReferences : Uint4B
  6.    +0x010 NumberOfPfnReferences : Uint4B
  7.    +0x014 NumberOfMappedViews : Uint4B
  8.    +0x018 NumberOfSubsections : Uint2B
  9.    +0x01a FlushInProgressCount : Uint2B
  10.    +0x01c NumberOfUserReferences : Uint4B
  11.    +0x020 u                : __unnamed
  12.    +0x024 FilePointer      : Ptr32 _FILE_OBJECT     <---这里是模块对应文件的文件对象
  13.    +0x028 WaitingForDeletion : Ptr32 _EVENT_COUNTER
  14.    +0x02c ModifiedWriteCount : Uint2B
  15.    +0x02e NumberOfSystemCacheViews : Uint2B*/
  16. typedef struct _CONTROL_AREA2600
  17. {
  18.         PSEGMENT2600 Segment;
  19.         UCHAR WhoCare[0x24-sizeof(void*)];
  20.         PFILE_OBJECT FilePointer;
  21. }CONTROL_AREA2600, *PCONTROL_AREA2600;
复制代码
  1. /*lkd> dt_segment
  2. nt!_SEGMENT
  3.    +0x000 ControlArea      : Ptr32 _CONTROL_AREA
  4.    +0x004 TotalNumberOfPtes : Uint4B
  5.    +0x008 NonExtendedPtes  : Uint4B
  6.    +0x00c WritableUserReferences : Uint4B
  7.    +0x010 SizeOfSegment    : Uint8B
  8.    +0x018 SegmentPteTemplate : _MMPTE
  9.    +0x020 NumberOfCommittedPages : Uint4B
  10.    +0x024 ExtendInfo       : Ptr32 _MMEXTEND_INFO
  11.    +0x028 SystemImageBase  : Ptr32 Void
  12.    +0x02c BasedAddress     : Ptr32 Void     <---这里是模块地址   
  13.    +0x030 u1               : __unnamed
  14.    +0x034 u2               : __unnamed
  15.    +0x038 PrototypePte     : Ptr32 _MMPTE
  16.    +0x040 ThePtes          : [1] _MMPTE*/
  17. typedef struct _SEGMENT2600
  18. {
  19.         UCHAR WhoCare[0x2C];
  20.         PVOID BasedAddress;
  21. }SEGMENT2600, *PSEGMENT2600;
复制代码
VAD并不是简单的数组或链表结构,而是树结构。这棵树具体怎么样我就不多说了,反正你知道,它有“左孩子”和“右孩子”,得到第一个VAD结构体之后,顺着两个“孩子”走下去,直到“孩子”的地址为0或非法即可。枚举代码如下:
游客,如果您要查看本帖隐藏内容请回复
接下来是干货内容,关于在WIN7、WIN8和WIN10上枚举VAD需要注意的地方。
游客,如果您要查看本帖隐藏内容请回复

1

主题

35

回帖

0

精华

铜牌会员

积分
274
发表于 2017-10-31 18:10:36 | 显示全部楼层
非常感谢分享!

0

主题

111

回帖

0

精华

银牌会员

积分
340
发表于 2017-10-31 18:10:41 | 显示全部楼层
本帖最后由 CleanLove 于 2017-10-31 18:12 编辑

谢谢TA科普

1

主题

80

回帖

1

精华

铂金会员

积分
1818
发表于 2017-10-31 18:12:00 | 显示全部楼层
膜拜一下.

0

主题

21

回帖

0

精华

铜牌会员

积分
48
发表于 2017-10-31 18:12:24 | 显示全部楼层

非常感谢分享!

2

主题

29

回帖

1

精华

金牌会员

积分
1244
发表于 2017-10-31 18:42:45 | 显示全部楼层
实力UCHAR WhoCare[0x24-sizeof(void*)];

2

主题

43

回帖

0

精华

银牌会员

积分
397
发表于 2017-10-31 18:51:47 | 显示全部楼层
感觉很厉害

0

主题

23

回帖

0

精华

铜牌会员

积分
59
发表于 2017-10-31 19:02:48 | 显示全部楼层
厉害

0

主题

46

回帖

0

精华

铜牌会员

积分
195
发表于 2017-10-31 19:33:12 | 显示全部楼层
非常感谢分享!

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2017-10-31 20:47:07 | 显示全部楼层
其实这货我也打算发一份嘞,被捷足先登了,哈哈

评分

参与人数 1水晶币 +1 收起 理由
Tesla.Angela + 1 你发你的,不碍事啊。

查看全部评分

0

主题

24

回帖

0

精华

铜牌会员

积分
117
发表于 2017-10-31 21:57:23 来自手机 | 显示全部楼层
谢谢分享

1

主题

118

回帖

0

精华

金牌会员

积分
856
发表于 2017-11-1 09:30:17 | 显示全部楼层
看看,万一用到了呢

1

主题

77

回帖

0

精华

金牌会员

积分
1137
发表于 2017-11-2 10:56:35 | 显示全部楼层
干货来了

2

主题

23

回帖

0

精华

金牌会员

积分
938
发表于 2017-11-3 11:24:04 | 显示全部楼层
好久没有写驱动了,谢谢分享,~!

0

主题

28

回帖

0

精华

铜牌会员

积分
284
发表于 2017-11-4 01:45:32 | 显示全部楼层
学习一下!

0

主题

4

回帖

0

精华

初来乍到

积分
36
发表于 2017-11-6 21:50:15 | 显示全部楼层
感谢分享

0

主题

75

回帖

0

精华

铜牌会员

积分
95
发表于 2017-11-8 14:11:39 | 显示全部楼层
感谢大大分享!

0

主题

51

回帖

0

精华

铜牌会员

积分
90
发表于 2017-11-10 15:56:14 | 显示全部楼层
来学习一下

9

主题

53

回帖

0

精华

贵宾会员

积分
16
发表于 2017-11-15 14:25:08 | 显示全部楼层
学习学习

0

主题

8

回帖

0

精华

铜牌会员

积分
150
发表于 2017-11-25 13:53:54 | 显示全部楼层
好东西感谢分享,收藏了

0

主题

36

回帖

0

精华

铜牌会员

积分
64
发表于 2017-11-25 22:57:17 | 显示全部楼层
谢谢楼主共享

2

主题

41

回帖

0

精华

银牌会员

积分
479
发表于 2017-12-1 07:37:20 来自手机 | 显示全部楼层
参观参观

6

主题

123

回帖

0

精华

初来乍到

积分
5392
发表于 2017-12-20 10:36:30 | 显示全部楼层
谢谢楼主

0

主题

38

回帖

0

精华

铜牌会员

积分
86
发表于 2018-1-1 22:37:01 | 显示全部楼层
感谢分享!

1

主题

82

回帖

0

精华

铜牌会员

积分
156
发表于 2018-1-7 02:42:47 | 显示全部楼层
谢谢楼主

0

主题

54

回帖

0

精华

铜牌会员

积分
51
发表于 2018-1-13 15:06:02 | 显示全部楼层
感谢科普

0

主题

49

回帖

0

精华

铜牌会员

积分
61
发表于 2018-1-17 18:20:56 | 显示全部楼层
来看看win10的干货.

0

主题

103

回帖

0

精华

初来乍到

积分
3
发表于 2018-5-20 22:12:20 | 显示全部楼层
谢谢楼主分享

0

主题

8

回帖

0

精华

铜牌会员

积分
40
发表于 2018-6-13 22:45:02 | 显示全部楼层
非常感谢分享!

0

主题

10

回帖

0

精华

铜牌会员

积分
49
发表于 2018-8-1 19:15:04 | 显示全部楼层
学习一下

0

主题

63

回帖

0

精华

铜牌会员

积分
169
发表于 2019-4-17 20:16:39 | 显示全部楼层
非常感谢,好东西

0

主题

2

回帖

0

精华

初来乍到

积分
12
发表于 2019-5-22 08:24:38 | 显示全部楼层
学习学习学习
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

快速回复 返回顶部 返回列表