阅读:3408回复:22
如果改变文件长度呀,我知道这个问题困惑着大家,请大牛给个思路就好
在受控的文件前面增加一个加密标志,然后我们驱动程序读取的时候识别它,决定是否加解密。而这个标志对应用层是完全透明的。
我想了解在什么时候改变长度,在那改变? 或有什么其它方法 |
|
最新喜欢:Dragon...
|
沙发#
发布于:2007-02-02 13:37
我也在做这个东西,似乎不太容易实现呢.请各位大牛指点
|
|
板凳#
发布于:2007-02-02 16:17
找到一个大牛的总结,和大家分享一下,如果我能试出结果就把代码和大家分享,:)
1) 出现于上层发送到我这里,当我这里使用 IoCallDriver() 后,底层返回数 据经过我这一层时,我想让它暂时停止继续向上传递,让这个 IRP 稍微歇息 一会,等我对这个 IRP 返回的数据操作完成后(一般是没有在 CompleteRoutine 中对返回数据进行操作情况下,也就是说等到完成例程返回后再进行操作),由 我来调用 IoCompleteRequest() 让它延着设备栈继续返回。这里要注意,我们 是想让它返回的,所以调用了 IoCompleteRequest()。这个可不同于下面所讲的 自己从头分配 IRP 时在 CompleteRoutine 中已经调用 IoFreeIrp() 释放了当前 IRP 的情况。比如我在做一个改变文件大小,向文件头写入加密标志的驱动时, 在上层发来了 IRP_MJ_QUERY_INFORMATION 查询文件,我想在这个时候获得文件 信息进行判断,然后根据我的判断结果再移动文件指针。注意:上面是两步,第 一步是先获得文件大小,那么在这个时候我就需要用到上述办法,先让这个 IRP 传递下去,得到我想要的东西后在进行对比。等待适当时机完成这个 IRP,让数 据继续传递,直到用户收到为止。第二步我会结合下面小节来讲。 2) 出现于自己从头建立 IRP,当使用 IoAllocate() 或 IoBuildAsynchronousFsdRequest() 创建 IRP 调用 IoCallDriver() 后,底层返回数据到我这一层时,我不想让这 个 IRP 继续向上延设备栈传递。因为这个 IRP 就是在我这层次建立的,上层本 就不知道有这么一个 IRP。那么到这里我就要在 CompleteRoutine 中使用 IoFreeIrp() 来释放掉这个 IRP,并不让它继续传递。这里一定要注意,在 CompleteRoutine 函数返回后,这个 IRP 已经释放了,如果这个时候在有任何关于这个 IRP 的操作 那么后果是灾难性的,必定导致 BSOD 错误。前面 1) 小节给出的例子只完成了第 一步这里继续讲第二步,第一步我重用这个 IRP 得到了文件大小,那么这个时候虽 然知道大小,但我还是无法知道这个文件是否被我加过密。这时,我就需要在这里 自己从头建立一个 IRP_MJ_READ 的 IRP 来读取文件来判断是否我加密过了的文件, 如果是,则要减少相应的大小,然后继续返回。注意:这里的返回是指让第一步的 IRP 返回。而不是我们自己创建的。我们创建的都已经在 CompleteRoutine 中销 毁了。 |
|
|
地板#
发布于:2007-02-06 19:18
请教楼上大牛:如果我在加密文件头加入了加密标志,在读取该文件时能不能保证获得的第一个IRP_MJ_READ一定是包含头的那个IRP啊,写的时候也一样的问题存不存在啊
|
|
地下室#
发布于:2007-02-08 09:36
我现在也在尝试,我现在试的:
在Create中判断是否需要加密,是否已加密(自己创造irp下去读,然后判断),如果有加密标志,就删掉它。 在cleanup时把加密标志加上。 |
|
|
驱动小牛
|
5楼#
发布于:2007-02-09 11:37
虚进虚出,实写文件。
就是你文件的实际长度应该是加上你的头的,但你返回给应用层的却是去掉那个长度的。 需要处理READ/WRITE/SET/QUERY 反正就是,你的偏移和应用层的偏移是不同的,所有IRP进入和退出都需要做处理,自己研究吧. |
|
6楼#
发布于:2007-02-13 10:24
yandong_8112
成功了没有? |
|
驱动小牛
|
7楼#
发布于:2007-02-13 10:53
我做过类似的.
|
|
8楼#
发布于:2007-02-13 18:21
有点明白了,努力中
有点明白了,努力中。在读前 IrpSp->Parameters.Read.ByteOffset.LowPart+4096 在读后 IrpSp->Parameters.Read.ByteOffset.LowPart - 4096 还在摸索,如有错误请指正 |
|
|
9楼#
发布于:2007-02-15 17:28
IrpSp->Parameters.Read.ByteOffset.LowPart
IrpSp->Parameters.Write.ByteOffset.LowPart 从0开始,第一次读4096, 以后至少读n*4096 ?? 如果读到文件尾, 则又开始从0开始读 |
|
10楼#
发布于:2007-02-16 11:04
最近在OSR上泡了2周多,终于完美的实现了文件的变长处理,提示如下:
处理QUERY(FILE、DIR)/SET/READ/WRITE,其中要考虑过滤效率和自己读写文件的诸多问题; 其实这个技术已经被老外应用于RootKit中。 |
|
|
11楼#
发布于:2007-02-16 17:16
引用第10楼devia于2007-02-16 11:04发表的“”: Rootkit 中也用到这种技术? |
|
|
12楼#
发布于:2007-02-25 08:22
引用第10楼devia于2007-02-16 11:04发表的“”: 变长处理后和杀毒软件冲突吗? |
|
13楼#
发布于:2007-02-25 11:38
隐藏某些可执行文件内的某段Code(添加节方法文件增大了,但是绝对表面上看不出来)~~
|
|
|
14楼#
发布于:2007-02-25 13:22
引用第10楼devia于2007-02-16 11:04发表的“”: 你看的是rookit?如果有,可否帖上来? |
|
|
15楼#
发布于:2007-02-25 13:53
我也想看一下相关的资料 希望大牛不吝赐教
|
|
16楼#
发布于:2007-02-26 15:19
老大们有没有相关文件变长处理的资料
小弟也有这方面的需求 也希望板主能开个主题大家来讨论讨论 |
|
17楼#
发布于:2007-02-26 20:24
引用第12楼lsxredrain于2007-02-25 08:22发表的“”: 是否和杀毒软件有冲突,我只简单测试过Mcafee和Norton; 在OSR上有篇比较好的文章,是关于文件过滤驱动和杀毒软件 之间的冲突的原因、避免方法等问题的讨论: |
|
|
18楼#
发布于:2007-02-27 09:30
谢谢 devia的热心
我先去好好研究不明白地方再请教 再次谢谢 |
|
19楼#
发布于:2007-02-27 20:06
引用第18楼hongpengtao于2007-02-27 09:30发表的“”: 你到osr的坛子上看看就能解决。不要对国人抱太大希望。 |
|
|
上一页
下一页