bluacat
驱动小牛
驱动小牛
  • 注册日期2004-09-13
  • 最后登录2016-09-25
  • 粉丝0
  • 关注0
  • 积分1023分
  • 威望277点
  • 贡献值0点
  • 好评度146点
  • 原创分0分
  • 专家分0分
  • 社区居民
阅读:9816回复:34

sfilter动态加解密吐血总结

楼主#
更多 发布于:2004-09-14 18:22
晕了好几天,总算把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盘怎么不能访问了??


最新喜欢:

lipengyilipeng... linshierlinshi... easydrivereasydr... snoxsnox
shawhe
驱动牛犊
驱动牛犊
  • 注册日期2010-01-25
  • 最后登录2010-12-11
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望171点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2010-05-20 21:13
学习啦!
xum2008
驱动牛犊
驱动牛犊
  • 注册日期2009-05-08
  • 最后登录2014-08-10
  • 粉丝0
  • 关注0
  • 积分75分
  • 威望741点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2010-02-07 20:05
不太懂。。。
qin.susu
驱动牛犊
驱动牛犊
  • 注册日期2007-04-19
  • 最后登录2009-07-07
  • 粉丝0
  • 关注0
  • 积分196分
  • 威望477点
  • 贡献值0点
  • 好评度16点
  • 原创分0分
  • 专家分0分
地板#
发布于:2009-04-08 09:26
文件过滤驱动透明加解密学习之!
BuShiXiaoHaiZi
驱动牛犊
驱动牛犊
  • 注册日期2008-12-20
  • 最后登录2012-04-22
  • 粉丝0
  • 关注0
  • 积分57分
  • 威望531点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2008-12-21 10:42
汗 ~ 自己都弄错了
wanted999
驱动牛犊
驱动牛犊
  • 注册日期2006-03-28
  • 最后登录2012-08-13
  • 粉丝0
  • 关注0
  • 积分519分
  • 威望429点
  • 贡献值0点
  • 好评度48点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2008-12-07 05:25
原理是这样,
实现方法很多种,
做到高效安全最费功夫.
wangmingliang
驱动牛犊
驱动牛犊
  • 注册日期2008-05-21
  • 最后登录2009-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望106点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
6楼#
发布于:2008-11-24 09:35
恳请bluacat的回复
wangmingliang
驱动牛犊
驱动牛犊
  • 注册日期2008-05-21
  • 最后登录2009-09-01
  • 粉丝0
  • 关注0
  • 积分10分
  • 威望106点
  • 贡献值0点
  • 好评度1点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2008-11-22 22:08
请问一下bluacat,您是如何判断您要加密的文件的?
cxjnet
驱动牛犊
驱动牛犊
  • 注册日期2005-03-21
  • 最后登录2014-05-01
  • 粉丝0
  • 关注0
  • 积分23分
  • 威望191点
  • 贡献值0点
  • 好评度4点
  • 原创分0分
  • 专家分0分
8楼#
发布于:2008-11-22 18:58
不错,真的是吐血了
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
9楼#
发布于:2007-04-05 18:44
看看
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
10楼#
发布于:2007-04-05 17:00
NTSTATUS
SfWriteCompletion(
                 IN PDEVICE_OBJECT DeviceObject,
                 IN PIRP Irp,
                 IN PVOID Context
                 )
{
    PW_R_COMPLETION_STRUCT CompletionCtx = (PW_R_COMPLETION_STRUCT)Context;
    PVOID userBuffer = Irp->UserBuffer;

    DeviceObject = DeviceObject;

    Irp->MdlAddress = CompletionCtx->Mdl;
    Irp->UserBuffer = CompletionCtx->UserBuffer;
    Irp->AssociatedIrp.SystemBuffer = CompletionCtx->AssociatedBuffer;

    ExFreePoolWithTag(userBuffer, SFLT_POOL_TAG);
    ExFreePoolWithTag(CompletionCtx, SFLT_POOL_TAG);

    return STATUS_SUCCESS;
}

NTSTATUS WdmWrite(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    NTSTATUS status = STATUS_SUCCESS;
    int i = 0;
    LONGLONG FilePointer = IrpStack->Parameters.Write.ByteOffset.QuadPart;
    LONG WriteLen = IrpStack->Parameters.Write.Length;
    KIRQL irql;
    PVOID OldBuffer = NULL;
    PVOID NewBuffer = NULL;
    PSFILTER_DEVICE_EXTENSION DevExt = (PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension;
    PW_R_COMPLETION_STRUCT pCompletionCtx=NULL;

    PAGED_CODE();
    DeviceObject = DeviceObject;

    KdPrint(("Wirte: %d bytes from file pointer %d.\r\n", (int)WriteLen, (int)FilePointer));

    if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    }

    do
    {
        if(FilePointer < 0)
            status = STATUS_INVALID_PARAMETER;
        else
        {
            if (Irp->MdlAddress)
                OldBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
            else if(Irp->AssociatedIrp.SystemBuffer == NULL)
                OldBuffer = Irp->UserBuffer;
            else OldBuffer = Irp->AssociatedIrp.SystemBuffer;

            if(OldBuffer == NULL)
                break;

            NewBuffer = ExAllocatePoolWithTag(NonPagedPool, WriteLen, SFLT_POOL_TAG);
            if(NULL == NewBuffer)
            {
                IoSkipCurrentIrpStackLocation(Irp);
                return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
            }

            pCompletionCtx = ExAllocatePoolWithTag(NonPagedPool, sizeof(W_R_COMPLETION_STRUCT), SFLT_POOL_TAG);
            if(NULL == NewBuffer)
            {
                ExFreePoolWithTag(NewBuffer, SFLT_POOL_TAG);
                IoSkipCurrentIrpStackLocation(Irp);
                return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
            }

            pCompletionCtx->Mdl = Irp->MdlAddress;
            pCompletionCtx->UserBuffer = Irp->UserBuffer;
            pCompletionCtx->AssociatedBuffer = Irp->AssociatedIrp.SystemBuffer;

            KeAcquireSpinLock(&BufferLock, &irql);

            memset(NewBuffer, 0, WriteLen);
            memcpy(NewBuffer, OldBuffer, WriteLen);
            for(i = 0; i < WriteLen; i++)
                ((char*)NewBuffer) = ((char*)NewBuffer)+1;

            if(NULL != Irp->MdlAddress)
                Irp->MdlAddress = NULL;
            if(NULL != Irp->AssociatedIrp.SystemBuffer)
                Irp->AssociatedIrp.SystemBuffer = NULL;

            Irp->UserBuffer = NewBuffer;

            KeReleaseSpinLock(&BufferLock, irql);

            IoCopyCurrentIrpStackLocationToNext(Irp);
            IoSetCompletionRoutine(Irp, SfWriteCompletion, pCompletionCtx, TRUE, TRUE,TRUE);
            return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
        }
    } while(0);

    Irp->IoStatus.Status = status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);

    return status;
}


上面的WdmWrite和WdmRead会蓝屏,为什么啊?
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
Pegram
论坛版主
论坛版主
  • 注册日期2005-12-03
  • 最后登录2013-08-23
  • 粉丝13
  • 关注5
  • 积分1333分
  • 威望4717点
  • 贡献值1点
  • 好评度78点
  • 原创分0分
  • 专家分2分
11楼#
发布于:2007-04-05 16:54
NTSTATUS WdmReadCompletion(IN PDEVICE_OBJECT DebiceObject, IN PIRP Irp, IN PVOID Context)
{
    KEVENT* pEvent = (KEVENT*)Context;

    UNREFERENCED_PARAMETER(Irp);
    UNREFERENCED_PARAMETER(DebiceObject);
    KeSetEvent(pEvent, IO_NO_INCREMENT, FALSE);

    return STATUS_SUCCESS;
}

NTSTATUS WdmRead(IN PDEVICE_OBJECT DeviceObject, IN PIRP Irp)
{
    PIO_STACK_LOCATION IrpStack = IoGetCurrentIrpStackLocation(Irp);
    NTSTATUS status = STATUS_SUCCESS;
    KEVENT kEvent;
    int i=0;

    LONGLONG FilePointer = IrpStack->Parameters.Read.ByteOffset.QuadPart;
    LONG ReadLen = IrpStack->Parameters.Read.Length;
    KIRQL irql;
    PVOID OldBuffer = NULL;
    PSFILTER_DEVICE_EXTENSION DevExt = (PSFILTER_DEVICE_EXTENSION) DeviceObject->DeviceExtension;

    PAGED_CODE();
    DeviceObject = DeviceObject;
    KdPrint(("Read: %d bytes from file pointer %d.\r\n", (int)ReadLen, (int)FilePointer));

    if (!(Irp->Flags & (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
    {
        IoSkipCurrentIrpStackLocation(Irp);
        return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
    }

    do {
        if(FilePointer < 0)
        {
            status = STATUS_INVALID_PARAMETER;
            break;
        }
        else
        {
            if (Irp->MdlAddress)
                OldBuffer = MmGetSystemAddressForMdl(Irp->MdlAddress);
            else if(Irp->AssociatedIrp.SystemBuffer == NULL)
                OldBuffer = Irp->UserBuffer;
            else OldBuffer = Irp->AssociatedIrp.SystemBuffer;

            if(OldBuffer == NULL)
                break;

            KeClearEvent(&kEvent);
            IoSetCompletionRoutine(Irp, WdmReadCompletion, (PVOID)&kEvent, TRUE, TRUE, TRUE);
            status = IoCallDriver(DevExt->AttachedToDeviceObject, Irp);

            if(STATUS_PENDING == status)
            {
                status = KeWaitForSingleObject(&kEvent, Executive, KernelMode, FALSE, NULL);
                ASSERT(STATUS_SUCCESS == status);
            }
        
            KeAcquireSpinLock(&BufferLock, &irql);

            for(i = 0; i < ReadLen; i++)
                ((char*)OldBuffer) = ((char*)OldBuffer)-1;

            KeReleaseSpinLock(&BufferLock, irql);
            return IoCallDriver(DevExt->AttachedToDeviceObject, Irp);
        }        
    } while(0);

    Irp->IoStatus.Status = status;
    IoCompleteRequest(Irp, IO_NO_INCREMENT);
    return status;
}
《寒江独钓》与《竹林蹊径》的合作作者。精通USB开发,设计了CY001 USB驱动套件(http://bbs.driverdevelop.com/read.php?tid-119314.html)。
qihuiling_0304
驱动牛犊
驱动牛犊
  • 注册日期2007-03-18
  • 最后登录2010-11-15
  • 粉丝0
  • 关注0
  • 积分662分
  • 威望68点
  • 贡献值0点
  • 好评度66点
  • 原创分0分
  • 专家分0分
12楼#
发布于:2007-03-30 00:43
诶呀,大家真厉害...
我做的毕业设计就是这个,还一点都不懂呢...
郁闷
~要有追求卓越的执著~
magichere
驱动小牛
驱动小牛
  • 注册日期2007-01-24
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望137点
  • 贡献值0点
  • 好评度136点
  • 原创分0分
  • 专家分0分
13楼#
发布于:2007-03-26 11:43
我把所有创建的文件都打出来了。 发现 丢失加密标志的文件 都没有打出来。怎么跳过去了。重要的是,文件还被加密了。55
创造美好的未来生活!!!
magichere
驱动小牛
驱动小牛
  • 注册日期2007-01-24
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望137点
  • 贡献值0点
  • 好评度136点
  • 原创分0分
  • 专家分0分
14楼#
发布于:2007-03-26 10:02
这个函数有什么用处?

#define FAT_NTC_FCB                        0x0502
#define NTFS_NTC_FCB                    0x0705

BOOLEAN
SfIsObjectFile(
               IN PFILE_OBJECT FileObject
               )
{
    PFSRTL_COMMON_FCB_HEADER fcb = (PFSRTL_COMMON_FCB_HEADER) FileObject->FsContext;

//    KdPrint(("sfilter!SfIsObjectFile: fcb->NodeTypeCode = %x\n", fcb->NodeTypeCode));

    if (fcb->NodeTypeCode == FAT_NTC_FCB)
        return TRUE;
    else if (fcb->NodeTypeCode == NTFS_NTC_FCB)
        return TRUE;

    return FALSE;
}
创造美好的未来生活!!!
magichere
驱动小牛
驱动小牛
  • 注册日期2007-01-24
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望137点
  • 贡献值0点
  • 好评度136点
  • 原创分0分
  • 专家分0分
15楼#
发布于:2007-03-26 09:55
使用这样的 file.$encrypt$  文件标志。会有什么问题呢?
我的程序简单跑的没问题。遇到大文件处理。比如安装OFFICE 。需要建立Temp目录下很多临时文件。这时候就坏掉了。有时候出现文件损坏,或文件标志没有。导致无法解密。目录下的相同扩展名的标志文件小于这种扩展名的文件。
tooflat 指点一下哦。
创造美好的未来生活!!!
magichere
驱动小牛
驱动小牛
  • 注册日期2007-01-24
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望137点
  • 贡献值0点
  • 好评度136点
  • 原创分0分
  • 专家分0分
16楼#
发布于:2007-03-25 20:34
加密成功,这标志 文件 也设置成功了. 但是这个标志文件不存在.
好像怎么跳过一样.但是返回是成功的.汗.好好调试一下.第一次不太会调试!
创造美好的未来生活!!!
magichere
驱动小牛
驱动小牛
  • 注册日期2007-01-24
  • 最后登录2008-05-07
  • 粉丝0
  • 关注0
  • 积分1000分
  • 威望137点
  • 贡献值0点
  • 好评度136点
  • 原创分0分
  • 专家分0分
17楼#
发布于:2007-03-25 20:28
对呀怎么解决!关注!
我发现我使用 tooflat 的加密程序测试,
发现文件被加密了. 设置 file.$encrypt$ 加密标志失败! 这个文件不存在,为什么呢?
怎么会这样呢?
创造美好的未来生活!!!
thf76
驱动牛犊
驱动牛犊
  • 注册日期2007-03-25
  • 最后登录2007-03-25
  • 粉丝0
  • 关注0
  • 积分20分
  • 威望3点
  • 贡献值0点
  • 好评度2点
  • 原创分0分
  • 专家分0分
18楼#
发布于:2007-03-25 10:36
好,看看!!!
longshentailang
驱动牛犊
驱动牛犊
  • 注册日期2005-12-06
  • 最后登录2008-03-24
  • 粉丝0
  • 关注0
  • 积分830分
  • 威望84点
  • 贡献值4点
  • 好评度83点
  • 原创分0分
  • 专家分0分
19楼#
发布于:2007-01-09 22:16
学习ing
上一页
游客

返回顶部