【www.710.com】IopParseDevice() 如何对传播的 OPEN

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

 

 

把重新编写翻译好的驱动放到虚构机中,在晋级权限后的授命提醒符中实行
bcdedit.exe,启用调节和测量检验形式,这样重启虚构机后,就能够进来调节和测验情势(无需在开发银行过程中按下
F8 选择菜单卡塔尔。

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

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

“DeviceQQProtect”
相应的装置对象指针,ObReferenceObjectByName() 重临 C0000024。

www.710.com 1

列出的数码一定于实行解引操作符 *
后的结果
【www.710.com】IopParseDevice() 如何对传播的 OPEN。卡塔 尔(英语:State of Qatar),第一个参数是 UNICODE_ST奥德赛ING
结构的地点,对应源码定义中的少年老成枚 _UNICODE_ST纳瓦拉ING
指针,该协会中蕴藏的是我们驱动在注册表中的完整路线:

自身的消除方案是,直接把该字段的申明所在行注释掉,下图呈现了该字段具体的地点(在
iomgr.h” 中的行号卡塔 尔(英语:State of Qatar),方便各位火速搜索:

www.710.com 2
——————————————————————————————————————————————————————————————————

www.710.com 3

以下图为例子吗,传递给 nt!ExAllocatePoolWithTag()
的四个参数(从左到右卡塔 尔(阿拉伯语:قطر‎便是00000000(NonPagedPool卡塔 尔(阿拉伯语:قطر‎,00000070(小编硬编码的值卡塔 尔(英语:State of Qatar),704f6f49(ASCII
字符串“pOoI”)
,同理,传递给 hideprocess!DriverEntry() 的率先个参数
867c3550 是 _DRIVER_OBJECT 结构的地址,由I/O
微电脑加载它时为它分配(注意与源码中 DriverEntry() 定义的豆蔻梢头枚
_DRIVER_OBJECT 指针区别,“Args to
Child”

 

www.710.com 4

www.710.com 5

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

小编把温馨的驱动达成有按需加载,也便是应用劳务调节微电脑sc.exe卡塔 尔(英语:State of Qatar)发出命令来动态加载和卸载,实现此意义的应和批管理公事内容如下图,注意该文件要放在设想机中施行,“start=
demand” 注脚通过 sc.exe 按需运行
;“binpath”
正是驱动文件寄存的磁盘路径
,如果本人的驱动名叫hideprocess.sys,推行该批管理职务后,就在相关的注册表地点增多了意气风发项,未来只需在
cmd.exe 中实行 “sc.exe start/stop hideprocess” 就可以知道动态加卸载。

顺便说一下,根据 A 设备名得到 A 设备对象的指针,然后把
rootkit/自身驱动创制的恶意设备 attach 到 A
设备所在的设备栈,进而阻碍检查通过 A 设备的 IRP
内数据。。。。这种措施已经相比过时了,因为以后反病毒软件的底子格局组件也会检讨那一个器具栈,寻觅其余匹配特征码的恶心设备,再者,内核调节和测量试验器的
“!devstack”
命令相当的轻巧遍历揭发出给定设备所在的配备栈内容,被周边用于Computer考察取证中,从
rootkit 的严重性目的——完成隐身——的角度来看, attach
到器材栈就不是一个好标准。

规行矩步上述措施加载时,就能活动触发大家设定好的软件断点,就能够在宿主机中检查设想机的基石空间。
其余还需注意一点:编写翻译驱动时的
“构建” 意况应该接纳 Check
Build
,那样会后生可畏并生成同名称的标识文件,后缀为
.pdb”,进而调节和测验器能够体现大家友好驱动中的函数与变量名称,提升调节和测量检验成效,如下图:

小心,NT
6.1 版内核在编写翻译时刻的 OPEN_PACKET 结构显然是未经 “恶意
更正的,所以编写翻译器为其 “sizeof(OPEN_PACKET)” 表达式总括 0x70
的值,而小编辈在和煦的驱动中拿掉了 OPEN_PACKET
个中三个字段使得编写翻译器为发挥式 “sizeof(OPEN_PACKET)” 预总计 0x58
的值(前边的调治将养阶段会申明卡塔 尔(英语:State of Qatar),这会促成 “Size” 字段不是
IopParseDevice() 内部逻辑预期的 0x70,进而引致再次来到C0000024(STATUS_OBJECT_TYPE_MISMATCH)。

 

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

然而,OPEN_PACKET
结构中唯有叁个字段不是 “原生” 定义的——那便是 “PDUMMY_FILE_OBJECT”
类型,须求包蕴其余头文件才不变成编写翻译器报错。

那是本人的美好梦想,但实际总是冷酷的,在自身跟踪到原子操作类别函数

 

栈的顶层函数
“ReferenceDeviceAndHookIRPdispatchRoutine+0x56
是自己加多软中断之处。执行 “r” 命令查看当前的 x86
通用寄放器状态,EIP 指向地址 0x8f4a3196 ,推行 “u
hideprocess!ReferenceDeviceAndHookIRPdispatchRoutine+0x56
L2”,反汇编输出的首先行地址正是 0x8f4a3196,与 EIP
的值切合;第二行是把叁个 16 进制值 “ 704F6F49h” 压栈,实际上它是
ASCII 字符 “pOoI” 的 16
进制编码,换言之,那是在通过内核栈传递 ExAllocatePoolWithTag()
的第多少个参数(从右往左传递,请回想早前的 IopAllocateOpenPacket()
宏定义这张图卡塔尔国。

www.710.com 6

相反,通过 ObReferenceObjectByName()
总是能够获得驱动对象的指针,从而能够 hook 该驱动的 IRP
分发例程,这种手法蒙蔽性超级高,何况不轻易被检查评定出来。

www.710.com 7

此地还应该有七个标题,担任分配该组织体内核内部存款和储蓄器的例程 IopAllocateOpenPacket()
是叁个宏,Visual C++ 二〇一四 中付出它是用 ExAllocatePoolWithTag()
定义的。那就好办了,在大家相濡相呴的驱动力源码中,增添相应定义就可以,如下图:

平日来讲图所示,你还也许会小心到,小编把
“Type” 字段的常量 “IO_TYPE_OPEN_PACKET”
改成了相应的数值,以管教学学风姿洒脱旦。

笔者想只怕是因为基本源码版本的变动,引致相关例程的论断逻辑也分歧样了,不能依靠前意气风发版源码的逻辑来编排推测运营在后后生可畏版内核上的驱动。

接触软件断点后,大家日常会用
kv” 命令查看栈回溯音讯,它披暴光我们的驱动入口点 DriverEntry() 是由
I/O 微电脑的 IopLoadDriver() 调用的:

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

除此以外,由于
IopAllocateOpenPacket() 等价于
ExAllocatePoolWithTag(),而后人平常重回泛型指针(“ PVOID ,亦即 void
”),
据此本人强制把它转型为与
“openPacket” 豆蔻梢头致的项目。
防患未然,“东风”
就在于调用 ObReferenceObjectByName() 时,为第1个参数字传送入“openPacket”
就能够,上海体育场合展现的很明亮了。

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

 

特别不好的是,我把编写翻译出来的驱动放到虚构机(Windows
7,基于 NT 6.1 版内核卡塔 尔(英语:State of Qatar)里面动态加载测量检验,依然不能取获得

说来讲去,基于上述理由小编一点办法也未有继续跟进到 ObpLookupObjectName()
里面查看它是还是不是推行了 IopParseDevice()
回调,从而不可能分明毕竟为啥前者再次来到 C0000024。

 

“-y”
钦命符号文件的职位(机器指令中并未有内核函数与变量的符号,所以调节和测量试验器需求查找额外的号子以向顾客体现人类可读的称号);
“-k”
参数钦点调节和测量试验类型为
命名管道模拟串口1”,Porter率数值越高,响应越快。

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

www.710.com 8

为了寻找故障原因,作者在分配
OPEN_PACKET 逻辑的最近利用内联系汇率编增多了四个软中断 “__asm{ int
3; } 

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

 

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

nt!ExInterlockedPopEntrySList()
调用时,kd.exe
就卡住了,不可能持续追踪从此以后的调用链。从稍早的栈回溯音讯来看,与源码卯月大家估计的调用系列差不离切合,只是不领会为什么在
nt!ObpAllocateObjectNameBuffer() 中,为了给传入的驱动对象名称
“DeviceQQProtect”
分配内核内部存储器,调用 nt!ExInterlockedPopEntrySList(),而后人却力不能及追踪。。。。是设想机情状的来由,照旧原子操作类函数的不可分割性质?

也正是说,我们一贯复制
IopCreateFile() 中的 OPEN_PACKET 结构伊始化部分逻辑就能够了?

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

后续按下
t” 单步实践,如下图所示,你能够看来,ExAllocatePoolWithTag()
的第三个参数,分配的基石内部存款和储蓄器大小为 0x70
字节,因为自己在宏定义中硬编码了这么些值,并不是用 sizeof(OPEN_PACKET)
说明式让编写翻译器计算;其他方面,图中的 “dt” 命令也证实了它的朗朗上口为
0x70 字节。

www.710.com 9

www.710.com 10

 

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

 

大家依据源码中的暗指来追踪OPEN_PACKET 结构毕竟在哪分配的,如前所述,调用链
NtCreateFile->IoCreateFile()->IopCreateFile() 的末段,也正是在
IopCreateFile() 内部,实际担负 OPEN_PACKET
的发轫化。上面贴出的代码片段以 NT 5.2 版内核源码为样例:

接下来直白单步实行到调用
ObReferenceObjectByName() 前夕,在此我们要 “步入
它的内部,进行故障每一个审核,所以按下 “t
跟进,这里有三个小技术,大家曾经解析过 ObReferenceObjectByName()
的源码,知道它会调用相当多函数,並且差不离理解难题应时而生在
ObpLookupObjectName() 里面,所以指令
tc”能够追踪到各类函数调用场结束,再由客商决定是不是跟进该函数内部。

 

实际应用方案或然有个别,比较花时间而已,便是使用 “u” 指令反汇编
ObpLookupObjectName() 最早处对应的机器指令,再反编译成近似的 C 伪码,与
NT 5.2
版内核源码比较,搜索个中退换之处,但那是多个费时费劲的办事,且收入甚微,还不比直接在互联互连网搜释出的
NT 6.1 版内核源码,或然挨近的本子,再思忖绕过的秘技。

持续的博文将商量怎么样将这种本事用在
rootkit 中,同不经常间适应当前盛行的舍短取长多微电脑(SMP卡塔 尔(阿拉伯语:قطر‎境况。

在上大器晚成篇小说中,我们早已看到IopParseDevice() 怎么着对传播的 OPEN_PACKET 结构进行表达。假使ObReferenceObjectByName() 的调用者未有分配并开头化第多个参数
ParseContext,而仅是简约地流传 “NULL” ,那么当调用链深刻到
IopParseDevice()
内部时,就会因验证退步重回 C0000024(STATUS_OBJECT_TYPE_MISMATCH)。

 

因为
OPEN_PACKET 结构相近未有当面包车型客车文书档案来描述,所以照旧在我们的驱动力源码中用 
#include
包含定义它的头文件,要么间接复制订义的那部分黏贴进来。很明朗,前面一个比较轻易——OPEN_PACKET
在底工源码的 “iomgr.h
中定义,而该头文件又嵌套包含了一批杂乱无章的内核头文件,要清理那几个嵌套包罗关系很费劲,况兼最要紧的是,内部某些头文件定义的数据类型会与驱动开采中用的 “ntddk.h”
和“wdm.h”重复,引起编写翻译器的抱怨。
就此间接在 “iomgr.h
中寻找字串 “typedef struct
_OPEN_PACKET”,把找到的定义块拷贝进来就可以。

www.710.com 11

讲一些废话,经常大家在栈回溯中见到的顶层表明行,有多个 “Args to Child” 项目,表示调用者传递给它的参数,然则最多也只可以显示前多个。

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

 

参数
“logo” 钦命要把全路调节和测量试验进度的出口音讯写入日志;

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图