紫水晶编程技术论坛 - 努力打造成全国最好的编程论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 7812|回复: 66

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

  [复制链接]

824

主题

3388

帖子

2

精华

管理员

身居欧盟,心系中华。

Rank: 125Rank: 125Rank: 125Rank: 125Rank: 125

积分
36201
发表于 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

主题

36

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

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

0

主题

107

帖子

0

精华

银牌会员

Rank: 3Rank: 3Rank: 3

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

谢谢TA科普

1

主题

81

帖子

1

精华

铂金会员

Rank: 5

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

0

主题

21

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

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

非常感谢分享!

2

主题

30

帖子

1

精华

金牌会员

Rank: 4Rank: 4Rank: 4Rank: 4

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

2

主题

45

帖子

0

精华

银牌会员

Rank: 3Rank: 3Rank: 3

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

0

主题

23

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

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

0

主题

46

帖子

0

精华

铜牌会员

Rank: 2Rank: 2

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

69

主题

238

帖子

8

精华

贵宾会员

Rank: 2Rank: 2

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

评分

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

查看全部评分

您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

手机版|Archiver|紫水晶工作室 ( 粤ICP备05020336号 )

GMT+8, 2021-1-17 18:14 , Processed in 0.037357 second(s), 20 queries , Gzip On.

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

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