首页
社区
课程
招聘
[旧帖] [求助]关于磁盘类过滤驱动,实现透明加密的几个问题? 0.00雪花
发表于: 2012-4-28 20:43 1409

[旧帖] [求助]关于磁盘类过滤驱动,实现透明加密的几个问题? 0.00雪花

2012-4-28 20:43
1409
首先说一下思路:修改微软的diskperf框架,在IRP_MJ_READ和IRP_MJ_WIRTE中捕获读写数据,在加解密,然后在交给下一层驱动。

问题1:捕获数据是在IRP_MJ_READ和IRP_MJ_WIRTE中吗,当然IRP_MJ_READ是在完成例程中捕获的还是在其他地方?

问题2:在IRP_MJ_READ和IRP_MJ_WIRTE中的确能捕获到数据,但是我打开一个txt文档写入abcd4个字节保存,调试发现有4个以上的IRP包产生,但是只有一个包的MDL中有abcd,其他的IRP不知道是怎么产生的,如果我想加密的话,这些也加密可能会产生隐患,那么怎么过滤掉,或者说当什么标志产生的时候,是真正读写文件内容的数据。
读操作则产生的IRP更多,而且对所有读操作的IRP进行算法解密的时候,出现打开磁盘时提示磁盘未格式化的错误。

问题3:真正读写数据的大小,按理说我写入4个字节的数据,应该实际的写入大小是4字节啊!但是从两个地方获得的读写长度都不对Irp->IoStatus.Information和irpStack->Parameters.Write.Length

问题4:KdPrint(( "UserBuffer 写操作 Buffer: %ls length : %u\n \tWritelength :%u\n",
outstr, length,irpStack->Parameters.Write.Length));
这样为什么打印不出数据,outstr是从MDL中获得的缓冲区指针(char*型)。直接开内存是可以看到的。

写代码:
if ( Irp->MdlAddress != NULL )
{
buffer = MmGetSystemAddressForMdlSafe(Irp->MdlAddress,NormalPagePriority);
length = Irp->IoStatus.Information;
outstr = (CHAR*)buffer;
KdPrint(("MDL 写操作 Buffer: %ls length : %u\n \tWritelength :%u\n",
buffer, length,irpStack->Parameters.Write.Length));
//        RtlCopyMemory(buffer,"JinEver",7);
}
else if ( Irp->UserBuffer != NULL)
{
buffer = Irp->UserBuffer;
length = Irp->IoStatus.Information;
outstr = (CHAR*)buffer;
KdPrint(( "UserBuffer 写操作 Buffer: %ls length : %u\n \tWritelength :%u\n",
outstr, length,irpStack->Parameters.Write.Length));
//        RtlCopyMemory(buffer,"JinEver",7);
}
else
{
length = Irp->IoStatus.Information;
KdPrint(("Others 写操作 length :%u\n \tWritelength :%u\n",
length,irpStack->Parameters.Write.Length));
}

问题有点长,希望看仔细点。

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (1)
雪    币: 30
活跃值: (30)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
2
我只知道第二个问题的答案:
windows读文件最少会读一个簇的大小出来。一般是4k。
2012-4-29 22:33
0
游客
登录 | 注册 方可回帖
返回
//