1.
本项目使用双缓冲,授权进程和非授权进程分别使用明文缓冲和密文缓冲;
2.
使用StreamContext存放驱动运行时的文件信息,在文件的尾部使用
4KB
文件标识尾储存解密所需信息;
3.
使用AES
-
128
ECB模式,
16
个字节以内分别在SetInfo
-
>EOF和WriteCachedIo时扩展文件大小到
16
字节,
大于
16
个字节,使用密文挪用(Ciphertext stealing)的方法,避免明文必须分块对齐的问题;
4.Write
和Read使用SwapBuffers的方式进行透明加密解密;
5.
特权加密和特权解密使用重入(Reentry)的方式,使驱动加密解密文件;
6.
在FileRenameInformationEx和FileRenameInformation重命名操作时做处理,
可以自动加密解密docx,doc,pptx,ppt,xlsx,xls等使用tmp文件重命名方式读写的文件;
7.
注册进程相关回调,使用链表统一管理授权与非授权进程;
注册进程与线程对象回调,保护进程EPROCESS,ETHREAD对象;对授权进程的代码段进行完整性校验。
8.
设置机密文件夹,文件处于该文件夹下才会透明加密,
并可以从桌面PocUser配置机密文件夹与需管控的文件扩展名 @wangzhankun
9.PostOperation
统一使用函数FltDoCompletionProcessingWhenSafed(PostRead除外),
InstanceSetup时使用Dpc
+
WorkItem回调(封装为PocDoCompletionProcessingWhenSafe),
避免在DISPATCH_LEVEL时出现IRQL_NOT_LESS_OR_EQUAL之类的蓝屏;
10.PostClose
时使用单独的线程,等待操作该文件的所有授权进程结束以后,
再重入加密或写入文件标识尾,解决了docx类文件的死锁问题。
11.
将ULONG改成LONGLONG,原则上可以支持
4GB
以上文件(目前特权加密和特权解密暂不支持
4GB
以上文件,
而且在内存有限的情况下,特权解密有可能会因非分页内存的缺少而失败,不想写了,这里可以放循环里读写大文件)