Windows内核分析索引目录:https://www.cnblogs.com/onetrainee/p/11675224.html

VAD树的属性以及遍历

前面学习过的PFNDATABSAE是管理物理页的,整个操作系统仅维护一个PFNDATABASE。

现在的VAD是管理虚拟内存的,每一个进程有自己单独的一个VAD树。

VAD树:

比如你使用VirtualAllocate函数申请一个内存,则会在VAD树上增加一个结点,其是_MMVAD结构体。

一个VAD结点可以有多个页,这在StartingVpn和EndingVpn会介绍。

当以MEN_SERVIED保留属性提交时,其只是在VAD树上挂上一个节点,真正提交时这棵树才是由意义的。

一、VAD结构体介绍

kd> dt _MMVAD

nt!_MMVAD

+0x000 StartingVpn      : Uint4B

+0x004 EndingVpn        : Uint4B

+0x008 Parent           : Ptr32 _MMVAD

+0x00c LeftChild        : Ptr32 _MMVAD

+0x010 RightChild       : Ptr32 _MMVAD

+0x014 u                : __unnamed

+0x018 ControlArea      : Ptr32 _CONTROL_AREA

+0x01c FirstPrototypePte : Ptr32 _MMPTE

+0x020 LastContiguousPte : Ptr32 _MMPTE

+0x024 u2               : __unnamed

1. StringVpn 起始页 / EndingVpn结束页

1)两者算法是不同的。起始页:startingVpn*0x1000/结束页:EndVpn*0x1000+0xfff。

2. Parent、LeftChild、RightChild - 其父节点、左子树、右子树。

1)我们遍历这些树时用到的就是这些结构体成员。

3. u - 其是_MMVAN_FLAGS属性,非常重要的。

kd> dt _MMVAD_FLAGS

nt!_MMVAD_FLAGS

+0x000 CommitCharge     : Pos 0, 19 Bits

+0x000 PhysicalMapping  : Pos 19, 1 Bit

+0x000 ImageMap         : Pos 20, 1 Bit

+0x000 UserPhysicalPages : Pos 21, 1 Bit

+0x000 NoChange         : Pos 22, 1 Bit

+0x000 WriteWatch       : Pos 23, 1 Bit

+0x000 Protection       : Pos 24, 5 Bits

+0x000 LargePages       : Pos 29, 1 Bit

+0x000 MemCommit        : Pos 30, 1 Bit

+0x000 PrivateMemory    : Pos 31, 1 Bit

1)CommitCharge  实际提交的页数。

其19Bits,我们内存低字节7ffffff,正好十九位。

比如我们以MEN_RESERVED保留形式提交了4页大小的内存,此时这里为2,将一页改为EXECUTE属性,这时这里就会变成2。

2)PyhsicalMapping:内核物理页映射。

3)UserPhysicalPages:内核物理页映射。

4)PrivateMemory:如果私有设置为1。

5)ImageMap:对dll/exe等文件进行保护,防止其被修改(使用映射写拷贝之类的原理)

如果ImageMap为1,PrivateMemory为0,说明其为DLL。

6)NoChange:关于锁页技术。当置为1,像VirtualProtect等函数不会改变其页的属性。

7)LargePage:标志是否为大页。

8)MemCommit:提交状态,只要提交就会置为1(CommitCharge存储提交了多少页)

9)Protection:3bit,关于保护(比如页的读写、可执行等)。

将其定义的值取出,赋值到该位。

4. ContraArea控制结构:

其指向一个_CONTROL_AREA的数据结构,该结构就暂不表述了。

1)_CONTROL_AREA+ 0x24 FilePointer,文件指针,指向一个_FILE_OBJECT结构体。

2)_FILE_OBJECT结构体中,保存着文件对象很多关键的信息。

a> +0x30 FileName 文件名

若想知道该页属于哪个文件,可以查看这里。

将.sys文件伪装成.dll文件,则必须修改这里。

b> +0x26-0x28 文件保护属性

比如一个文件被独占无法删除,在内核中你可以将DeleteAccess位置1,之后强制删除。

二、利用windbg遍历VAD树

1. 每个进程的VAD树存储在_EPROCESS+0x11c结构体中,其是ROOTVAD根结点。

2. 获取每个进程的 _EPROCESS,使用指令!process 0 0,得到PROCESS的值就是指向_EPROCESS的指针。

3. 当获取VadRoot之后,可以使用 !vad VadRoot来显示该进程的VAD树。

三、使用代码实现VAD树的遍历

代码核心就是先遍历进程找出目标进程(这里默认 test.exe),之后对目标进程的VAD树进行遍历。

1 #include

2

3

4 //---------------------//

5 // MMVAD结构体简单定义 //

6 //---------------------//

7 typedef struct _MMVAD {

8 ULONG StartingVpn;

9 ULONG EndingVpn;

10 struct _MMVAD * Parent;

11 struct _MMVAD * LeftChild;

12 struct _MMVAD * RightChild;

13 }MMVAD,*PMMVAD;

14

15

16

17 VOID Unload(IN PDRIVER_OBJECT pDriverObject) {

18 DbgPrint("Driver UnLoad!");

19 }

20

21 //-----------//

22 // 遍历VAD树 //

23 //-----------//

24 VOID vad_enum(PMMVAD pVad) {

25 if (pVad) {

26 DbgPrint("Start: %x | End: %x | \r\n", pVad->StartingVpn, pVad->EndingVpn);

27 if (pVad->LeftChild)

28 vad_enum(pVad->LeftChild);

29 if (pVad->RightChild)

30 vad_enum(pVad->RightChild);

31 }

32 }

33

34

35 //-------------------------------------------------------------//

36 // 在内核中进程遍历的原理就是先获取系统进程EPROCESS结构 //

37 // 然后依照其链表来获取其他的进程 //

38 // 依次遍历出来 //

39 //-------------------------------------------------------------//

40 NTSTATUS process_enum() {

41

42 PEPROCESS pEprocess = NULL; // 得到系统进程地址

43 PEPROCESS pFirstEprocess = NULL;

44 ULONG ulProcessName = 0; // 字符串指针,指向进程名称

45 ULONG ulProcessID = 0; // 进程ID

46 ANSI_STRING target_str; // 带检测进程的名称

47 ANSI_STRING ansi_string; //

48 ULONG VadRoot;

49

50 //----------------------------//

51 // 得到当前系统进程的EPROCESS //

52 //----------------------------//

53 pEprocess = PsGetCurrentProcess();

54 if (pEprocess == NULL) {

55 DbgPrint("获取当前系统进程EPROCESS错误..");

56 return STATUS_SUCCESS;

57 }

58 DbgPrint("pEprocess addr is %x0x8\r\n", pEprocess);

59 pFirstEprocess = pEprocess;

60

61 while (pEprocess) {

62

63 ulProcessName = (ULONG)pEprocess + 0x174;

64 ulProcessID = *(ULONG*)((ULONG)pEprocess + 0x84);

65 VadRoot = *(ULONG*)((ULONG)pEprocess + 0x11c);

66

67 //--------------------------------------//

68 // 将目标进程与当前进程的进程名进行对比 //

69 //--------------------------------------//

70 RtlInitAnsiString(&ansi_string, (PCSTR)ulProcessName);

71 RtlInitAnsiString(&target_str, "test.exe");

72 if (RtlEqualString(&ansi_string, &target_str, TRUE)) {

73 DbgPrint("检测到进程字符串,%x", ulProcessID);

74 vad_enum((PMMVAD)VadRoot); // 开始遍历目标进程的VAD树

75 return STATUS_SUCCESS;

76 }

77 pEprocess = (PEPROCESS)(*(ULONG*)((ULONG)pEprocess + 0x88) - 0x88);

78

79 if (pEprocess == pFirstEprocess || *(ULONG*)((ULONG)pEprocess + 0x84) <= 0) {

80 DbgPrint("遍历结束!未检测到进程ID!\r\n");

81 break;

82 }

83 }

84 return STATUS_SUCCESS;

85 }

86

87 NTSTATUS DriverEntry(IN PDRIVER_OBJECT pDriverObject, IN PUNICODE_STRING registeryPat) {

88 DbgPrint("Driver Loaded!");

89 pDriverObject->DriverUnload = Unload;

90 process_enum();

91 return STATUS_SUCCESS;

92 }

关于找一找教程网

本站文章仅代表作者观点,不代表本站立场,所有文章非营利性免费分享。

本站提供了软件编程、网站开发技术、服务器运维、人工智能等等IT技术文章,希望广大程序员努力学习,让我们用科技改变世界。

[VAD树结构体的属性以及遍历]http://www.zyiz.net/tech/detail-93682.html

linux vad检测,VAD树结构体的属性以及遍历相关推荐

  1. linux vad检测,VAD 文件扩展名: 它是什么以及如何打开它?

    VAD 文件疑难解答 打开 VAD 文件的麻烦 缺少 Global Mapper 如果您尝试加载 VAD 文件,则会收到 "无法打开 VAD 文件" 等消息. 发生这种情况时,通常 ...

  2. 语音识别之语音激活(VAD)检测(一)

    导读 语音激活检测(Vioce Activation Detection)简称VAD,用来检测语音信号是否存在.VAD技术在语音领域中应用非常的广泛,在语音识别中我们可以对长语音通过VAD来检测出语音 ...

  3. Python对批量文件进行VAD检测和分段

    准备: python2.7/3.+   webrtcvad import collections import contextlib import sys import wave import os ...

  4. linux 入侵检测

    最近遇到了很多服务器被入侵的例子,为了方便日后入侵检测以及排查取证,我查询了一些linux服务器入侵取证的相关资料,并在此总结分享,以便日后查询. 一般服务器被入侵的迹象,包括但不局限于:由内向外发送 ...

  5. Linux系统检测命令有哪些

    2019独角兽企业重金招聘Python工程师标准>>> Linux系统检测命令有哪些 | 浏览:44 | 更新:2015-02-02 10:16 | 标签:linux top:一个命 ...

  6. 硬盘检测工具+linux,linux硬盘检测工具:Smartmontools使用指南

    linux硬盘检测工具:Smartmontools使用指南 来源:互联网 作者:佚名 时间:2013-04-10 13:32 在服务器管理的实际环境中,硬盘是最容易出现问题及发生故障的硬件,而且硬盘中 ...

  7. linux查看哪个网卡插着网线,(笔记)Linux下检测网卡与网线连接状态

    Linux下检测网卡与网线连接状态,使用ioctl向socket发送SIOCETHTOOL命令字. #include #include #include #include #include #incl ...

  8. linux xampp 环境变量,XAMPP相关:Linux学习-环境变量和可执行属性

    文件的可执行属性和环境变量 Linux下文件有一个特殊的属性即可执行属性,用来指示这个文件是一个可执行的脚本或可以运行的二进制文件.前面所提到的这些命令,都具有可执行属性. which: 表示查看命令 ...

  9. linux+多个文件环境变量,Linux学习-环境变量和可执行属性

    文件的可执行属性和环境变量 Linux下文件有一个特殊的属性即可执行属性,用来指示这个文件是一个可执行的脚本或可以运行的二进制文件.前面所提到的这些命令,都具有可执行属性. which: 表示查看命令 ...

  10. Linux入侵检测方法

    前言 本文为总结了几种常见的Linux入侵检测方法,参考了csdn中多篇文章,参考链接放在文末. 个人总结 1进程2端口3日志4流量5计划 查看可疑进程 查看进程数量,运行状态 命令:top 动态查看 ...

最新文章

  1. Stream Processing:Apache Flink快照(snapshot)原理
  2. ArcCatalog连接远程ArcGIS Server服务器
  3. oracle递归用法
  4. day 03 selenium与Beautifulsoup4的原理与使用
  5. OI模板のpoke流[大型考试复习必备/kl]
  6. mysql as tmp,启动mysql时显示:/tmp/mysql.sock 不存在的解决办法
  7. React开发(106):方法定义 不然弹出框报错
  8. 最简单的控制台登录小案例,适合初学者
  9. matlab吧结果存数组,求助:如何将带有符号变量的运算结果储存到数组中
  10. 财务自由的味道!台积电股价连创新高,经营团队15人持股价值过亿
  11. please upgrade your plan to create a new private reposiory
  12. 跨编程语言平台的通信
  13. Word文档批量替换工具
  14. 实时数仓-数据采集层_1
  15. android pin码解锁,解锁三星的3种方法:SIM网络解锁PIN码
  16. 制作歌词录入系统php,如何制作歌词字幕 制作字幕的软件
  17. RPC框架原理及从零实现系列文章(四):支持zookeeper注册中心与负载均衡
  18. 年轻不学习,老了回村掰苞米!快来学学这份 微服务开发实战派吧
  19. 【渝粤教育】国家开放大学2018年春季 3894T理工英语1 参考试题
  20. App内购项目的App Store推广

热门文章

  1. keygen是怎么写出来的。
  2. NeRF神经辐射场学习笔记(十)— BungeeNeRF(CityNeRF)实现以及代码注释
  3. 《嵌入式开发》实验项目
  4. 微信公众号 java 教程视频下载_微信公众号开发视频教程java
  5. 熔断机制什么意思_指数熔断机制是什么意思
  6. 【去广告插件推荐】AdBlock让浏览器清净
  7. Python3 网络爬虫. 4
  8. Leetcode——714. Best Time to Buy and Sell Stock with Transaction Fee
  9. 【跨域】 关于跨域的一些知识整合
  10. “三权分立”模型之约束模型