/*遍历vad二叉树来遍历进程里的模块
*/#include <ntifs.h>typedef struct _MMADDRESS_NODE
{ULONG64 u1;struct _MMADDRESS_NODE* LeftChild;struct _MMADDRESS_NODE* RightChild;ULONG64 StartingVpn;ULONG64 EndingVpn;
}MMADDRESS_NODE, *PMMADDRESS_NODE;
typedef struct _EX_FAST_REF
{union{PVOID Object;ULONG_PTR RefCnt : 3;ULONG_PTR Value;};
} EX_FAST_REF, *PEX_FAST_REF;
struct _SEGMENT
{struct _CONTROL_AREA* ControlArea;ULONG TotalNumberOfPtes;ULONG SegmentFlags;ULONG64 NumberOfCommittedPages;ULONG64 SizeOfSegment;union{struct _MMEXTEND_INFO* ExtendInfo;void* BasedAddress;};ULONG64 SegmentLock;ULONG64 u1;ULONG64 u2;struct _MMPTE* PrototypePte;ULONGLONG ThePtes[0x1];
};
//控制区
struct _CONTROL_AREA
{struct _SEGMENT* Segment;struct _LIST_ENTRY DereferenceList;unsigned __int64 NumberOfSectionReferences;unsigned __int64 NumberOfPfnReferences;unsigned __int64 NumberOfMappedViews;unsigned __int64 NumberOfUserReferences;ULONG  u;ULONG FlushInProgressCount;struct _EX_FAST_REF FilePointer;/*ULONG ControlAreaLock;ULONG ModifiedWriteCount;ULONG StartingFrame;ULONG64 WaitingForDeletion;ULONG64 u2; //0x10字节ULONG64 LockedPages;_LIST_ENTRY ViewList;*/
};
struct _SUBSECTION
{struct _CONTROL_AREA* ControlArea;struct _MMPTE* SubsectionBase;struct _SUBSECTION* NextSubsection;ULONG PtesInSubsection;ULONG UnusedPtes;struct _MM_AVL_TABLE* GlobalPerSessionHead;ULONG u;ULONG StartingSector;ULONG NumberOfFullSectors;
};
typedef struct _MMVAD
{ULONG64 u1;struct _MMVAD* LeftChild;struct _MMVAD* RightChild;ULONG64 StartingVpn;ULONG64 EndingVpn;ULONG64 u;ULONG64 PushLock;ULONG64 u5;ULONG64 u2;struct _SUBSECTION* Subsection;struct _MSUBSECTION* MappedSubsection;struct _MMPTE* FirstPrototypePte;struct _MMPTE* LastContiguousPte;struct _LIST_ENTRY ViewLinks;struct _EPROCESS* VadsProcess;
}MMVAD;
typedef struct   tag_MM_AVL_TABLE
{struct _MMADDRESS_NODE BalancedRoot;ULONG64 DepthOfTree;ULONG64 Unused;ULONG64 NumberGenericTableElements;void* NodeHint;void* NodeFreeHint;
}MM_AVL_TABLE, *PMMAVL_TABLE;long TotalNum = 0;VOID EnumVad(MMVAD* Root)
{POBJECT_NAME_INFORMATION  Str = (POBJECT_NAME_INFORMATION)ExAllocatePool(PagedPool, 500);ULONG RetLen = 0;//接收//DbgBreakPoint();//申请内存失败或者节点为null都退出if (!Str || !Root)return;RtlZeroMemory(Str, 500);//KdPrint(("-> %p\n", Root->Subsection->ControlArea->FilePointer.Value));__try{if (MmIsAddressValid(Root->Subsection) &&MmIsAddressValid(Root->Subsection->ControlArea) &&MmIsAddressValid((PVOID)Root->Subsection->ControlArea->FilePointer.Value)){//清除低4位就是FILE_OBJECTPFILE_OBJECT pFileObj = (PFILE_OBJECT)((Root->Subsection->ControlArea->FilePointer.Value >> 4) << 4);if (MmIsAddressValid(pFileObj)){//获取模块名称NTSTATUS Status = ObQueryNameString(pFileObj, Str, 500, &RetLen);if (NT_SUCCESS(Status)){//KdPrint(("基址:%p 大小:%p  ",//   Root->Subsection->ControlArea->Segment->BasedAddress,// Root->Subsection->ControlArea->Segment->SizeOfSegment));KdPrint(("模块:%ws\n\n", Str->Name.Buffer));TotalNum++;}else{KdPrint(("获取模块名称失败 %08X\n", Status));}}}}__except (1){//KdPrint(("地址无效!\n"));}ExFreePool(Str);__try{if (MmIsAddressValid(Root->LeftChild))EnumVad(Root->LeftChild);if (MmIsAddressValid(Root->RightChild))EnumVad(Root->RightChild);}__except (1){KdPrint(("异常!!"));return;}}
BOOLEAN EnumProcessModule(ULONG Pid)
{PEPROCESS Peprocess = 0;if (NT_SUCCESS(PsLookupProcessByProcessId((HANDLE)Pid, &Peprocess))){//挂靠到目标进程KeAttachProcess(Peprocess);PMMAVL_TABLE Table = (PMMAVL_TABLE)((UCHAR*)Peprocess + 0x448);KdPrint(("%p", Table->BalancedRoot.RightChild));if (Table->BalancedRoot.LeftChild)EnumVad((MMVAD*)Table->BalancedRoot.LeftChild);if (Table->BalancedRoot.RightChild)EnumVad((MMVAD*)Table->BalancedRoot.RightChild);//解除挂靠KeDetachProcess();KdPrint(("总模块数量为%ld", TotalNum));}else{KdPrint(("PsLookupProcessByProcessId failed"));return FALSE;}return TRUE;
}

遍历vad二叉树来遍历进程里的模块相关推荐

  1. c++层次遍历_二叉树的遍历详解

    概述 二叉树的遍历是一个很常见的问题.二叉树的遍历方式主要有:先序遍历.中序遍历.后序遍历.层次遍历.先序.中序.后序其实指的是父节点被访问的次序.若在遍历过程中,父节点先于它的子节点被访问,就是先序 ...

  2. 刷题:二叉树的遍历方式及根据遍历结果还原二叉树

    二叉树的遍历方式及根据遍历结果还原二叉树 1. 二叉树的遍历方式 2. 根据遍历结果还原二叉树 2.1 已知先序遍历和中序遍历还原二叉树 2.2 已知后序遍历和中序遍历还原二叉树 实验代码: 1. 二 ...

  3. 根据二叉树写遍历序列

    根据二叉树写遍历序列 二叉树的遍历主要有三种: (1)先(根)序遍历(根左右) (2)中(根)序遍历(左根右) (3)后(根)序遍历(左右根) 根据二叉树遍历序列画二叉树的文章在这里, 点我跳转. 例 ...

  4. 数据结构-二叉树的遍历

    二叉树是每个结点最多有两个子树的树结构.通常子树被称作"左子树"(left subtree)和"右子树"(right subtree).二叉树常被用于实现二叉查 ...

  5. 二叉树的遍历—广度优先(BFS)和深度优先(DFS)python实现

    二叉树 二叉树(Binary tree)是树形结构的一个重要类型.对于二叉树的基础知识这里不做过多介绍,下面我们直接介绍二叉树的遍历方式和如何用python代码去实现二叉树的遍历. 二叉树的遍历(重点 ...

  6. 二叉树的遍历(前序遍历,中序遍历,后序遍历)

    一.二叉树的遍历方式 1.前序遍历 2.中序遍历 3.后序遍历 遍历思想:遍历二叉树采用递归的方式,首先要理解递归的思想. 遍历是要先判断根节点是否为空,如果不为空时,再向下遍历. 二叉树的遍历: 按 ...

  7. java根据前序和中序建树_Java实现根据前序遍历构建二叉树(前序遍历、中序遍历、后序遍历)...

    Java实现根据前序遍历构建二叉树(前序遍历.中序遍历.后序遍历),Java关于ACM的代码真的好少,想参考如何用java实现二叉树googl 前言 Java关于ACM的代码真的好少,想参考如何用ja ...

  8. 【数据结构复习】二叉树的遍历——从微软2014校园招聘说起

    [数据结构复习]是学习.复习常用数据结构系列文章.数据结构与算法密不可分,是程序实现功能的重要组成部分.优秀的数据结构可以提高算法的时间及空间效率.反之,将增加算法复杂度,甚至妨碍程序的正确执行. 一 ...

  9. 二叉树的遍历(前序、中序、后序、层次)

    概述 二叉树的遍历主要有前序遍历.中序遍历.后序遍历.层次遍历 前三种遍历常见考察点是递归遍历.非递归遍历.moriss遍历,层次遍历的考察点是:是否分层打印. 代码 递归遍历(前序.中序.后序),包 ...

  10. 二叉树的递归遍历和非递归遍历实现(C++)(深度优先)

    二叉树的递归遍历和非递归遍历(C++) 二叉树的遍历方式可分为先序遍历,中序遍历和后序遍历 先序遍历:先遍历根节点,再遍历左子节点,最后遍历右子节点. 中序遍历:先遍历左子节点,再遍历根节点,最后遍历 ...

最新文章

  1. Oracle备份恢复一(手动备份)
  2. Spring-profile设置
  3. 重启docker 服务命令
  4. android输入时背景颜色,Button根据EditText输入状态改变背景颜色
  5. 名图1.8智能隐藏功能_自动打包不脏手才是真智能,双11销冠,拓牛自动打包垃圾桶体验...
  6. About “condition variables”
  7. 【CF1325E】 Ehab's REAL Number Theory Problem(思维+最小环bfs)
  8. simulink电子节气门控制模型发动机电子节气门控制模型,有说明文档,教程。
  9. 什么是前端工程师?前端工程师需要掌握什么技能?
  10. 月入过万的外卖CPS红包小程序源码分享(附搭建教程)
  11. win7计算机高级还原,主编教您win7怎么一键还原
  12. showdown解析md文件
  13. [附源码]计算机毕业设计springboot咖啡销售平台
  14. 简单题我重拳出击,困难题我唯唯诺诺
  15. 从学校到工作的一些收获
  16. Python 提示 ModuleNotFoundError: No module named ‘common‘
  17. html迷你音乐播放器,javascript开发迷你音乐播放器
  18. Android华为HiAI语音识别的集成与使用
  19. WEB前端开发 解决IE6、IE7、IE8样式不兼容问题
  20. Win7Linux双系统下,修复Linux引导。

热门文章

  1. 怎样设计一个好的社交网站
  2. PS制作独特火焰立体文字
  3. 【老生谈算法】matlab实现MF-TDMA系统中多用户多业务的无线接入控制和时隙分配算法源码——时隙分配算法
  4. python编程求100以内能被5整除之和_C语言,求100以内能被3整除或能被5整除的数的和...
  5. 工具1:DNS隧道检测工具BotDAD
  6. FZU - 1759 Problem 1759 Super A^B mod C 欧拉降幂公式
  7. 华商网H.S.W社团:寻找有创造力的陕西大学生
  8. linux上的录屏软件下载,linux-推荐两款好用的录屏软件
  9. Mysql主从备份数据库服务器搭建
  10. 关于树莓派DSI屏幕触摸不准的问题