365bet亚洲版登录-bet官网365入口

365bet亚洲版登录拥有超过百间客房,bet官网365入口的文化历经几十年的传承和积淀形成的核心内容获得业界广泛的认可,365bet亚洲版登录是目前信誉最高的娱乐场所,同国内外几百家网上内容供应商建立了合作关系。

故障排查

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

 

在写 filter driver 或 rootkit 时,日常索要 attach 到器械栈中的指标设备,来阻止途经的 IRP(I/O Request Packet),完结过滤效果。
先是要查出目的设备向 Windows Object Manager 维护的全局名称空间注册的 _DEVICE_OBJECT 名,此类消息方可因而疑似 WinObj.exe 的工具得到。

随后调用 ObReferenceObjectByName(),该函数把得到的指标对象地址存款和储蓄到它的末段三个参数(指针)中,然后再次来到给调用者。
实战时我们会发觉,援引 _DRIVER_OBJECT 差不离总是成功;而引用 _DEVICE_OBJECT,则不料定会中标,重返的 NTSTATUS 状态码平时以二种居多:

1 C0000022(STATUS_ACCESS_DENIED)
2 C0000024(STATUS_OBJECT_TYPE_MISMATCH)

 

率先种情景通常是出于创立目的 _DEVICE_OBJECT 时钦点的 session id 与眼下的 session id 分裂样,或许目的对象具备特殊的平安访谈令牌/安全品质,所以大家鞭长不比以常规格局获得,何况这种错误频仍出今后 IoGetDeviceObjectPointer() 调用时,偏偏许多讲过滤驱动和 rootkit 的书本都用 IoGetDeviceObjectPointer() 作为示范代码的一片段,真是有一些误人子弟的表示。

其次种境况分布现身在通过 ObReferenceObjectByName() 引用有些 _DEVICE_OBJECT 的情形中,缘由与 ObReferenceObjectByName() 利用其余实施体组件例程,在大局名称空间中实践的名字查找逻辑缜密相关,前边会降解。

内需提出,既然经过 ObReferenceObjectByName() 引用绝大比相当多 _DRIVER_OBJECT 都会成功,而且 _DRIVER_OBJECT.DeviceObject 又针对该驱动成立的装置链中第二个 _DEVICE_OBJECT,那么那正是最安妥的方法。然而大家依然要理解 STATUS_OBJECT_TYPE_MISMATCH 的原因。

 ObReferenceObjectByName() 是二个未公开的例程,在 MSDN 中平昔不文书档案描述,其他方面,富含的 ntddk.h 或 wdm.h 头文件中也从未相关原型声明;

唯独内核影像ntoskrnl.exe 和其余的本子,的确导出了它的号子,换言之,我们只须求报告链接器把这些函数名作为外界符号来深入分析就可以。
此外,ObReferenceObjectByName() 的第三个参数也是多个未文书档案化的数据类型(POBJECT_TYPE),所以相关的申明是必得的,如下图所示:

 

图片 1

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

请留意,大家证明了叁个针对类型“POBJECT_TYPE”的指针——IoDeviceObjectType——而“POBJECT_TYPE”本身又是指向项目“OBJECT_TYPE”的指针,所以在传诵第七个参数时,必定要如履薄冰,使用操作符 “*” 解引 IoDeviceObjectType,才会与它的形参类型(POBJECT_TYPE)相称,不然会招致 ObReferenceObjectByName() 战败,压抑我们对回到的 NTSTATUS 原因剖断!

 

万意气风发我们相濡以沫的驱动要收获“DeviceQQProtect”对应的 _DEVICE_OBJECT 指针,然后检查重临的 NTSTATUS 状态码,如下图所示:

(“DeviceQQProtect”是与当下通讯软件 QQ 一同安装的八个过滤驱动之风度翩翩:QQProtect.sys 创设的装置对象名,
它也是我们稍后的 IRP Dispatch Routine Hook 实验对象!)

 

图片 2

 

可以看到,在虚构机中测验时,DbgPrint() 打字与印刷再次回到的状态码为 C0000024(STATUS_OBJECT_TYPE_MISMATCH),也正是指标类型不相称,如下图所示:

 

图片 3

 

适逢其时手边有生龙活虎份 NT 5.2 版内核的源码,它用来编写翻译 Windows XP/Server 2004使用的基本,即便与本人的测量检验机器的 NT 6.1 版内核有所差距,可是
抑或姑且来看下 ObReferenceObjectByName() 内部究竟干了些什么。ObReference*() 连串的例程许多坐落内核源码的“obref.c” 与“obdir.c
文本内。通过对有关调用链的分析,如下图所示:

图片 4

上海体育场所中有两处关键点:其一是 ObpLookupObjectName() 中,检核查象对象类型的最初化设定(用 _OBJECT_TYPE_INITIALIZER 构造意味着)中,是不是内定了 ParseProcedure 例程,对于“设备”类对象,该函数值指针总是为 IopParseDevice() ,最后促成调用 IopParseDevice()

悉心考查前方的图样可以知道,从当中期小编调用 ObReferenceObjectByName() 领头,就为它的第五个参数 ParseContext 传入 NULL,而 ParseContext 会在调用链中一路往下传递,最后由 IopParseDevice() 选择并对该参数进行表达,如若它为空,就回到 STATUS_OBJECT_TYPE_MISMATCH

目前你了然为何 ObReferenceObjectByName() 引用目的设备连接令人这么蛋疼,关键就在要求分配并开头化这几个 ParseContext。。。

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

自个儿在源码中领取了相关代码片段,如上面这么些图所示,最棒能把它与地点的流程图相比加深精晓,
背后笔者会拿虚构机上的 Windows 7(基于 NT 6.1 版内核)调节和测验,你会奇异乡意识,追踪栈回溯音讯时,
依旧与 NT 5.2 版内核源码中的调用链极其相似,那表明版本之间的迁移并未让对象名查找和验证逻辑改动太大。
(最少从 Windows XP 到 7 来讲是如此,之后的版本由于没测量检验过,就不驾驭了!)

 

图片 5

 

图片 6

图片 7

 

 

 

IopParseDevice() 内部的这段注释,小编隐隐获得了绕过调用源检查实验的笔触——这正是追踪 NtCreateFile() ,看看 OPEN_PACKET 具体是在哪个地方

分配并初阶化的;由于 IopParseDevice() 会检测 POPEN_PACKET 构造实例的生龙活虎对字段来确定保证 ObReferenceObjectByName() 调用
是从 NtCreateFile() 发起的,NtCreateFile() 实以往 NT 5.2 版内核源码的 creater.c 中,它只是简短地推行调用链
IoCreateFile()->IopCreateFile()(此两例程都落到实处在源码的 iosubs.c 中),而现实由 IopCreateFile() 分配并开首化 OPEN_PACKET 结构。

故此我们假设在援引指标设备对象前,仿照 IopCreateFile() 的相干逻辑来分配并初叶化 OPEN_PACKET,并作为 ObReferenceObjectByName()
的参数字传送入,就能绕过 IopParseDevice() 的“调用源检查测验”逻辑。
那有的 Patch 就留待后边的小说再发表。我们这几天先要验证“设备”类对象的“ParseProcedure”确实为 IopParseDevice()。。。。。

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

在双击内核调节和测验景况中,首先通过设备名称“DeviceQQProtect”获得相应对象的音信:

图片 8

收获指标头地址后,格式化并转储在那之中的字段,大家感兴趣的是“TypeIndex”字段,它用来索引“对象类型表”中的相应“对象类型”:

 

图片 9

WInodws 内核使用二个数据结构——ObTypeIndexTable 存放有关各个“对象类型”的音讯,本质上 ObTypeIndexTable 是二个指南针数组,在 32 位类别结构上,各类指针大小 4 字节,而大家得到的索引号为(下标**从 0 开始**)19,下图中的两条表达式据此计算出该“对象类型”的地址:

图片 10

想来,相应“对象类型”构造的地址为 0x855cef78——Windows 内核用数据布局 _OBJECT_TYPE 来代表“对象类型”的概念,所以重复
格式化并转储个中的字段,大家感兴趣的字段为“TypeInfo”,如前所述,它是二个“对象类型起头化设定”构造,内核用
_OBJECT_TYPE_INITIALIZER 来代表“对象类型初步化设定”的概念。需求注意,TypeInfo 偏移它的母构造起首地址 0x28 字节,所以要丰裕这几个
offset 再查看,如你所见,个中的“ParseProcedure”为 IopParseDevice()

 

图片 11

 

下卷文章将探究哪边绕过 IopParseDevice(卡塔尔(英语:State of Qatar) 的调用源检测,并调节和测量试验大家的战果,将其利用于 rootkit 开拓手艺中。

 

本文由365bet亚洲版登录发布于操作系统,转载请注明出处:故障排查

您可能还会对下面的文章感兴趣: