0x0 感慨
好久没写正规的博客了 学习《寒江独钓—Windows内核安全编程》已有两周有余,写此篇仅以录入本人觉得重要的知识点及串口过滤的完整代码详解。
0x1 过滤概念
书上是这么说的,过滤是在不影响上层和下层的接口的情况下,在Windows系统内核中加入新的层,从而不需要修改上层的软件或者下层的真实驱动程序,就加入了新的功能。
这句话我理解的大概是这样的,即我们写的驱动过滤程序实际上是像一层滤网一样,对上层的读写请求先进行"过滤",对数据进行一定的处理,然后下发给下面真实的驱动程序进行处理。
0x2 怎么进行过滤
那么问题来了 如何进行过滤呢 ?根据过滤第定义,我们知道我们过滤是针对某一特定驱动的,所以过滤就需要绑定到某一设备上进行处理。
有以下API可供我们绑定:
SourceDevice指你生成的虚拟设备,TargetDevice值你要绑定的真实设备,最后一个OUT 的参数是返回的被绑定的设备指针。
或者是用
这里返回的是未调用这个函数前最上层的设备指针,这里就要说明下设备栈的问题。设备栈的产生源于可能有不止一个设备绑定到真实设备上,而他们处理数据的先后顺序是按照栈的结构来的,即最后一个绑定的先过滤。
例如我们之前有B->A B绑定到A上
然后IoAttachDeviceToDeviceStack函数调用时 我们的SourceDevice是C,那么
绑定完后其栈是这个样子的C->B->A。并且调用完后返回B,而不是A!!!
其他的还有IoAttachDeviceToDeviceStackSafe等等函数,这里我们不用这些函数。
设备绑定的代码详解
#define MAX_SERIAL_NUM 32 //假设最大串口数量为32
NTSTATUS AttachToSpecificDevice(PDRIVER_OBJECT driver, PDEVICE_OBJECT bindedDev, PDEVICE_OBJECT *filtDev, PDEVICE_OBJECT *realDev)
{
NTSTATUS status;
PDEVICE_OBJECT topDevice = NULL;
status = IoCreateDevice(driver, 0, NULL, bindedDev->Type, 0, FALSE,