sfilter 动态加解密吐血总结
晕了好几天, 总算把 IFS 的动态加解密给闹明白了.
为了后来者不再晕,总结如下:
- 加密在 SfWrite(IRP_MJ_WRITE) 中, 而不是完成例程.
- 解密在 SfRead(IRP_MJ_READ) 中, 而不是完成例程
- 只要处理 IRP_NOCACHE|IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO
- 加密简单过程
- 得到Windows传下来的 Buffer Address
if (Irp->MdlAddress)
{
SysDataBuf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
}
else
{
SysDataBuf = Irp->UserBuffer;
} - 保存明文 SysDataBuf 在 SysDataBufFirst
- 用你强大的算法加密SysDataBuf –>> MyBuf
- 把 MyBuf 复制到 SysDataBuf
- IoCallDriver 把密文向下传, 写入 HardDisk
- 恢复内存的明文 RtlCopyMemory(SysDataBuf, SysDataBufFirst, ulWriteLen);
- 得到Windows传下来的 Buffer Address
- 解密的大致过程
- IoCallDriver 读到密文
- 解密
- IoCompleteRequest 搞定
我的开发环境: IFS2600, SFilter 的代码却是 for XP SP1 的.
另一派的意见:
解密在 ReadCompleteRoutine 里实现没有问题. 当然 CALL FILESYSTEM 再处理也是一种方法.
还有在处理加密不时要去碰原来的 BUFFER, 而是自己分配一个 BUFFER 复制过来, 然后生成 MDL, 保存原先的 MDL, 替换系统原先的 MDL,在 WriteCompleteRoutine 中还原 MDL. 内存中要保持原有 BUFFER 为明文, 否则会出问题.

近期评论