阅读:9967回复:34
sfilter动态加解密吐血总结
晕了好几天,总算把Ifs的动态加解密给闹明白了。
为了后来者不再晕,总结如下: 1.加密在SfWrite(IRP_MJ_WRITE)中,而不是完成例程, 解密在SfRead(IRP_MJ_READ)中,而不是完成例程, 3.只要处理IRP_NOCACHE|IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO 2.加密简单过程: a.得到Windows传下来的Buffer Address, if (Irp->MdlAddress) { SysDataBuf = MmGetSystemAddressForMdlSafe(Irp->MdlAddress, NormalPagePriority); } else { SysDataBuf = Irp->UserBuffer; } b.保存明文SysDataBuf 在SysDataBufFirst c.用你强大的算法加密SysDataBuf -->> MyBuf d.把MyBuf Copy到 SysDataBuf, e.IoCallDriver 把密文向下传,写入HardDisk。 f.恢复内存的明文 RtlCopyMemory(SysDataBuf,SysDataBufFirst, ulWriteLen);. 3.解密的大致过程: a.IoCallDriver 读到密文 b,解密 c。IoCompleteRequest 搞定 我的开发环境: IFS2600,SFilter的代码却是for XP SP1的 另外提个问题: 我的sfilter加载后,U盘怎么不能访问了?? |
|
沙发#
发布于:2004-09-14 21:18
基本上是这样子的。
不过有很多的细节要处理 |
|
|
板凳#
发布于:2004-09-14 21:21
对所有文件都可以吗??没问题吗??那些OFFICE的都没问题???
|
|
|
地板#
发布于:2004-09-14 21:23
基本上是这样子的。 请说具体点,哪些细节要处理??? |
|
|
地下室#
发布于:2004-09-14 22:53
先谢谢总结先!
另外: 读和写都有工作需要在IoCallDriver后进行,又不是在完成例程中进行。是不是把所有的读写irp都弄成同步的了? 如果是的话,IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO好像都是同步i/o,问题不大,但是IRP_NOCACHE可能是异步的,如果都改成同步处理的话,会不会有什么影响?比如性能? 谢谢! |
|
|
5楼#
发布于:2004-09-16 09:16
[quote]基本上是这样子的。 请说具体点,哪些细节要处理??? [/quote] 你不是举出了一个例子么? |
|
|
6楼#
发布于:2004-09-16 09:38
再仍一块砖头:
如何从IrpStackLocation中判断来自网络的文件访问? //--------------------------------------------------- NTSTATUS status; PACCESS_TOKEN pToken = NULL; PTOKEN_SOURCE pTokenSrc = NULL ; PSECURITY_SUBJECT_CONTEXT secSubCtx; secSubCtx = &(IrpSp->Parameters.Create.SecurityContext->AccessState->SubjectSecurityContext); if (secSubCtx->ClientToken != NULL || secSubCtx->PrimaryToken != NULL) { pToken = SeQuerySubjectContextToken(secSubCtx); } if (pToken == NULL) { //KdPrint(("SeQuerySubjectContextToken Error\n")); return 0 } // // Get TokenSource Name If SourceName is "NtLmSsp" it was logged-in via Lanmanager, // "User32" represents localy logged-in users. // __try { status = SeQueryInformationToken(pToken,TokenSource,&pTokenSrc); if (NT_SUCCESS(status)) { pTokenSrc->SourceName[TOKEN_SOURCE_LENGTH-1] = 0x00; KdPrint(("Token Name :%s Len:%d\n",pTokenSrc->SourceName,strlen(pTokenSrc->SourceName))); if (_stricmp(pTokenSrc->SourceName,"NtLmSsp") == 0 ) { KdPrint(("NetWork Access Token Find\n")); return 123 } } else { KdPrint(("SeQueryInformationToken Error:0x%x\n",status)); } } __finally { ExFreePool(pTokenSrc); } return 0 |
|
7楼#
发布于:2004-09-16 14:19
这个不错,有点眼熟,就是不知道从哪儿来的?
|
|
|
8楼#
发布于:2004-09-16 14:21
这个不错,有点眼熟,就是不知道从哪儿来的?
[编辑 - 9/16/04 by nustzhua] |
|
|
9楼#
发布于:2004-09-16 15:36
OSR上看来的;):)
|
|
10楼#
发布于:2004-09-21 16:18
d.把MyBuf Copy到 SysDataBuf,
e.IoCallDriver 把密文向下传,写入HardDisk。 f.恢复内存的明文 RtlCopyMemory(SysDataBuf,SysDataBufFirst, ulWriteLen);. 这几步好像有个小小的问题,就是如果读请求在e和f之间进行的话,读到的数据可能是密文,因为你的步骤f太迟了 正确的做法是构造自己的mdl,替换irp中的,然后ioCallDriver,在 完成例程中再恢复原来的mdl,总之不要修改原来的缓冲区!!!! |
|
11楼#
发布于:2004-09-22 10:11
tooflat:正确的做法是构造自己的mdl,替换irp中的,然后ioCallDriver,在
完成例程中再恢复原来的mdl,总之不要修改原来的缓冲区!!!! 问一个问题:我是按照你所说的来做,在FAT32下能正常工作,但在 NTFS下出现错误,请指点一下 |
|
12楼#
发布于:2004-09-22 13:40
tooflat:正确的做法是构造自己的mdl,替换irp中的,然后ioCallDriver,在 你给的错误信息太少了,是蓝屏还是什么?具体的蓝屏信息又是什么? 能把代码片断贴上来吗? |
|
13楼#
发布于:2004-10-03 19:49
学习ing
|
|
14楼#
发布于:2004-10-14 09:32
重入方面的问题呢?加一个全局开关量解决?
|
|
15楼#
发布于:2004-11-30 19:12
顶一下
|
|
|
驱动牛犊
|
16楼#
发布于:2007-01-09 22:16
学习ing
|
17楼#
发布于:2007-03-25 10:36
好,看看!!!
|
|
18楼#
发布于:2007-03-25 20:28
对呀怎么解决!关注!
我发现我使用 tooflat 的加密程序测试, 发现文件被加密了. 设置 file.$encrypt$ 加密标志失败! 这个文件不存在,为什么呢? 怎么会这样呢? |
|
|
19楼#
发布于:2007-03-25 20:34
加密成功,这标志 文件 也设置成功了. 但是这个标志文件不存在.
好像怎么跳过一样.但是返回是成功的.汗.好好调试一下.第一次不太会调试! |
|
|
上一页
下一页