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

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

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

——–驱动开发之 ObReferenceObjectByName() 故障排查——–,

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

 

在写 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 原因判断!

 

假设大家友好的驱动要取得“\Device\QQProtect”对应的
_DEVICE_OBJECT 指针,然后检查重返的 NTSTATUS
状态码,如下图所示:

(“\Device\QQProtect”是与当时通信软件 QQ
一同安装的多少个过滤驱动之一:QQProtect.sys 创制的配备对象名,
它也是我们稍后的 IRP Dispatch Routine Hook 实验目的!)

 

澳门金沙国际 2

 

可以观察,在虚拟机中测试时,DbgPrint() 打印重回的状态码为
C0000024(STATUS_OBJECT_TYPE_MISMATCH),也就是目的类型不同盟,如下图所示:

 

澳门金沙国际 3

 

凑巧手边有一份 NT 5.2 版内核的源码,它用来编译 Windows XP/Server 2003
使用的基础,就算与我的测试机器的 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()。。。。。

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

在双击内核调试环境中,首先通过设备名称“\Device\QQProtect”取得相应对象的信息:

澳门金沙国际 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()
的调用源检测,并调试大家的结晶,将其利用于 rootkit 开发技术中。

 

ObReferenceObjectByName()
故障排查——–, ————————————————————————————————————…

 

 

 

在写
filter driver 或 rootkit 时,常常须要 attach
到设备栈中的靶子设备,来阻拦途经的 IRP(I/O Request
Packet),达成过滤效果。
首先要得知目的设备向
Windows Object Manager 维护的大局名称空间注册的 _DEVICE_OBJECT
名,此类新闻可以通过像是 WinObj.exe 的工具获得。

在写
filter driver 或 rootkit 时,常常索要 attach
到装备栈中的对象设备,来阻拦途经的 IRP(I/O Request
Packet),落成过滤效果。
率先要摸清目的设备向
Windows Object Manager 维护的全局名称空间注册的 _DEVICE_OBJECT
名,此类音讯可以通过像是 【澳门金沙国际】故障排查,驱动开发之。WinObj.exe 的工具获得。

在写
filter driver 或 rootkit 时,经常索要 attach
到装备栈中的对象设备,来阻止途经的 IRP(I/O Request
Packet),完结过滤效果。
率先要摸清目的设备向
Windows Object Manager 维护的全局名称空间注册的 _DEVICE_OBJECT
名,此类新闻可以通过像是 WinObj.exe 的工具得到。

跟着调用
ObReferenceObjectByName(),该函数把得到的目标对象地址存储到它的末段一个参数(指针)中,然后回到给调用者。
实战时大家会意识,引用
_DRIVER_OBJECT 大概总是成功;而引用
_DEVICE_OBJECT,则不肯定会中标,重临的 NTSTATUS
状态码一般以三种居多:

进而调用
ObReferenceObjectByName(),该函数把收获的靶子对象地址存储到它的最终一个参数(指针)中,然后回来给调用者。
实战时大家会发觉,引用
_DRIVER_OBJECT 大致总是成功;而引用
_DEVICE_OBJECT,则不自然会马到功成,再次回到的 NTSTATUS
状态码一般以三种居多:

随即调用
ObReferenceObjectByName(),该函数把收获的目标对象地址存储到它的结尾一个参数(指针)中,然后回到给调用者。
实战时大家会意识,引用
_DRIVER_OBJECT 大致连接成功;而引用
_DEVICE_OBJECT,则不肯定会成功,重临的 NTSTATUS
状态码一般以两种居多:

1 C0000022(STATUS_ACCESS_DENIED)
2 C0000024(STATUS_OBJECT_TYPE_MISMATCH)
1 C0000022(STATUS_ACCESS_DENIED)
2 C0000024(STATUS_OBJECT_TYPE_MISMATCH)
1 C0000022(STATUS_ACCESS_DENIED)
2 C0000024(STATUS_OBJECT_TYPE_MISMATCH)

 

 

 

首先种景况一般是出于创设目的
_DEVICE_OBJECT 时指定的 session id 与眼前的 session id
不雷同,或者目的对象拥有特殊的安全访问令牌/安全品质,所以我们无能为力以健康办法得到,而且这种张冠李戴频仍出现在
IoGetDeviceObjectPointer() 调用时,偏偏多数讲过滤驱动和 rootkit
的书籍都用 IoGetDeviceObjectPointer()
作为示范代码的一局地,真是有点误人子弟的代表。

首先种情状一般是出于成立目的
_DEVICE_OBJECT 时指定的 session id 与眼前的 session id
不雷同,或者目的对象拥有特殊的平安访问令牌/安全性能,所以我们鞭长莫及以常规方式得到,而且那种错误频仍出现在
IoGetDeviceObjectPointer() 调用时,偏偏多数讲过滤驱动和 rootkit
的书本都用 IoGetDeviceObjectPointer()
作为示范代码的一片段,真是有点误人子弟的代表。

首先种景况一般是出于成立目的
_DEVICE_OBJECT 时指定的 session id 与眼前的 session id
不雷同,或者目的对象拥有特殊的哈密访问令牌/安全质量,所以大家不可能以正常方法赢得,而且那种不当频繁出现在
IoGetDeviceObjectPointer() 调用时,偏偏多数讲过滤驱动和 rootkit
的书本都用 IoGetDeviceObjectPointer()
作为示范代码的一部分,真是有点误人子弟的代表。

第三种景况普遍出现在经过
ObReferenceObjectByName() 引用某些 _DEVICE_OBJECT
的情景中,缘由与 ObReferenceObjectByName()
利用其余执行体组件例程,在大局名称空间中履行的名字查找逻辑缜密相关,前边会分解。

第三种状态普遍出现在经过
ObReferenceObjectByName() 引用某些 _DEVICE_OBJECT
的光景中,缘由与 ObReferenceObjectByName()
利用别的执行体组件例程,在大局名称空间中实践的名字查找逻辑缜密相关,前面会分解。

第三种状态普遍出现在经过
ObReferenceObjectByName() 引用某些 _DEVICE_OBJECT
的风貌中,缘由与 ObReferenceObjectByName()
利用别的执行体组件例程,在大局名称空间中履行的名字查找逻辑缜密相关,前面会分解。

急需提出,既然经过
ObReferenceObjectByName() 引用绝半数以上 _DRIVER_OBJECT
都会水到渠成,而且 _DRIVER_OBJECT.DeviceObject
又针对该驱动成立的装备链中第三个
_DEVICE_OBJECT,那么那就是最稳妥的章程。不过大家仍旧要了然
STATUS_OBJECT_TYPE_MISMATCH 的原因。

亟待提议,既然经过
ObReferenceObjectByName() 引用绝大部分 _DRIVER_OBJECT
都会中标,而且 _DRIVER_OBJECT.DeviceObject
又针对该驱动创立的设施链中第四个
_DEVICE_OBJECT,那么那就是最稳妥的章程。不过大家依旧要明了
STATUS_OBJECT_TYPE_MISMATCH 的原因。

内需提议,既然经过
ObReferenceObjectByName() 引用绝一大半 _DRIVER_OBJECT
都会马到成功,而且 _DRIVER_OBJECT.DeviceObject
又针对该驱动创设的设施链中首个
_DEVICE_OBJECT,那么那就是最稳妥的法门。然而大家依然要驾驭
STATUS_OBJECT_TYPE_MISMATCH 的原因。

 澳门金沙国际,ObReferenceObjectByName()
是一个未公开的例程,在 MSDN 中并未文档描述,另一方面,包括的 ntddk.h 或
wdm.h 头文件中也一直不相关原型表明;

 ObReferenceObjectByName()
是一个未公开的例程,在 MSDN 中从未文档描述,另一方面,包涵的 ntddk.h 或
wdm.h 头文件中也未尝有关原型申明;

 ObReferenceObjectByName()
是一个未公开的例程,在 MSDN 中没有文档描述,另一方面,包括的 ntddk.h 或
wdm.h 头文件中也并未相关原型注脚;

唯独内核映像ntoskrnl.exe
和其他的版本,的确导出了它的标记,换言之,大家只须求告诉链接器把那一个函数名作为外部符号来分析即可。
此外,ObReferenceObjectByName()
的第二个参数也是一个未文档化的数据类型(POBJECT_TYPE),所以相关的扬言是必须的,如下图所示:

不过内核印象ntoskrnl.exe
和任何的版本,的确导出了它的记号,换言之,我们只要求告诉链接器把那些函数名作为外部符号来分析即可。
此外,ObReferenceObjectByName()
的第两个参数也是一个未文档化的数据类型(POBJECT_TYPE),所以相关的扬言是必须的,如下图所示:

然而内核映像ntoskrnl.exe
和其余的版本,的确导出了它的号子,换言之,大家只必要报告链接器把那个函数名作为外部符号来分析即可。
此外,ObReferenceObjectByName()
的第二个参数也是一个未文档化的数据类型(POBJECT_TYPE),所以有关的宣示是必须的,如下图所示:

 

 

 

澳门金沙国际 12

澳门金沙国际 13

澳门金沙国际 14

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

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

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

请留意,我们声明了一个针对类型“POBJECT_TYPE”的指针——IoDeviceObjectType——而“POBJECT_TYPE”自身又是指向项目“OBJECT_TYPE”的指针,所以在传诵第八个参数时,一定要审慎,使用操作符
*” 解引
IoDeviceObjectType,才会与它的形参类型(POBJECT_TYPE)匹配,否则会导致
ObReferenceObjectByName() 失败,烦扰大家对回到的 NTSTATUS
原因判断!

请留心,大家表明了一个针对性类型“POBJECT_TYPE”的指针——IoDeviceObjectType——而“POBJECT_TYPE”自身又是指向项目“OBJECT_TYPE”的指针,所以在流传第八个参数时,一定要三思而后行,使用操作符
*” 解引
IoDeviceObjectType,才会与它的形参类型(POBJECT_TYPE)匹配,否则会促成
ObReferenceObjectByName() 失败,烦扰大家对回到的 NTSTATUS
原因判断!

请留心,大家表明了一个针对性类型“POBJECT_TYPE”的指针——IoDeviceObjectType——而“POBJECT_TYPE”自身又是指向品种“OBJECT_TYPE”的指针,所以在传唱第多个参数时,一定要小心谨慎,使用操作符
*” 解引
IoDeviceObjectType,才会与它的形参类型(POBJECT_TYPE)匹配,否则会招致
ObReferenceObjectByName() 失利,烦扰大家对回到的 NTSTATUS
原因判断!

 

 

 

如果大家温馨的驱动要获取“\Device\QQProtect”对应的
_DEVICE_OBJECT 指针,然后检查再次回到的 NTSTATUS
状态码,如下图所示:

比方大家自己的驱动要得到“\Device\QQProtect”对应的
_DEVICE_OBJECT 指针,然后检查重回的 NTSTATUS
状态码,如下图所示:

假若大家团结的驱动要拿走“\Device\QQProtect”对应的
_DEVICE_OBJECT 指针,然后检查重临的 NTSTATUS
状态码,如下图所示:

(“\Device\QQProtect”是与当时通讯软件
QQ 一同安装的五个过滤驱动之一:QQProtect.sys
创造的装置对象名,
它也是大家稍后的
IRP Dispatch Routine Hook 实验目标!)

(“\Device\QQProtect”是与当下通讯软件
QQ 一同安装的五个过滤驱动之一:QQProtect.sys
成立的设施对象名,
它也是大家稍后的
IRP Dispatch Routine Hook 实验目的!)

(“\Device\QQProtect”是与当下通讯软件
QQ 一同安装的多少个过滤驱动之一:QQProtect.sys
成立的配备对象名,
它也是大家稍后的
IRP Dispatch Routine Hook 实验对象!)

 

 

 

澳门金沙国际 15

澳门金沙国际 16

澳门金沙国际 17

 

 

 

能够见见,在虚拟机中测试时,DbgPrint()
打印重回的状态码为
C0000024(STATUS_OBJECT_TYPE_MISMATCH),也就是目的类型不匹配,如下图所示:

可以见见,在虚拟机中测试时,DbgPrint()
打印再次回到的状态码为
C0000024(STATUS_OBJECT_TYPE_MISMATCH),也就是目的类型不包容,如下图所示:

可以看来,在虚拟机中测试时,DbgPrint()
打印再次回到的状态码为
C0000024(STATUS_OBJECT_TYPE_MISMATCH),也就是目的类型不兼容,如下图所示:

 

 

 

澳门金沙国际 18

澳门金沙国际 19

澳门金沙国际 20

 

 

 

正好手边有一份
NT 5.2 版内核的源码,它用来编译 Windows XP/Server 2003
使用的水源,即便与自家的测试机器的 NT 6.1 版内核有所差距,然而
要么姑且来看下
ObReferenceObjectByName() 内部究竟干了些什么。ObReference*()
体系的例程多数位居内核源码的“obref.c” 与“obdir.c
文本内。通过对相关调用链的剖析,如下图所示:

赶巧手边有一份
NT 5.2 版内核的源码,它用来编译 Windows XP/Server 2003
使用的水源,即使与自己的测试机器的 NT 6.1 版内核有所差距,然则
要么姑且来看下
ObReferenceObjectByName() 内部究竟干了些什么。ObReference*()
种类的例程多数坐落内核源码的“obref.c” 与“obdir.c
文本内。通过对有关调用链的剖析,如下图所示:

凑巧手边有一份
NT 5.2 版内核的源码,它用来编译 Windows XP/Server 2003
使用的木本,固然与自己的测试机器的 NT 6.1 版内核有所差别,但是
仍旧姑且来看下
ObReferenceObjectByName() 内部究竟干了些什么。ObReference*()
种类的例程多数位于内核源码的“obref.c” 与“obdir.c
文本内。通过对有关调用链的剖析,如下图所示:

澳门金沙国际 21

澳门金沙国际 22

澳门金沙国际 23

上图中有两处关键点:其一是
ObpLookupObjectName() 中,检核对象对象类型的起先化设定(用
_OBJECT_TYPE_INITIALIZER 结构意味着)中,是不是指定了
ParseProcedure
例程,对于“设备”类对象,该函数值指针总是为 IopParseDevice() ,最后导致调用
IopParseDevice()

上图中有两处关键点:其一是
ObpLookupObjectName() 中,检查对象对象类型的初始化设定(用
_OBJECT_TYPE_INITIALIZER 结构意味着)中,是不是指定了
ParseProcedure
例程,对于“设备”类对象,该函数值指针总是为 IopParseDevice() ,最终致使调用
IopParseDevice()

上图中有两处关键点:其一是
ObpLookupObjectName() 中,检查对象对象类型的开首化设定(用
_OBJECT_TYPE_INITIALIZER 结构意味着)中,是还是不是指定了
ParseProcedure
例程,对于“设备”类对象,该函数值指针总是为 IopParseDevice() ,最终促成调用
IopParseDevice()

有心人考察前方的图样可见,从早期自己调用
ObReferenceObjectByName() 起头,就为它的第多个参数 ParseContext 传入 NULL,而 ParseContext
会在调用链中一路往下传递,最后由
IopParseDevice() 接受并对该参数举行求证,假诺它为空,就回到
STATUS_OBJECT_TYPE_MISMATCH

细心考察前方的图纸可见,从初期自己调用
ObReferenceObjectByName() 伊始,就为它的第多少个参数 ParseContext 传入 NULL,而 ParseContext
会在调用链中一路往下传递,最后由
IopParseDevice() 接受并对该参数举行认证,如若它为空,就回来
STATUS_OBJECT_TYPE_MISMATCH

精心察看前方的图形可见,从中期我调用
ObReferenceObjectByName() 开端,就为它的第多个参数 ParseContext 传入 NULL,而 ParseContext
会在调用链中一路往下传递,最后由
IopParseDevice() 接受并对该参数举办验证,如果它为空,就赶回
STATUS_OBJECT_TYPE_MISMATCH

今昔你通晓干什么
ObReferenceObjectByName()
引用目的设备连接让人这么蛋疼,关键就在必要分配并开端化那一个 ParseContext。。。

今昔您了然为啥
ObReferenceObjectByName()
引用目的设备连接令人这么蛋疼,关键就在急需分配并早先化那多少个 ParseContext。。。

今昔您驾驭怎么
ObReferenceObjectByName()
引用目的设备连接令人这么蛋疼,关键就在要求分配并先河化这个 ParseContext。。。

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

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

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

自家在源码中提取了连带代码片段,如下边那几个图所示,最好能把它与地点的流程图比较加深精通,
背后我会拿虚拟机上的
Windows 7(基于 NT 6.1
版内核)调试,你会惊奇地意识,追踪栈回溯音讯时,
竟然与
NT 5.2
版内核源码中的调用链非凡相像,那申明版本之间的动迁并不曾让对象名查找和注明逻辑改动太大。
(至少从
Windows XP 到 7
而言是如此,之后的本子由于没测试过,就不理解了!)

自我在源码中领到了相关代码片段,如下边那个图所示,最好能把它与地点的流程图比较加深明白,
后边我会拿虚拟机上的
Windows 7(基于 NT 6.1
版内核)调试,你会奇怪地窥见,追踪栈回溯新闻时,
仍然与
NT 5.2
版内核源码中的调用链格外相像,那表明版本之间的搬迁并从未让对象名查找和认证逻辑改动太大。
(至少从
Windows XP 到 7
而言是这么,之后的版本由于没测试过,就不清楚了!)

自家在源码中提取了连带代码片段,如上边这个图所示,最好能把它与地点的流程图相比加深了解,
前面我会拿虚拟机上的
Windows 7(基于 NT 6.1
版内核)调试,你会惊叹地窥见,追踪栈回溯音信时,
居然与
NT 5.2
版内核源码中的调用链分外相似,那评释版本之间的动迁并不曾让对象名查找和表明逻辑改动太大。
(至少从
Windows XP 到 7
而言是那样,之后的版本由于没测试过,就不清楚了!)

 

 

 

澳门金沙国际 24

澳门金沙国际 25

澳门金沙国际 26

 

 

 

澳门金沙国际 27

澳门金沙国际 28

澳门金沙国际 29

澳门金沙国际 30

澳门金沙国际 31

澳门金沙国际 32

 

 

 

 

 

 

 

 

 


IopParseDevice()
内部的这段注释,我隐隐得到了绕过调用源检测的笔触——那就是跟踪
NtCreateFile() ,看看 OPEN_PACKET 具体是在哪个地方


IopParseDevice()
内部的这段注释,我隐隐拿到了绕过调用源检测的笔触——那就是跟踪
NtCreateFile() ,看看 OPEN_PACKET 具体是在何地


IopParseDevice()
内部的那段注释,我隐隐得到了绕过调用源检测的笔触——那就是跟踪
NtCreateFile() ,看看 OPEN_PACKET 具体是在何地

分红并伊始化的;由于
IopParseDevice() 会检测 POPEN_PACKET 结构实例的一些字段来担保
ObReferenceObjectByName() 调用
是从
NtCreateFile() 发起的,NtCreateFile() 完结在 NT 5.2 版内核源码的
creater.c
中,它只是简短地执行调用链
IoCreateFile()->IopCreateFile()(此两例程都落到实处在源码的 iosubs.c 中),而现实由
IopCreateFile() 分配并初叶化 OPEN_PACKET 结构。

分配并伊始化的;由于
IopParseDevice() 会检测 POPEN_PACKET 结构实例的片段字段来保管
ObReferenceObjectByName() 调用
是从
NtCreateFile() 发起的,NtCreateFile() 已毕在 NT 5.2 版内核源码的
creater.c
中,它只是简短地实施调用链
IoCreateFile()->IopCreateFile()(此两例程都落到实处在源码的 iosubs.c 中),而现实由
IopCreateFile() 分配并起先化 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()。。。。。

故而我们假诺在引用目的设备对象前,仿照
IopCreateFile() 的有关逻辑来分配并早先化 OPEN_PACKET,并作为
ObReferenceObjectByName()
的参数传入,就会绕过
IopParseDevice() 的“调用源检测”逻辑。
那部分
Patch 就留待前边的小说再发布。大家脚下先要验证“设备”类对象的“ParseProcedure”确实为
IopParseDevice()。。。。。

据此咱们即使在引用目的设备对象前,仿照
IopCreateFile() 的相关逻辑来分配并伊始化 OPEN_PACKET,并作为
ObReferenceObjectByName()
的参数传入,就会绕过
IopParseDevice() 的“调用源检测”逻辑。
这有些
Patch 就留待后边的随笔再发布。大家当前先要验证“设备”类对象的“ParseProcedure”确实为
IopParseDevice()。。。。。

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

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

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

在双击内核调试环境中,首先通过设备名称“\Device\QQProtect”取得相应对象的新闻:

在双击内核调试环境中,首先通过设备名称“\Device\QQProtect”取得相应对象的音讯:

在双击内核调试环境中,首先通过配备名称“\Device\QQProtect”取得相应对象的新闻:

澳门金沙国际 33

澳门金沙国际 34

澳门金沙国际 35

赢得目的头地址后,格式化并转储其中的字段,我们感兴趣的是“TypeIndex”字段,它用来索引“对象类型表”中的相应“对象类型”:

赢得目标头地址后,格式化并转储其中的字段,大家感兴趣的是“TypeIndex”字段,它用来索引“对象类型表”中的相应“对象类型”:

赢得目的头地址后,格式化并转储其中的字段,我们感兴趣的是“TypeIndex”字段,它用来索引“对象类型表”中的相应“对象类型”:

 

 

 

澳门金沙国际 36

澳门金沙国际 37

澳门金沙国际 38

WInodws
内核使用一个数据结构——ObTypeIndexTable
存放有关种种“对象类型”的音讯,本质上 ObTypeIndexTable
是一个指针数组,在 32 位种类布局上,每个指针大小
4 字节,而我辈获取的索引号为(下标**
0
开始**)19,下图中的两条表明式据此测算出该“对象类型”的地址:

WInodws
内核使用一个数据结构——ObTypeIndexTable
存放有关各个“对象类型”的消息,本质上 ObTypeIndexTable
是一个指针数组,在 32 位连串布局上,每个指针大小
4 字节,而我辈赢得的索引号为(下标**
0
开始**)19,下图中的两条说明式据此测算出该“对象类型”的地址:

WInodws
内核使用一个数据结构——ObTypeIndexTable
存放有关各样“对象类型”的新闻,本质上 ObTypeIndexTable
是一个指针数组,在 32 位种类布局上,每个指针大小
4 字节,而我辈赢得的索引号为(下标**
0
开始**)19,下图中的两条表明式据此测算出该“对象类型”的地址:

澳门金沙国际 39

澳门金沙国际 40

澳门金沙国际 41

测算,相应“对象类型”结构的地址为
0x855cef78——Windows 内核用数据结构 _OBJECT_TYPE
来代表“对象类型”的定义,所以再次
格式化并转储其中的字段,我们感兴趣的字段为“TypeInfo”,如前所述,它是一个“对象类型开始化设定”结构,内核用
_OBJECT_TYPE_INITIALIZER
来代表“对象类型开头化设定”的定义。要求小心,TypeInfo
偏移它的母结构发轫地址 0x28
字节,所以要添加这几个
offset
再查看,如您所见,其中的“ParseProcedure”为
IopParseDevice()

因而可见,相应“对象类型”结构的地方为
0x855cef78——Windows 内核用数据结构 _OBJECT_TYPE
来表示“对象类型”的定义,所以再度
格式化并转储其中的字段,我们感兴趣的字段为“TypeInfo”,如前所述,它是一个“对象类型开首化设定”结构,内核用
_OBJECT_TYPE_INITIALIZER
来表示“对象类型开首化设定”的定义。需求专注,TypeInfo
偏移它的母结构初始地址 0x28
字节,所以要增进这一个
offset
再查看,如你所见,其中的“ParseProcedure”为
IopParseDevice()

由此可见,相应“对象类型”结构的地方为
0x855cef78——Windows 内核用数据结构 _OBJECT_TYPE
来表示“对象类型”的概念,所以重复
格式化并转储其中的字段,大家感兴趣的字段为“TypeInfo”,如前所述,它是一个“对象类型开始化设定”结构,内核用
_OBJECT_TYPE_INITIALIZER
来表示“对象类型开端化设定”的概念。需求专注,TypeInfo
偏移它的母结构开始地址 0x28
字节,所以要增加这么些
offset
再查看,如你所见,其中的“ParseProcedure”为
IopParseDevice()

 

 

 

澳门金沙国际 42

澳门金沙国际 43

澳门金沙国际 44

 

 

 

下篇文章将商量什么绕过
IopParseDevice() 的调用源检测,并调试大家的名堂,将其应用于 rootkit
开发技术中。

下卷小说将探讨什么绕过
IopParseDevice() 的调用源检测,并调试大家的硕果,将其使用于 rootkit
开发技术中。

下篇作品将切磋怎样绕过
IopParseDevice() 的调用源检测,并调节大家的收获,将其采纳于 rootkit
开发技术中。

 

 

 

相关文章