x64--- 驱动实现遍历VAD树

  • 原理
  • 驱动代码 ---0环
  • 总结

原理

找到程序的Eprocess(0环进程结构体),取vadroot 头节点 eprocess 结构体-- > 0ffset:0x7d8

驱动代码 —0环

#include "ntifs.h"
#include "vadstruct.h"UCHAR* PsGetProcessImageFileName(PEPROCESS Process);
VOID DriverUnload(PDRIVER_OBJECT pDriver);
VOID EnumVadRootAdress(PMMVAD RootAdress);
PRTL_AVL_TREE VadRootAdress = NULL;
PMMVAD RootHeadNode;
PMMVAD RootHeadLeft;
PMMVAD RootHeadRight;
ULONG LeftHightNode = 2;//代表左往下递增多少个函数
ULONG tmp = 0;//记录返回到第几层函数
ULONG OldHight;//记录第一次返回的层次函数,第二次在返回相同的话则tmp--
// 入口函数
NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING RegPath)
{BOOLEAN bFlag = FALSE;NTSTATUS ntstatus = 0;PEPROCESS pEprocess = NULL;//遍历vadroot  二叉树//1:找到要遍历驱动的Eprocess  --> MyDriver2.sysfor (size_t i = 4; i < 0x100000; i += 4){ntstatus = PsLookupProcessByProcessId((HANDLE)i, &pEprocess);if (NT_SUCCESS(ntstatus)){//释放内核对应引用计次ObDereferenceObject(pEprocess);//+0x5a8 ImageFileName    : [15] UChar//获取进程名PUCHAR szProcessName = PsGetProcessImageFileName(pEprocess);//if (strcmp("123.exe", szProcessName) == 0){DbgPrint("%s\n", szProcessName);bFlag = TRUE;break;}}}//2 取vadroot  头节点  eprocess 结构体-- > 0ffset:0x7d8VadRootAdress = (PRTL_AVL_TREE)((UCHAR*)pEprocess + 0x7d8);//取VadRootAdress地址if (!MmIsAddressValid(VadRootAdress))  //MmIsAddressValid函数是判断一个地址是否有效{return FALSE;}RootHeadNode = (PMMVAD)VadRootAdress->Root;//取头节点//然后循环遍历即可//根节点开始遍历 RootHeadLeft = (PMMVAD)VadRootAdress->Root->Left;// 左节点EnumVadRootAdress(RootHeadLeft);DbgPrint("地址:%p---NOde高度:%d\n", RootHeadNode, LeftHightNode);//输出头指针的地址LeftHightNode++;tmp = 0;OldHight = 0;RootHeadRight =(PMMVAD)VadRootAdress->Root->Right;//右节点EnumVadRootAdress(RootHeadRight);pDriver->DriverUnload = DriverUnload;return STATUS_SUCCESS;
}// 卸载驱动
VOID DriverUnload(PDRIVER_OBJECT pDriver)
{DbgPrint("驱动卸载成功\n");
}VOID EnumVadRootAdress(PMMVAD RootAdress)
{//遍历左边的节点if (MmIsAddressValid(RootAdress->Core.VadNode.Left))  //MmIsAddressValid函数是判断一个地址是否有效{LeftHightNode++;tmp++;EnumVadRootAdress((PMMVAD)RootAdress->Core.VadNode.Left);}DbgPrint("地址:%p ----LeftHightNode:%d\n", RootAdress, LeftHightNode);//输出传进来的指针//遍历右边的节点if (MmIsAddressValid(RootAdress->Core.VadNode.Right))  //MmIsAddressValid函数是判断一个地址是否有效{LeftHightNode++;EnumVadRootAdress((PMMVAD)RootAdress->Core.VadNode.Right);PMMVAD RootAdress2 = (PMMVAD)RootAdress->Core.VadNode.Right;if (RootAdress2->Core.VadNode.Left == NULL && RootAdress2->Core.VadNode.Right == NULL){if (OldHight != tmp){OldHight = tmp;LeftHightNode =tmp;tmp--;}else{tmp--;OldHight = tmp;LeftHightNode = tmp;tmp--;}}}else{LeftHightNode--;if (LeftHightNode == tmp){tmp--;}}}

“vadstruct.h”

#pragma once
#include <ntifs.h>typedef struct _MM_GRAPHICS_VAD_FLAGS        // 15 elements, 0x4 bytes (sizeof)
{/*0x000*/     ULONG32      Lock : 1;                   // 0 BitPosition                   /*0x000*/     ULONG32      LockContended : 1;          // 1 BitPosition                   /*0x000*/     ULONG32      DeleteInProgress : 1;       // 2 BitPosition                   /*0x000*/     ULONG32      NoChange : 1;               // 3 BitPosition                   /*0x000*/     ULONG32      VadType : 3;                // 4 BitPosition                   /*0x000*/     ULONG32      Protection : 5;             // 7 BitPosition                   /*0x000*/     ULONG32      PreferredNode : 6;          // 12 BitPosition                  /*0x000*/     ULONG32      PageSize : 2;               // 18 BitPosition                  /*0x000*/     ULONG32      PrivateMemoryAlwaysSet : 1; // 20 BitPosition                  /*0x000*/     ULONG32      WriteWatch : 1;             // 21 BitPosition                  /*0x000*/     ULONG32      FixedLargePageSize : 1;     // 22 BitPosition                  /*0x000*/     ULONG32      ZeroFillPagesOptional : 1;  // 23 BitPosition                  /*0x000*/     ULONG32      GraphicsAlwaysSet : 1;      // 24 BitPosition                  /*0x000*/     ULONG32      GraphicsUseCoherentBus : 1; // 25 BitPosition                  /*0x000*/     ULONG32      GraphicsPageProtection : 3; // 26 BitPosition
}MM_GRAPHICS_VAD_FLAGS, * PMM_GRAPHICS_VAD_FLAGS;
typedef struct _MM_PRIVATE_VAD_FLAGS         // 15 elements, 0x4 bytes (sizeof)
{/*0x000*/     ULONG32      Lock : 1;                   // 0 BitPosition                   /*0x000*/     ULONG32      LockContended : 1;          // 1 BitPosition                   /*0x000*/     ULONG32      DeleteInProgress : 1;       // 2 BitPosition                   /*0x000*/     ULONG32      NoChange : 1;               // 3 BitPosition                   /*0x000*/     ULONG32      VadType : 3;                // 4 BitPosition                   /*0x000*/     ULONG32      Protection : 5;             // 7 BitPosition                   /*0x000*/     ULONG32      PreferredNode : 6;          // 12 BitPosition                  /*0x000*/     ULONG32      PageSize : 2;               // 18 BitPosition                  /*0x000*/     ULONG32      PrivateMemoryAlwaysSet : 1; // 20 BitPosition                  /*0x000*/     ULONG32      WriteWatch : 1;             // 21 BitPosition                  /*0x000*/     ULONG32      FixedLargePageSize : 1;     // 22 BitPosition                  /*0x000*/     ULONG32      ZeroFillPagesOptional : 1;  // 23 BitPosition                  /*0x000*/     ULONG32      Graphics : 1;               // 24 BitPosition                  /*0x000*/     ULONG32      Enclave : 1;                // 25 BitPosition                  /*0x000*/     ULONG32      ShadowStack : 1;            // 26 BitPosition
}MM_PRIVATE_VAD_FLAGS, * PMM_PRIVATE_VAD_FLAGS;typedef struct _MMVAD_FLAGS            // 9 elements, 0x4 bytes (sizeof)
{/*0x000*/     ULONG32      Lock : 1;             // 0 BitPosition                  /*0x000*/     ULONG32      LockContended : 1;    // 1 BitPosition                  /*0x000*/     ULONG32      DeleteInProgress : 1; // 2 BitPosition                  /*0x000*/     ULONG32      NoChange : 1;         // 3 BitPosition                  /*0x000*/     ULONG32      VadType : 3;          // 4 BitPosition                  /*0x000*/     ULONG32      Protection : 5;       // 7 BitPosition                  /*0x000*/     ULONG32      PreferredNode : 6;    // 12 BitPosition                 /*0x000*/     ULONG32      PageSize : 2;         // 18 BitPosition                 /*0x000*/     ULONG32      PrivateMemory : 1;    // 20 BitPosition
}MMVAD_FLAGS, * PMMVAD_FLAGS;typedef struct _MM_SHARED_VAD_FLAGS            // 11 elements, 0x4 bytes (sizeof)
{/*0x000*/     ULONG32      Lock : 1;                     // 0 BitPosition                   /*0x000*/     ULONG32      LockContended : 1;            // 1 BitPosition                   /*0x000*/     ULONG32      DeleteInProgress : 1;         // 2 BitPosition                   /*0x000*/     ULONG32      NoChange : 1;                 // 3 BitPosition                   /*0x000*/     ULONG32      VadType : 3;                  // 4 BitPosition                   /*0x000*/     ULONG32      Protection : 5;               // 7 BitPosition                   /*0x000*/     ULONG32      PreferredNode : 6;            // 12 BitPosition                  /*0x000*/     ULONG32      PageSize : 2;                 // 18 BitPosition                  /*0x000*/     ULONG32      PrivateMemoryAlwaysClear : 1; // 20 BitPosition                  /*0x000*/     ULONG32      PrivateFixup : 1;             // 21 BitPosition                  /*0x000*/     ULONG32      HotPatchAllowed : 1;          // 22 BitPosition
}MM_SHARED_VAD_FLAGS, * PMM_SHARED_VAD_FLAGS;typedef struct _MMVAD_FLAGS2             // 7 elements, 0x4 bytes (sizeof)
{/*0x000*/     ULONG32      FileOffset : 24;        // 0 BitPosition                  /*0x000*/     ULONG32      Large : 1;              // 24 BitPosition                 /*0x000*/     ULONG32      TrimBehind : 1;         // 25 BitPosition                 /*0x000*/     ULONG32      Inherit : 1;            // 26 BitPosition                 /*0x000*/     ULONG32      NoValidationNeeded : 1; // 27 BitPosition                 /*0x000*/     ULONG32      PrivateDemandZero : 1;  // 28 BitPosition                 /*0x000*/     ULONG32      Spare : 3;              // 29 BitPosition
}MMVAD_FLAGS2, * PMMVAD_FLAGS2;typedef struct _MMVAD_SHORT
{RTL_BALANCED_NODE VadNode;UINT32 StartingVpn;               /*0x18*/UINT32 EndingVpn;                 /*0x01C*/UCHAR StartingVpnHigh;UCHAR EndingVpnHigh;UCHAR CommitChargeHigh;UCHAR SpareNT64VadUChar;INT32 ReferenceCount;EX_PUSH_LOCK PushLock;            /*0x028*/struct{union{ULONG_PTR flag;MM_PRIVATE_VAD_FLAGS PrivateVadFlags;                        /*0x030*/MMVAD_FLAGS  VadFlags;MM_GRAPHICS_VAD_FLAGS GraphicsVadFlags;MM_SHARED_VAD_FLAGS   SharedVadFlags;}Flags;}u1;PVOID EventList;                        /*0x038*/}MMVAD_SHORT, * PMMVAD_SHORT;typedef struct _MMADDRESS_NODE
{ULONG64 u1;struct _MMADDRESS_NODE* LeftChild;struct _MMADDRESS_NODE* RightChild;ULONG64 StartingVpn;ULONG64 EndingVpn;
}MMADDRESS_NODE, * PMMADDRESS_NODE;typedef struct _MMEXTEND_INFO     // 2 elements, 0x10 bytes (sizeof)
{/*0x000*/     UINT64       CommittedSize;/*0x008*/     ULONG32      ReferenceCount;/*0x00C*/     UINT8        _PADDING0_[0x4];
}MMEXTEND_INFO, * PMMEXTEND_INFO;
struct _SEGMENT
{struct _CONTROL_AREA* ControlArea;ULONG TotalNumberOfPtes;ULONG SegmentFlags;ULONG64 NumberOfCommittedPages;ULONG64 SizeOfSegment;union{struct _MMEXTEND_INFO* ExtendInfo;void* BasedAddress;}u;ULONG64 SegmentLock;ULONG64 u1;ULONG64 u2;PVOID* PrototypePte;ULONGLONG ThePtes[0x1];
};typedef struct _EX_FAST_REF
{union{PVOID Object;ULONG_PTR RefCnt : 3;ULONG_PTR Value;};
} EX_FAST_REF, * PEX_FAST_REF;typedef struct _CONTROL_AREA                      // 17 elements, 0x80 bytes (sizeof)
{/*0x000*/     struct _SEGMENT* Segment;union                                         // 2 elements, 0x10 bytes (sizeof)  {/*0x008*/         struct _LIST_ENTRY ListHead;              // 2 elements, 0x10 bytes (sizeof)  /*0x008*/         VOID* AweContext;};/*0x018*/     UINT64       NumberOfSectionReferences;/*0x020*/     UINT64       NumberOfPfnReferences;/*0x028*/     UINT64       NumberOfMappedViews;/*0x030*/     UINT64       NumberOfUserReferences;/*0x038*/     ULONG32 u;                     // 2 elements, 0x4 bytes (sizeof)   /*0x03C*/     ULONG32 u1;                    // 2 elements, 0x4 bytes (sizeof)   /*0x040*/     struct _EX_FAST_REF FilePointer;              // 3 elements, 0x8 bytes (sizeof)   // 4 elements, 0x8 bytes (sizeof)
}CONTROL_AREA, * PCONTROL_AREA;typedef struct _SUBSECTION_
{struct _CONTROL_AREA* ControlArea;}SUBSECTION, * PSUBSECTION;typedef struct _MMVAD
{MMVAD_SHORT Core;union                 /*0x040*/{UINT32 LongFlags2;MMVAD_FLAGS2 VadFlags2;}u2;PSUBSECTION Subsection;               /*0x048*/PVOID FirstPrototypePte;        /*0x050*/PVOID LastContiguousPte;        /*0x058*/LIST_ENTRY ViewLinks;           /*0x060*/PEPROCESS VadsProcess;          /*0x070*/PVOID u4;                       /*0x078*/PVOID FileObject;               /*0x080*/
}MMVAD, * PMMVAD;typedef struct _RTL_AVL_TREE         // 1 elements, 0x8 bytes (sizeof)
{/*0x000*/     struct _RTL_BALANCED_NODE* Root;
}RTL_AVL_TREE, * PRTL_AVL_TREE;typedef struct _VAD_INFO_
{ULONG_PTR pVad;ULONG_PTR startVpn;ULONG_PTR endVpn;ULONG_PTR pFileObject;ULONG_PTR flags;
}VAD_INFO, * PVAD_INFO;typedef struct _ALL_VADS_
{ULONG nCnt;VAD_INFO VadInfos[1];
}ALL_VADS, * PALL_VADS;typedef struct _MMSECTION_FLAGS                        // 27 elements, 0x4 bytes (sizeof)
{/*0x000*/     UINT32       BeingDeleted : 1;                     // 0 BitPosition                   /*0x000*/     UINT32       BeingCreated : 1;                     // 1 BitPosition                   /*0x000*/     UINT32       BeingPurged : 1;                      // 2 BitPosition                   /*0x000*/     UINT32       NoModifiedWriting : 1;                // 3 BitPosition                   /*0x000*/     UINT32       FailAllIo : 1;                        // 4 BitPosition                   /*0x000*/     UINT32       Image : 1;                            // 5 BitPosition                   /*0x000*/     UINT32       Based : 1;                            // 6 BitPosition                   /*0x000*/     UINT32       File : 1;                             // 7 BitPosition                   /*0x000*/     UINT32       AttemptingDelete : 1;                 // 8 BitPosition                   /*0x000*/     UINT32       PrefetchCreated : 1;                  // 9 BitPosition                   /*0x000*/     UINT32       PhysicalMemory : 1;                   // 10 BitPosition                  /*0x000*/     UINT32       ImageControlAreaOnRemovableMedia : 1; // 11 BitPosition                  /*0x000*/     UINT32       Reserve : 1;                          // 12 BitPosition                  /*0x000*/     UINT32       Commit : 1;                           // 13 BitPosition                  /*0x000*/     UINT32       NoChange : 1;                         // 14 BitPosition                  /*0x000*/     UINT32       WasPurged : 1;                        // 15 BitPosition                  /*0x000*/     UINT32       UserReference : 1;                    // 16 BitPosition                  /*0x000*/     UINT32       GlobalMemory : 1;                     // 17 BitPosition                  /*0x000*/     UINT32       DeleteOnClose : 1;                    // 18 BitPosition                  /*0x000*/     UINT32       FilePointerNull : 1;                  // 19 BitPosition                  /*0x000*/     ULONG32      PreferredNode : 6;                    // 20 BitPosition                  /*0x000*/     UINT32       GlobalOnlyPerSession : 1;             // 26 BitPosition                  /*0x000*/     UINT32       UserWritable : 1;                     // 27 BitPosition                  /*0x000*/     UINT32       SystemVaAllocated : 1;                // 28 BitPosition                  /*0x000*/     UINT32       PreferredFsCompressionBoundary : 1;   // 29 BitPosition                  /*0x000*/     UINT32       UsingFileExtents : 1;                 // 30 BitPosition                  /*0x000*/     UINT32       PageSize64K : 1;                      // 31 BitPosition
}MMSECTION_FLAGS, * PMMSECTION_FLAGS;typedef struct _SECTION                          // 9 elements, 0x40 bytes (sizeof)
{/*0x000*/     struct _RTL_BALANCED_NODE SectionNode;       // 6 elements, 0x18 bytes (sizeof) /*0x018*/     UINT64       StartingVpn;/*0x020*/     UINT64       EndingVpn;/*0x028*/     union {PCONTROL_AREA   ControlArea;PVOID   FileObject;}u1;                   // 4 elements, 0x8 bytes (sizeof)  /*0x030*/     UINT64       SizeOfSection;/*0x038*/     union {ULONG32 LongFlags;MMSECTION_FLAGS Flags;}u;                    // 2 elements, 0x4 bytes (sizeof)  struct                                       // 3 elements, 0x4 bytes (sizeof)  {/*0x03C*/         ULONG32      InitialPageProtection : 12; // 0 BitPosition                   /*0x03C*/         ULONG32      SessionId : 19;             // 12 BitPosition                  /*0x03C*/         ULONG32      NoValidationNeeded : 1;     // 31 BitPosition                  };
}SECTION, * PSECTION;

总结

打印的顺序和windbg一致;二叉树遍历(左—中—右).
注:Node节点的高度:可能不会针对每个程序.

windows10驱动 x64--- 驱动实现遍历VAD树(六)相关推荐

  1. Windows10 配置 Nvidia 驱动与 Cuda 环境搭建

    title: Windows10 配置 Nvidia 驱动与 Cuda 环境搭建 mathjax: false date: 2021-04-17 12:50:27 tags: [Environment ...

  2. X64驱动开发和保护+X86X64游戏逆向分析课程

    老师教学范围和方式:木塔负责PC电脑端C语言基础和端游逆向分析部分内容,采用录制+部分直播课程教学,晚上还有专业老师讲解和指导.我要的是质量不是数量.老师备课,设计课件需要时间的. 学习周期:PC端3 ...

  3. windows10 Selenium Chrome 驱动安装

    windows10 Selenium Chrome 驱动安装 确定chrome浏览器版本 右键上角按钮 --> 帮助 --> 关于Google Chrome(G) 打开网址 https:/ ...

  4. 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型

    文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...

  5. 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程

    文章目录 1.驱动进化之路:设备树的引入及简明教程 1.1 设备树的引入与作用 1.2 设备树的语法 1.2.1 Devicetree格式 1.2.1.1 DTS文件的格式 1.2.1.2 node的 ...

  6. vs2017添加C语言模版,「vs2017 项目模板」有没有大神知道vs2017怎么配置wdk10开发x64驱动...

    vs2017 项目模板: 有没有大神知道vs2017怎么配置wdk10开发x64驱动 设置目标或测试计算机是配置计算机以便进行自动驱动程序部署.测试和调试的过程.一个测试和调试环境具有两台计算机:主计 ...

  7. hp1015驱动64位_HP LaserJet1010 x64驱动下载|HP LaserJet1015 win7 x64驱动 - 驱动无忧

    HP LaserJet1010 LaserJet1015 win7 x64驱动添加说明: 按如下步骤执行即可解决问题: 1.正常安装HP官方驱动: 2.在设备管理器里带有"dot4" ...

  8. win7 x64驱动开发经验(三)windbg 双机调试配置 、问题及解决办法

    win7 x64驱动开发经验(三)windbg 双机调试配置 .问题及解决办法 http://www.cnblogs.com/witty/archive/2012/04/23/2466024.html ...

  9. 驱动进化之路:设备树的引入及简明教程

    驱动进化之路:设备树的引入及简明教程 设备树的基本概念和产生背景 问题1: 以LED为例,当要更换LED所用的GPIO引脚时,需要修改驱动程序源码,重新编译驱动,重新加载驱动. 问题2: 由于芯片种类 ...

最新文章

  1. 计算机网络传输复用技术,计算机网络 23-24 复用技术 数字传输.ppt
  2. navicat运行sql文件慢_SQL进阶之路——入门
  3. Ant Design Pro 登录超时处理
  4. linux为什么要禁止内核抢占,为什么linux在内核代码持有自旋锁后禁用内核抢占?...
  5. 工程师们在摔倒后如何不尴尬
  6. PouchDB 基础
  7. 利用计算机指令清理垃圾,计算机Dos处理,编写一键清理系统垃圾的bat代码,小白都可以学...
  8. 使用Python抓取google街景照片
  9. Java订单接入支付宝二 支付回调
  10. Android google中文开发网站
  11. 爬取人民日报_抓取人民日报
  12. 转载-公历转换农历VB示例
  13. win10无线网一直未连接到服务器,win10系统未识别无线网络无法连接怎么办
  14. 第十三届蓝桥杯模拟赛(第三期)试题与题解 C++
  15. 拉格朗日插值、分段线性插值、三次样条插值
  16. Linux下 Xpad不能移动拖动 解决办法
  17. 服务器托管之数据中心选型
  18. 掌握这3种避税要点,企业轻松应对税局检查 1
  19. python 爬虫代码 爬隐藏_爬虫隐藏
  20. win10安装Redis(解压版)

热门文章

  1. 民航大学推出订单式培养空姐 恋爱学系必修课程
  2. (附源码)小程序 美食教程小程序 毕业设计 190900
  3. python如何设置rgb颜色_Python 转换RGB颜色值的示例代码
  4. JDBC--基础JDBC
  5. JDBC 第一章 JDBC概述
  6. StarUML使用文档
  7. Linux中zsh插件,Zsh 常用插件
  8. 阿里云二级域名配置-ssl证书包不安全问题记录
  9. 树莓派镜像备份/内核编译和更换/EC200U上网
  10. 蓝牙HC05模块探究-设置AT指令