PACKET 结构进行验证

————————————————————————————————————————————————————————————————

在上一篇文章中,大家早已观察IopParseDevice() 怎样对传播的 OPEN_PACKET 结构实行验证。假设ObReferenceObjectByName() 的调用者未有分配并先导化第五个参数
ParseContext,而仅是归纳地传出 “NULL” ,那么当调用链深切到
IopParseDevice()
内部时,就能因验证退步再次来到 C0000024(STATUS_OBJECT_TYPE_MISMATCH)。

咱俩依据源码中的暗中表示来追踪OPEN_PACKET 结构毕竟在哪分配的,如前所述,调用链
NtCreateFile->IoCreateFile()->IopCreateFile() 的最终,也正是在
IopCreateFile() 内部,实际担负 OPEN_金沙网址 ,PACKET
的开首化。上面贴出的代码片段以 NT 5.2 版内核源码为样例:

 

金沙网址 1

也正是说,我们平昔复制
IopCreateFile() 中的 OPEN_PACKET 结构开端化部分逻辑就行了?

这里还会有二个标题,肩负分配该组织体内核内部存款和储蓄器的例程 IopAllocateOpenPacket()
是多少个宏,Visual C++ 二零一五 中付出它是用 ExAllocatePoolWithTag()
定义的。那就好办了,在大家通力合作的驱动力源码中,增加相应定义就可以,如下图:

 

金沙网址 2

 

————————————————————————————————————————————————————————————

因为
OPEN_PACKET 结构同样未有当面包车型客车文书档案来描述,所以依旧在我们的驱动力源码中用 
#include
满含定义它的头文件,要么直接复制订义的那有个别黏贴进来。很令人瞩目,前者相当的轻巧——OPEN_PACKET
在基本源码的 “iomgr.h
中定义,而该头文件又嵌套包涵了一群杂七杂八的内核头文件,要理清这几个嵌套包罗关系很艰难,何况最关键的是,个中有的头文件定义的数据类型会与驱动开辟中用的 “ntddk.h”
和“wdm.h”重复,引起编写翻译器的抱怨。
由此直接在 “iomgr.h
中搜索字串 “typedef struct
_OPEN_PACKET”,把找到的概念块拷贝进来就能够。

然而,OPEN_PACKET
结构中独有多个字段不是 “原生” 定义的——那就是 “PDUMMY_FILE_OBJECT”
类型,须要包含别的头文件才不产生编写翻译器报错。

自个儿的建设方案是,直接把该字段的扬言所在行注释掉,下图显示了该字段具体的职位(在
iomgr.h” 中的行号),方便各位火速寻觅:

 

金沙网址 3

——————————————————————————————————————————————————————————————————

细心,NT
6.1 版内核在编译时刻的 OPEN_PACKET 结构鲜明是未经 “恶意
修改的,所以编写翻译器为其 “sizeof(OPEN_PACKET)” 表达式总结 0x70
的值,而笔者辈在大团结的驱动中拿掉了 OPEN_PACKET
其中一个字段使得编译器为发挥式 “sizeof(OPEN_PACKET)” 预总括 0x58
的值(前面包车型大巴调养阶段会注脚),那会导致 “Size” 字段不是
IopParseDevice() 内部逻辑预期的 0x70,进而致使返回C0000024(STATUS_OBJECT_TYPE_MISMATCH)。

解决办法也非常的粗略,大家的驱动中,不要依靠理编辑译时刻的测算,直接把
Size” 字段的值硬编码为 0x70 不就好了?

平常来讲图所示,你还会小心到,小编把
“Type” 字段的常量 “IO_TYPE_OPEN_PACKET”
改成了对应的数值,以管教一旦。

 

金沙网址 4

 

别的,由于
IopAllocateOpenPacket() 等价于
ExAllocatePoolWithTag(),而后面一个平时再次来到泛型指针(“ PVOID ,亦即 void
”),
进而本身强制把它转型为与
“openPacket” 一致的品类。
万事俱备,“东风”
就在于调用 ObReferenceObjectByName() 时,为第多少个参数字传送入“openPacket”
就可以,上图突显的很精通了。

——————————————————————————————————————————————————————————————————

很消极的是,笔者把编写翻译出来的驱动放到虚构机(Windows
7,基于 NT 6.1 版内核)里面动态加载测量检验,照旧一点都不大概得到到

“\Device\QQProtect”
相应的装置对象指针,ObReferenceObjectByName() 重返 C0000024。

为了搜索故障原因,小编在分配
OPEN_PACKET 逻辑的前边利用内联系货币的比率编加多了一个软中断 “__asm{ int
3; } 

”,宿主机器上运维水源调节和测量试验器 kd.exe,作者的运行参数疑似那样:

kd.exe
-n -v -logo d:\virtual_machine_debugging.txt -y
SRV*C:\Symbols* -k
com:pipe,port=\\.\pipe\com_1,baud=115200,reconnect

 

参数
“logo” 钦定要把任何调节和测量检验进度的输出音信写入日志;

“-y”
钦点符号文件的地点(机器指令中从未内核函数与变量的符号,所以调节和测量检验器供给查找额外的号子以向客商显示人类可读的称呼);
“-k”
参数内定调节和测量检验类型为
取名管道模拟串口1”,Porter率数值越高,响应越快。

把重新编写翻译好的驱动放到虚构机中,在晋级权限后的命令提醒符中推行
bcdedit.exe,启用调节和测量试验情势,那样重启虚构机后,就能跻身调试情势(没有要求在起步进程中按下
F8 选取菜单)。

作者把团结的驱动实现成按需加载,也正是应用服务调整处理器sc.exe)发出命令来动态加载和卸载,完成此意义的照看批管理文件内容如下图,注意该公文要放在虚构机中推行,“start=
demand” 证明通过 sc.exe 按需运转
;“binpath”
就是驱动文件贮存的磁盘路线
,要是本身的驱动名字为hideprocess.sys,执行该批管理职分后,就在连锁的注册表地方增加了一项,现在只需在
cmd.exe 中实施 “sc.exe start/stop hideprocess” 就能够动态加卸载。

金沙网址 5

 

依照上述方法加载时,就能活动触发我们设定好的软件断点,就可以在宿主机中反省设想机的内核空间。
除此以外还需注意一点:编写翻译驱动时的
“营造” 情状应该选取 Check
Build
,那样会一并生成同名称的号子文件,后缀为
.pdb”,进而调试器可以展现大家团结驱动中的函数与变量名称,升高调节和测量检验效能,如下图:

 

金沙网址 6

——————————————————————————————————————————————————————————————————————

接触软件断点后,大家平时会用
kv” 命令查看栈回溯音信,它披暴露大家的驱动入口点 DriverEntry() 是由
I/O 处理器的 IopLoadDriver() 调用的:

 

金沙网址 7

栈的顶层函数
“ReferenceDeviceAndHookIRPdispatchRoutine+0x56
是本身增加软中断的地点。实践 “r” 命令查看当前的 x86
通用贮存器状态,EIP 指向地址 0x8f4a3196 ,实践 “u
hideprocess!ReferenceDeviceAndHookIRPdispatchRoutine+0x56
L2”,反汇编输出的第一行地址正是 0x8f4a3196,与 EIP
的值符合;第二行是把多个 16 进制值 “ 704F6F49h” 压栈,实际上它是
ASCII 字符 “pOoI” 的 16
进制编码,换言之,那是在通过内核栈传递 ExAllocatePoolWithTag()
的第四个参数(从右往左传递,请回想在此之前的 IopAllocateOpenPacket()
宏定义那张图)。

————————————————————————————————————————————————————————————————

三番五次按下
t” 单步实行,如下图所示,你能够见到,ExAllocatePoolWithTag()
的第三个参数,分配的基础内部存款和储蓄器大小为 0x70
字节,因为本人在宏定义中硬编码了这一个值,实际不是用 sizeof(OPEN_PACKET)
表明式让编写翻译器计算;另一方面,图中的 “dt” 命令也印证了它的大大小小为
0x70 字节。

第四个传入的参数
NonPagedPool
为不可换页池,其内的数据不可能被换出物理内部存款和储蓄器,该常量对应的数值为
“0”:

金沙网址 8

 

自己不想浪费时间在查看内核内部存款和储蓄器的分配细节上,所以本身按下
p”,步过 ExAllocatePoolWithTag() 函数调用,接下去的 cmp/jne
汇编类别
对应源码中反省是还是不是成功分配了内存并用于 openPacket
指针,实际的实践结果是跳转到地址 0x8f4a31c6 ,对应源码中开头化
OPEN_PACKET 结构前八个字段的逻辑:

金沙网址 9

接下来直白单步施行到调用
ObReferenceObjectByName() 前夕,在此边大家要 “步入
它的中间,进行故障逐个审查核对,所以按下 “t
跟进,这里有二个小工夫,大家已经剖判过 ObReferenceObjectByName()
的源码,知道它会调用非常多函数,况且大致知道难点应时而生在
ObpLookupObjectName() 里面,所以指令
tc”可以追踪到每种函数调用处结束,再由客商决定是或不是跟进该函数内部。

这是本人的光明期望,但具中华全国体育总会是残暴的,在作者追踪到原子操作类别函数

nt!ExInterlockedPopEntrySList()
调用时,kd.exe
就卡住了,无法持续追踪此后的调用链。从稍早的栈回溯音讯来看,与源码花潮大家推测的调用体系大致切合,只是不掌握为何在
nt!ObpAllocateObjectNameBuffer() 中,为了给传入的驱动对象名称
“\Device\QQProtect”
分配内核内部存款和储蓄器,调用 nt!ExInterlockedPopEntrySList(),而前者却望眼欲穿追踪。。。。是虚构机情况的由来,还是原子操作类函数的不可分割性质?

 

金沙网址 10

 ——————————————————————————————————————————————————————————————

讲一点废话,平时大家在栈回溯中见到的顶层表明行,有多少个 “Args to Child” 项目,表示调用者传递给它的参数,然而最多也只好突显前多个。

以下图为例子吗,传递给 nt!ExAllocatePoolWithTag()
的四个参数(从左到右)便是00000000(NonPagedPool),00000070(笔者硬编码的值),704f6f49(ASCII
字符串“pOoI”)
,同理,传递给 hideprocess!DriverEntry() 的率先个参数
867c3550 是 _DRIVER_OBJECT 结构的地址,由I/O
管理器加载它时为它分配(注意与源码中 DriverEntry() 定义的一枚
_DRIVER_OBJECT 指针差异,“Args to
Child”

列出的多寡一定于实施解引操作符 *
后的结果
),第二个参数是 UNICODE_STWranglerING
结构的地址,对应源码定义中的一枚 _UNICODE_ST奥迪Q5ING
指针,该组织中寄存的是大家驱动在注册表中的完整路线:

 

金沙网址 11
——————————————————————————————————————————————————————————————————

简单来讲,基于以上理由作者不或者持续跟进到 ObpLookupObjectName()
里面查看它是还是不是推行了 IopParseDevice()
回调,进而不或许分明毕竟为何前者再次来到 C0000024。

笔者想可能是因为基础源码版本的生成,导致相关例程的剖断逻辑也分化样了,无法借助前一版源码的逻辑来编排估量运营在后一版内核上的驱动。

实在实施方案可能有的,比较花时间而已,正是运用 “u” 指令反汇编
ObpLookupObjectName() 初步处对应的机器指令,再反编译成类似的 C 伪码,与
NT 5.2
版内核源码相比,找寻里面改造的地点,但那是一个费时费劲的行事,且收入甚微,还不比直接在互联互连网搜释出的
NT 6.1 版内核源码,也许周围的版本,再思虑绕过的格局。

附带说一下,根据 A 设备名获得 A 设备对象的指针,然后把
rootkit/自身驱动创造的恶意设备 attach 到 A
设备所在的设备栈,进而阻碍检查通过 A 设备的 IRP
内数据。。。。这种措施已经相比过时了,因为明日反病毒软件的根本形式组件也会检讨那些设备栈,寻觅别的相配特征码的恶心设备,再者,内核调节和测量试验器的
“!devstack”
命令很轻便遍历揭露出给定设备所在的配备栈内容,被大范围用于Computer考查取证中,从
rootkit 的最主要指标——达成隐身——的角度来看, attach
到装备栈就不是二个好标准。

反倒,通过 ObReferenceObjectByName()
总是能够获取驱动对象的指针,进而能够 hook 该驱动的 IRP
分发例程,这种花招掩瞒性相当高,何况不轻易被检查测量检验出来。

承袭的博文将探究什么将这种技能用在
rootkit 中,同时适应当前盛行的裁长补短多管理器(SMP)情状。

————————————————————————————————————————————————————————————————

相关文章