690 views
首页 > 内核编程, 技术心得 > sfilter 动态加解密吐血总结

sfilter 动态加解密吐血总结

2008年4月16日

晕了好几天, 总算把 IFS 的动态加解密给闹明白了.

  为了后来者不再晕,总结如下:

  • 加密在 SfWrite(IRP_MJ_WRITE) 中, 而不是完成例程.
  • 解密在 SfRead(IRP_MJ_READ) 中, 而不是完成例程
  • 只要处理 IRP_NOCACHE|IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO
  • 加密简单过程
    1. 得到Windows传下来的 Buffer Address
        if (Irp->MdlAddress)
        {
          SysDataBuf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority);
        }
        else
        {
          SysDataBuf = Irp->UserBuffer;
        }
    2. 保存明文 SysDataBuf 在 SysDataBufFirst
    3. 用你强大的算法加密SysDataBuf –>> MyBuf
    4. 把 MyBuf 复制到 SysDataBuf
    5. IoCallDriver 把密文向下传, 写入 HardDisk
    6. 恢复内存的明文 RtlCopyMemory(SysDataBuf, SysDataBufFirst, ulWriteLen);
  • 解密的大致过程
    1. IoCallDriver 读到密文
    2. 解密
    3. IoCompleteRequest 搞定

我的开发环境: IFS2600, SFilter 的代码却是 for XP SP1 的.

另一派的意见:
解密在 ReadCompleteRoutine 里实现没有问题. 当然 CALL FILESYSTEM 再处理也是一种方法.
还有在处理加密不时要去碰原来的 BUFFER, 而是自己分配一个 BUFFER 复制过来, 然后生成 MDL, 保存原先的 MDL, 替换系统原先的 MDL,在 WriteCompleteRoutine 中还原 MDL. 内存中要保持原有 BUFFER 为明文, 否则会出问题.

内核编程, 技术心得

  1. 目前还没有任何评论.
  1. 目前还没有任何 trackbacks 和 pingbacks.