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

1,下载curl —–url命令传输工具

 

2,配置curl环境变量

在写
filter driver 或 rootkit 时,经常需要 attach
到设备栈中的目标设备,来拦截途经的 IRP(I/O Request
Packet),实现过滤功能。
首先要获悉目标设备向
Windows Object Manager 维护的全局名称空间注册的 _DEVICE_OBJECT
名,此类信息可以通过像是 WinObj.exe 的工具获取。

3,在cmd环境中使用

接着调用
ObReferenceObjectByName(),该函数把获取的目标对象地址存储到它的最后一个参数(指针)中,然后返回给调用者。
实战时我们会发现,引用
_DRIVER_OBJECT 几乎总是成功;而引用
_DEVICE_OBJECT,则不一定会成功,返回的 NTSTATUS
状态码一般以两种居多:

 

1 C0000022(STATUS_ACCESS_DENIED)
2 C0000024(STATUS_OBJECT_TYPE_MISMATCH)

举例:curl -G 

 

图片 1

第一种情况通常是由于创建目标
_DEVICE_OBJECT 时指定的 session id 与当前的 session id
不一致,或者目标对象持有特殊的安全访问令牌/安全属性,所以我们无法以常规方式获取,而且这种错误频繁出现在
IoGetDeviceObjectPointer() 调用时,偏偏多数讲过滤驱动和 rootkit
的书籍都用 IoGetDeviceObjectPointer()
作为示例代码的一部分,真是有点误人子弟的意味。

 

第二种情况普遍出现在通过
ObReferenceObjectByName() 引用某些 _DEVICE_OBJECT
的场景中,缘由与 ObReferenceObjectByName()
利用其它执行体组件例程,在全局名称空间中执行的名字查找逻辑密切相关,后面会解释。

使用:curl -G “www.baidu.com”

需要指出,既然通过
ObReferenceObjectByName() 引用绝大多数 _DRIVER_OBJECT
都会成功,而且 _DRIVER_OBJECT.DeviceObject
又指向该驱动创建的设备链中第一个
_DEVICE_OBJECT,那么这就是最稳当的方法。不过我们还是要知道
STATUS_OBJECT_TYPE_MISMATCH 的原因。

 

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

图片 2

但是内核映像
ntoskrnl.exe
和其它的版本,的确导出了它的符号,换言之,我们只需要告诉链接器把这个函数名作为外部符号来解析即可。
此外,ObReferenceObjectByName()
的第五个参数也是一个未文档化的数据类型(POBJECT_TYPE),所以相关的声明是必须的,如下图所示:

 

 

 

图片 3

 

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

最原始的批量通讯返回

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

图片 4

 

 

假设我们自己的驱动要获得“\Device\QQProtect”对应的
_DEVICE_OBJECT 指针,然后检查返回的 NTSTATUS
状态码,如下图所示:

 

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

可以将通讯命令保存为bat格式文件,通过cmd运行访问

 

 

发表评论

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