设为首页 加入收藏

TOP

-------- ROOTKIT 核心技术——系统服务调度表挂钩调试(PART III) --------(三)
2018-10-21 18:08:40 】 浏览:234
Tags:-------- ROOTKIT 核心 技术 系统 服务 调度 挂钩 调试 PART III
inc\api
0x00000002-0x00000001/0x00000001 usemdlmappingssdt.c ntstatus.h d:\winddk\7600.16385.1\inc\api 0x00000002-0x00000001/0x00000001 usemdlmappingssdt.c bugcodes.h d:\winddk\7600.16385.1\inc\api 0x00000002-0x00000001/0x00000001 usemdlmappingssdt.c ntiologc.h d:\winddk\7600.16385.1\inc\api 0x00000002-0x00000001/0x00000001 usemdlmappingssdt.c mce.h d:\winddk\7600.16385.1\inc\ddk 0x00000002-0x00000001/0x00000001 usemdlmappingssdt.c pshpack4.h d:\winddk\7600.16385.1\inc\api 0x00000002-0x00000001/0x00000001 usemdlmappingssdt.c poppack.h d:\winddk\7600.16385.1\inc\api 0x00000002-0x00000001/0x00000001 usemdlmappingssdt.c guiddef.h d:\winddk\7600.16385.1\inc\api 0x00000002-0x00000001/0x00000001 usemdlmappingssdt.c pshpack1.h d:\winddk\7600.16385.1\inc\api 0x00000001-0x00000001/0x00000001 usemdlmappingssdt.c datatype.h d:\kmdsource_use_mdl_mapping_ssdt 0x00000001-0x00000001/0x00000001 usemdlmappingssdt.c dbgmsg.h d:\kmdsource_use_mdl_mapping_ssdt 0x00000001-0x00000001/0x00000001 usemdlmappingssdt.c ctrlcode.h d:\kmdsource_use_mdl_mapping_ssdt 0x00000001-0x00000001/0x00000001 usemdlmappingssdt.c device.h d:\kmdsource_use_mdl_mapping_ssdt 0x00000002-0x00000001/0x00000001 usemdlmappingssdt.c ntddk.h d:\winddk\7600.16385.1\inc\ddk Compiling usemdlmappingssdt.c because .. (0x00000006) BUILD: Saving d:\winddk\7600.16385.1\build.dat... BUILD: Compiling and Linking d:\kmdsource_use_mdl_mapping_ssdt directory Configuring OACR for 'root:x86chk' - <OACR on> 1>warnings in directory d:\kmdsource_use_mdl_mapping_ssdt alSystemServicePtr' differs in levels of indirection from 'DWORD'1>d:\kmdsource_use_mdl_mapping_ssdt\usemdlmappingssdt.c(157) : warning BUILD: Finish time: Mon Jan 29 14:08:35 2018 BUILD: Done 3 files compiled - 2 Warnings 1 executable built D:\kmdsource_use_mdl_mapping_ssdt>

 

我在前一篇文章中说过,可以忽略源码中 157 行造成的警告——rootkit 的实际效果不受该警告影响。

把编译出来的 UseMdlMappingSSDT.sys 拷贝到虚拟机或另一台真实机器上(交叉编译的目标平台假设是 widnows 7

或  Windows Server 2008),使用 sc.exe 加载该驱动进入内核空间,如果一切正常,宿主机上应该会触发首个断点,位

于 MapMdl() 中,如下图,注意,DbgPrint() 与 DBG_TRACE 宏的输出信息除了可以在目标机器上用 DbgView.exe 查看外,也

直接输出到宿主机上调试器的控制台。我们只关心获取到的 KiServiceTable 地址: 83CABF7C ;

分配出来的一个 nt!_MDL 结构地址:86A838A8 ;

由于之前选择了“Checked Build”构建环境,现在调试器能够根据“UseMdlMappingSSDT.pdb”符号文件显示诸如 MapMdl()

之类函数名称:

 

 

结合源码可知,首个断点位于 IoAllocateMdl() 调用后不远处,我们的意图是检查该调用后的一个 nt!_MDL 对象内容,前面通

过 mdl_pointer 保存的地址派上用场:

 

 

如你所见,IoAllocateMdl() 分配出来的一个 MDL 总大小(头部加上其后的 PFN 数组)为 36 字节;当前的标志取值 10 进制

的 8,参见前一篇博文可知,它只对应 MDL_ALLOCATED_FIXED_SIZE;还记得吗,我在前一篇博文指出:

仅当 _MDL 的 MdlFlags 字段内设置了 MDL_MAPPED_TO_SYSTEM_VA 或 MDL_SOURCE_IS_NONPAGED_POOL 比特位,

MappedSystemVa 字段才是有效的,因此上图中的 MappedSystemVa 字段值 0x8059d950 没有意义。

你还看到, StartVa 字段值为 0x83cab000,这就是 KiServiceTable(从 0x83CABF7C 开始)所在的虚拟页起始地址,注意这个

地址是对齐在 4 KB 边界上的,因为虚拟页和物理页大小正情况下均为 4 KB

ByteOffset 字段值为 0xf7c,亦即 KiServiceTable 的页内偏移量—— 0x83CABF7C - 0x83cab000 = 0xf7c

ByteCount 字段值为 0x644,亦即整张 KiServiceTable 调用表(一片缓冲区)的大小—— 1064 字节。

在犹如醍醐灌顶的状态下,按“g”继续执行目标系统至第二个软件断点处,再次转储这个 nt!_MDL 对象内容:

 

 

 

MdlFlags 字段值变成了 138(0x8A),对照相关的宏定义可知,这是 MDL_WRITE_OPERATION(0x80)加

上 MDL_PAGES_LOCKED(0x

首页 上一页 1 2 3 4 下一页 尾页 3/4/4
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇-------- Rootkit 核心技术——利.. 下一篇C语言实现排名算法和排位算法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目