本人学艺不精才疏学浅,只作为一种简单知识分享 欢迎各位大佬批评指正! 本文提出了一种方法可以在内核层使用“过滤”的方法来捕获Irp数据包。其中可以捕获到进入目标驱动前与目标驱动处理完后的Irp数据包。现在很多驱动都在使用Irp包的方式来与R3的程序进行通信。Irp是一个结构,由一个管理器进行分配管理。Irp从不单独分配,它总是伴随着多个IO栈位置结构(_IO_STACK_LOCATION),所以一般的驱动程序在获取真正的数据时需要使用IoGetCurrentIrpStackLocation函数来获取其中的数据。Windows是以设备(DEVICE_OBJECT)为中心的,同时Windows支持设备分层。在多层设备的结构中,一个设备是堆叠在另一个设备的上面的,看起来就像一个栈一样,这组设备被称为设备栈。
我使用堆叠设备栈的方式,来获取Irp数据包(写过过滤驱动的肯定熟悉)。所以我们需要IoAttachDeviceToDeviceStack函数来附加到目标设备,这样就会让调用来的时候,先到我们的派遣函数。问题就变成了我们如何让目标驱动处理完后我们依然可以获取到数据呢?此时解决的关键就是IoSetCompletionRoutine函数了,它可以让下层的派遣函数调用IoCompleteRequest后到达指定的回调函数。如下是一些关键代码:我们针对WinARK的DeviceIoControl的数据来进行过滤测试。
为了验证我们数据的正确性,我们查看源码选择获取驱动派遣函数的这个功能进行测试。
如上是该功能的源码,传入的是设备名字,传回去的是派遣函数数组。
安装好我们的测试驱动后 查看一下自己的派遣函数列表就能捕获到如下信息经观察可以发现传入的内容的确为L"\\driver\\AntiRootkit",传出的内容则是派遣函数列表(总长度为0x1b * 8)。已第一个为例则是0xFFFFF8024E911AA0,对比发现无误。
VOID DriverUnload(PDRIVER_OBJECT pDriver) {
---
来源: 看雪论坛
原文链接: https://bbs.kanxue.com/thread-285317.htm
[原创] R0下一种简单的Irp包数据捕获方法
282 浏览
17 回复
感谢师傅的分享
太强了!
不错 支持
Thanks for sharing
Thanks for sharing
shishichen
你如何保证你的完成例程就一定会被IoCompleteRequest执行,万一在你驱动的下层驱动设的完成例程里直接返回了MORE_PROCESSING_REQUIRED,回流就被打断了,人家回到自己分发 ...
有需求,可以帮我吗,付费
你如何保证你的完成例程就一定会被IoCompleteRequest执行,万一在你驱动的下层驱动设的完成例程里直接返回了MORE_PROCESSING_REQUIRED,回流就被打断了,人家回到自己分发 ...
有需求,可以帮我吗,付费
看看
看看
看看。
学习了。。
感谢分享
感谢分享!
看看
你如何保证你的完成例程就一定会被IoCompleteRequest执行,万一在你驱动的下层驱动设的完成例程里直接返回了MORE_PROCESSING_REQUIRED,回流就被打断了,人家回到自己分发函数中直接释放该irp了。
NoHeart
Filter Driver
差不多是这个意思
Filter Driver
差不多是这个意思