首页
社区
课程
招聘
[原创]<<寒江独钓>>透明加密部分的读书笔记
发表于: 2009-8-24 16:12 9162

[原创]<<寒江独钓>>透明加密部分的读书笔记

2009-8-24 16:12
9162

学习驱动已经有一段时间了,最近也看了楚狂人的新书寒江独钓,看完透明加密部分后,把谭老师书里的内容加上一点自己的理解,写了篇文章,希望与大家分享。如果有什么理解错误的地方,望大家原谅。

一、透明加密:是一种在不改变用户习惯的情况下,对文档进行加密保护的措施。主要思想就是,添加一些加密进程后,以后在你的计算机内创建或修改的加密进程文件都是经过透明加密的。

二、技术要点:
1、透明加密的进程判断。(机密进程与普通进程的区分)
2、文件的读写方式。(缓冲读写请求、分页读写请求)
3、文件缓冲问题。(明文和密文)技术难点:文件缓冲的清除
4、判断一个文件是否是加密文件,就需要一个加密标志。
   a、加密标志应该加在文件的什么地方?
   b、如果把加密标志加在文件头的大小。
   c、隐藏文件头的设置偏移。
   d、隐藏文件头的读写偏移。
5、驱动运行后,加密文件不断增加,这是我们需要一张表来记录这些加密文件的信息。这就产生了文件加密表。(添加、删除等)技术难点:难于判断,文件是否打开或关闭,即:不容易判断是否应该添加或删除。
6、自己直接发送irp查询、设置操作。(irp未公开,发送比较难)。
7、自己发送的读写irp。
8、我认为透明加密的比较难的一个就是文件的打开(要避免重入、试探性的打开,目的是为之后判断这个文件是否需要加密)
9、文件的打开预处理:在前面的试探性的打开文件操作后,我们已经对要打开的文件做了必要的准备,现在我们有条件可以去判断这个文件是否要加入加密表中了。
10、到目前我们已经完成了文件的查询、设置、打开处理、下面就是读写的加密处理了。
    a、读请求可以读到后,直接解密显示。
    b、写请求就需要分配一个MDL。因为写请求中的缓冲区本质上是不可以修改的。

三、对上面的技术要点做一些简要分析:
1、透明加密对当前进程是否是机密进程的判断非常重要,因为必须要让加密进程顺利打开加密文件,且让非加密进程不能查看机密文件。(注意一个误区,如果系统中的所有进程都为加密进程,则相当于没有进行透明加密)。进程名是比较容易修改而遭到欺骗的、方法是根据进程名和可执行文件的内容进行判断。

2、a、文件的读写方式分为缓冲读写和分页读写,文件过滤驱动是无法捕获到缓冲读写请求的,这是因为Windows的特殊机制内存映射。(当打开一个文件时,如果这个文件是第一次被打开,则有读请求。如果是以前已经被打开过的文件,则是缓冲读方式,将没有读请求)。
   b、在这要注意:应用程序看到的内容、缓冲区中的内容、硬盘上存储的内容三个概念是不同的,他们可能相同,也可能不同。这三份数据,根据实际情况通过缓冲读写、分页读写进行转换。

3、a、通过第二点我们知道了,在文件读写的时候,系统中存在三分数据,即应用层看到的数据、缓冲中的数据、硬盘上的真实数据。应用层数据是名文,硬盘上的数据是密文这两者是毋庸置疑的,但缓冲中的数据就有了不同的说法,且以不同的存在形式,有着比较难解决的技术难点,就是有方法也存在局限性。
   b、(1)如果缓冲区数据为密文,则我们必须截获缓冲读写请求来进程加解密,截获这种请求对于内存映射文件来说是非常困难的,因此不适用于所有情况。
      (2)如果缓冲区数据为名文,我们截获的将是分页读写请求,这就可以截获到了(如果把分页读写请求和非缓冲区请求合并处理,那几乎可以处理所有的文件操作)。但这也存在问题,我们知道对于一个文件缓冲区是全局的,不用不同的进程多次打开同一个文件,他们的缓冲区都是同一块,这就导致只要加密进程正在打开一个加密文件,那在这个时候,再用其他进程打开这个加密文件也变成明文,这就达不到加密的效果了,最好的方法是使用双缓冲区,这样就可以给加密进程和非加密进程不同缓冲区,达到很好的加密效果,但这样做同步等就比较困难,目前还只有少数人拥有这个技术。在这边采用的方法是:一个文件只能被打开一次,如果加密进程正在打开,那非加密进程就打开失败,反之也一样。如果用这个方法也存在一个技术难点:缓冲驱动的切换,这就要求它们切换是要删除另外一个。清除缓冲区没有一种官方的方法,据说:微软就没想让开发驱动的人,执行清除缓存区这个操作。有一个非官方的方式是:当一个文件被删除时会清除缓存区,其它时候没有任何时机可以使系统删除一个缓冲区。

4、当系统打开一个文件是,我们必须知道这个文件是否是加密文件,和它是否已经加密过,要知道这些我们才能对一个文件进行正确的操作。那怎么判断是否为加密文件呢,这就需要加一个加密标志。
   a、添加加密标志的方法很多,有在文件名上加的,也有在文件内容中加的、在文件内容中,又可分为在文件头加和在文件尾部加。
   b、加在文件尾部的方法相对容易实现,但文件尾是一个不确定的位置会随着文件的改变而改变,比较容易丢失。如果加在文件的头部,这就比较好了,当坏处是实现难度大,因为要对所有的机密进程隐藏这个文件头部,则所有的文件操作都要增加一个偏移。下面就来看看应该怎么做这两个操作。
   d、隐藏文件头:方法是自己发irp,IRP_MJ_QUERY_INFORMATION这个irp是查询文件信息的请求,我们先查询它的文件信息(包括大小,占用空间,结束位置等),然后把这些文件的信息都进行修改,把它减去一个文件头,这个文件就可以实现隐藏一个文件头了。和查询想对的就是设置文件信息,如果系统想重新设置文件的信息,则与上面的操作相反,加上一个文件头大小就行了。
   e、接下来是文件的读/写偏移:文件内容头部4kb的文件头被我们用来做加密标记且隐藏了,当然我们在读写操作的时候也应该设置这个读写偏移,应该把他们加上一个4kb的文件头,这样才能正确的读写。

5、现在我们已经能判断当前进程是否是加密进程和这个文件是否是加密文件,当现在的问题是:我们怎么知道在何时应该对一个文件进行加解密处理。有可能你会想:“既然你已经可以判断是否为加密进程和是否为加密文件了。”那就是当为加密进程且文件为加密文件时,对它做加解密处理,这个想法一开始看是正确的,但实践起来是有问题的。因为存在文件的打开、读写、关闭这一系列的操作有可能不在同一个进程中完成。
  方法是:如果一个文件被机密进程打开且加密,那么对这个文件的所有操作都当成是加密文件处理。这时候我们就需要一个加密表来记录这些加密规则。现在的技术难点是:你要维护这样一张表,就必须找到一个和文件对应的变量,如果是FILE_OBJECT那不同进程打开同一个文件时会产生多个文件对象,这样就会导致同一个文件的一些文件对象在加密表中,一些文件对象不在加密表中,造成明密文混合。更好的一个方法是用FCB来与他对应(因为FCB的神秘性和不同系统的差异性,导致这个方法有很多难度)。

6、前面讲到的隐藏文件头和设置文件偏移,以及文件读写加解密的操作,这些操作系统都不会发送所需要的irp的,所以必须自己发irp去操作,因为irp这个结构体的为公开,这也比较困难,但目前很多牛人探索出来的方法虽然非官方,但目前为止是有效的。

7、文件的打开操作,主要a、防止打开重入。b、打开预处理。
8、文件的加解密:就是对读/写请求的处理,如果是读:那么相对比较简单,直接读缓冲区中的内容解密。
如果是写,那较为复杂,需要用一个指针上下文保存原来的内存空间,在自己申请的内存上进行加密后,在把原来的缓冲内存恢复。


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 7
支持
分享
最新回复 (18)
雪    币: 103
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
路过学习ING,祝福你早日得到邀请码
2009-8-24 21:47
0
雪    币: 74
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
改错:

2.a: ”文件过滤驱动是无法捕获到缓冲读写请求的“:
           从缓存中读写数据分Fast IO和Cached IO。文件过滤驱动看不到Fast IO,但能看到Cached IO。

4:     无论怎么改,VMM总是知道真实的文件大小,因为是文件系统告诉它的,根本不经过过滤驱动。

5: FCB header 是一样的,而且MiniFilter提供了丰富的Context管理,这不是问题。

没看过《寒江独钓》,但想来原理应该是一样的。
2009-8-25 05:25
0
雪    币: 83
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
谢谢 techie的指正。
1、刚开始学习,所以对操作系统、内存、缓冲区等这些还很模糊。
书上面是通过这样的一个判断捕获到的:
if(irpsp->MajorFunction==IRP_MJ_READ&&(irp->Flags&(IRP_PAGING_IO|IRP_SYNCHRONOUS_PAGING_IO|IRP_NOCACHE)))
你说的应该就是这个了吧???
2、修改大小、偏移好像只是为了:当打开时,把那4kb的加密标志头隐藏,和读写时跳过4kb的大小后开始读写,我也看过在点开文件属性查看文件大小时,文件大小会比正常文件大4kb的,我一直不知道这是为什么,你说的VMM知道它的真实大小,是不是表现就是这个啊???望指点........
3、MinFilter还没看过,看来有学习的必要。
2009-8-25 09:21
0
雪    币: 164
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不错啊,  在网上找半天没找到那本书, 发个链接好不
2009-8-25 09:32
0
雪    币: 83
活跃值: (10)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
6
anbn
不好意思,我也没有电子书,我买了一本纸书看。
2009-8-25 11:08
0
雪    币: 24
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
都是大鸟啊
小菜路过
2009-8-25 14:39
0
雪    币: 63
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
8
我也曾经研究过怎么隐藏文件大小,可是总是失败,你这么一提,我倒是对你说的VMM感兴趣,想知道他是个什么东东,我也曾去百科查了一下,VMM是“ Virtual Machine Monitor”感觉跟咱们讨论的关系不大,你能解释一下么?

PS:我用同一个代码测试过XP,XP上市能隐藏文件大小的,只有WIN7上不能,win7无论如何都能看到文件的真实大小
2013-2-25 10:06
0
雪    币: 63
活跃值: (25)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
9
我在另外一个帖子上看到了!!!,前后不到2min!内存管理器(VMM)
2013-2-25 10:20
0
雪    币: 11
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
灰常感谢楼主,看完帖子后,才知道“透明加密”为何物了。。。。。
2013-3-1 16:04
0
雪    币: 0
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
路过 来学习了
2013-3-1 16:35
0
雪    币: 4
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
过来学习一下基础知识啊
2013-3-1 21:01
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
新手路过学习一下
2013-3-1 21:45
0
雪    币: 52
活跃值: (69)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
14
虽然还看不太懂,但是会有看懂的那一天
2013-3-2 08:44
0
雪    币: 80
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
15
尽管我现在还不懂,但我将来一定会懂的。。而且很快!
2013-3-2 10:44
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
怪不得有些文档爹爹带回家打不开
2013-3-3 08:37
0
雪    币: 236
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
新手来学习下
2013-3-3 21:15
0
雪    币: 51
活跃值: (25)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
18
谢谢lz分享
2013-3-4 09:37
0
雪    币: 6
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
19
与大家一起努力啊!
2013-3-4 11:05
0
游客
登录 | 注册 方可回帖
返回
//