这里补充一个知识点方便后续兼容更多版本的操作系统
以eprocess下ActiveProcessLinks为例,不同版本偏移值不同


那么如何完美兼容所有系统呢?
收集所有版本的偏移值,使用RtlGetVersion获取当前系统版本信息,switch case 给出偏移
例如想获取eprocess下的UniqueProcessId, 利用导出函数PsGetProcessId

例如想获取eprocess下的ActiveProcessLinks,并没有导出函数可以直接获取ActiveProcessLinks,但是通过观察各个版本的结构发现ActiveProcessLinks总在UniqueProcessId +0x8的位置,于是可以利用方法二定位到的值+0x8
微软为了方便调试,大多数版本的内核模块都提供了符号,并且提供了解析符号的方法
具体可以参考开源项目:8f4K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6m8K9i4t1I4y4q4)9J5c8W2y4&6L8h3u0G2L8r3W2U0b7h3y4U0k6i4y4K6R3解析,R0解析都有

注:下载pdb需要联网,但是解析不需要。
成熟的产品可以先尝试联网获取pdb,失败则使用本地特征
通过eprocess下的peb获取(x84 为WoW64Process)
PsLookupProcessByProcessId获取进程eprocess->peb->Ldr->InMemoryOrderModuleList->BaseDllName

在eprocess下struct_RTL_AVL_TREEVadRoot
VAD是一个AVL自平衡二叉树,树的每一个节点代表一段虚拟地址空间。程序中的代码段,数据段,堆段都会各种占用一个或多个VAD节点,由一个MMVAD结构完整描述。
VAD 是 Virtual Address Descriptor(虚拟地址描述符)的缩写,它是 Windows 操作系统中用于描述进程虚拟内存布局的数据结构。VAD 结构记录了进程的虚拟地址空间中的每个内存块的信息,包括起始地址、结束地址、访问权限等。
在 Windows 操作系统中,每个进程都有自己的虚拟地址空间,用于存储代码、数据和堆栈等。这个虚拟地址空间被划分为多个连续的内存块,每个内存块对应一段连续的虚拟地址范围。VAD 结构用于管理和描述这些虚拟地址范围。
VAD 结构通常以树的形式组织,每个 VAD 表示一个内存块,并通过指针链接起来。每个 VAD 结构包含以下重要字段:
StartingVpn:内存块的起始虚拟页号(Virtual Page Number)。
EndingVpn:内存块的结束虚拟页号。
ControlArea:与该内存块关联的控制区域(Control Area)。
VadFlags:标识内存块的属性,如保护级别、提交状态等。
windbg 使用!vad +addr 自动解析



传播安全知识、拓宽行业人脉——看雪讲师团队等你加入!