首先说一下思路:修改微软的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虚拟机自动化脱壳的方法