windows10驱动 x64--- 驱动实现遍历VAD树(六)
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树(六)相关推荐
- Windows10 配置 Nvidia 驱动与 Cuda 环境搭建
title: Windows10 配置 Nvidia 驱动与 Cuda 环境搭建 mathjax: false date: 2021-04-17 12:50:27 tags: [Environment ...
- X64驱动开发和保护+X86X64游戏逆向分析课程
老师教学范围和方式:木塔负责PC电脑端C语言基础和端游逆向分析部分内容,采用录制+部分直播课程教学,晚上还有专业老师讲解和指导.我要的是质量不是数量.老师备课,设计课件需要时间的. 学习周期:PC端3 ...
- windows10 Selenium Chrome 驱动安装
windows10 Selenium Chrome 驱动安装 确定chrome浏览器版本 右键上角按钮 --> 帮助 --> 关于Google Chrome(G) 打开网址 https:/ ...
- 【嵌入式Linux】嵌入式Linux驱动开发基础知识之设备树模型
文章目录 前言 1.设备树的作用 2.设备树的语法 2.1.设备树的逻辑图和dts文件.dtb文件 2.1.1.1Devicetree格式 1DTS文件的格式 node的格式 properties的格 ...
- 嵌入式linux/鸿蒙开发板(IMX6ULL)开发(三十一)驱动进化之路:设备树的引入及简明教程
文章目录 1.驱动进化之路:设备树的引入及简明教程 1.1 设备树的引入与作用 1.2 设备树的语法 1.2.1 Devicetree格式 1.2.1.1 DTS文件的格式 1.2.1.2 node的 ...
- vs2017添加C语言模版,「vs2017 项目模板」有没有大神知道vs2017怎么配置wdk10开发x64驱动...
vs2017 项目模板: 有没有大神知道vs2017怎么配置wdk10开发x64驱动 设置目标或测试计算机是配置计算机以便进行自动驱动程序部署.测试和调试的过程.一个测试和调试环境具有两台计算机:主计 ...
- hp1015驱动64位_HP LaserJet1010 x64驱动下载|HP LaserJet1015 win7 x64驱动 - 驱动无忧
HP LaserJet1010 LaserJet1015 win7 x64驱动添加说明: 按如下步骤执行即可解决问题: 1.正常安装HP官方驱动: 2.在设备管理器里带有"dot4" ...
- win7 x64驱动开发经验(三)windbg 双机调试配置 、问题及解决办法
win7 x64驱动开发经验(三)windbg 双机调试配置 .问题及解决办法 http://www.cnblogs.com/witty/archive/2012/04/23/2466024.html ...
- 驱动进化之路:设备树的引入及简明教程
驱动进化之路:设备树的引入及简明教程 设备树的基本概念和产生背景 问题1: 以LED为例,当要更换LED所用的GPIO引脚时,需要修改驱动程序源码,重新编译驱动,重新加载驱动. 问题2: 由于芯片种类 ...
最新文章
- 计算机网络传输复用技术,计算机网络 23-24 复用技术 数字传输.ppt
- navicat运行sql文件慢_SQL进阶之路——入门
- Ant Design Pro 登录超时处理
- linux为什么要禁止内核抢占,为什么linux在内核代码持有自旋锁后禁用内核抢占?...
- 工程师们在摔倒后如何不尴尬
- PouchDB 基础
- 利用计算机指令清理垃圾,计算机Dos处理,编写一键清理系统垃圾的bat代码,小白都可以学...
- 使用Python抓取google街景照片
- Java订单接入支付宝二 支付回调
- Android google中文开发网站
- 爬取人民日报_抓取人民日报
- 转载-公历转换农历VB示例
- win10无线网一直未连接到服务器,win10系统未识别无线网络无法连接怎么办
- 第十三届蓝桥杯模拟赛(第三期)试题与题解 C++
- 拉格朗日插值、分段线性插值、三次样条插值
- Linux下 Xpad不能移动拖动 解决办法
- 服务器托管之数据中心选型
- 掌握这3种避税要点,企业轻松应对税局检查 1
- python 爬虫代码 爬隐藏_爬虫隐藏
- win10安装Redis(解压版)