吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 685|回复: 7
收起左侧

[求助] 透明加解密prewrite该如何处理

[复制链接]
Panel 发表于 2024-7-13 17:05
本帖最后由 Panel 于 2024-7-13 17:15 编辑

我在透明加解密实现的prewrite时,如果我对非机密进程进行了拦截,那么将导致整个文件保存后内容消失,通过debug发现是每次写的时候内容是:原文件内容+新写入的内容。请教有类似经验的人指点讨论,代码在下方
    NTSTATUS status = STATUS_UNSUCCESSFUL;
    PFILE_STREAM_CONTEX pFileStreamContex = NULL;
    PCALLBACK_CONTEX pCallBackContex = NULL;
    PUCHAR pWriteBuffer = NULL;
    ULONG uNewWriteLocation = 0;
    ULONG uNewWriteLen = 0;
    LARGE_INTEGER largeWriteOffset = { 0 };
    LONGLONG llFileSize = 0;

    llFileSize = QueryFileSize(FltObjects->Instance, FltObjects->FileObject);

    if (-1 == llFileSize)
    {
        return FLT_PREOP_COMPLETE;
    }

    //没有流则代表是非机密文件,所以我们直接放行
    status = FltGetStreamContext(FltObjects->Instance,FltObjects->FileObject,&pFileStreamContex);

    //没有流就可以初步证明不是机密文件 
    if (!NT_SUCCESS(status))
    {
        return FLT_PREOP_SUCCESS_WITH_CALLBACK;
    }

    //非机密文件
    if (!pFileStreamContex->bIsCiphertext)
    {
        FltReleaseContext(pFileStreamContex);
        return FLT_PREOP_SUCCESS_WITH_CALLBACK;
    }

    //我们只能处理以下三种
    if (!BooleanFlagOn(Data->Iopb->IrpFlags, (IRP_NOCACHE | IRP_PAGING_IO | IRP_SYNCHRONOUS_PAGING_IO)))
    {
        FltReleaseContext(pFileStreamContex);
        Data->IoStatus.Status = STATUS_SUCCESS;
        Data->IoStatus.Information = llFileSize;
        return FLT_PREOP_COMPLETE;
    }

    //是机密文件我们才禁用 
    if (FLT_IS_FASTIO_OPERATION(Data))
    {
        FltReleaseContext(pFileStreamContex);
        return FLT_PREOP_DISALLOW_FSFILTER_IO;
    }

    //不是机密进程在操作机密文件,我们直接拒绝操作  也就是此时拒绝后导致文件内容为空
    if (!pFileStreamContex->bIsSecProcess)
    {
        FltReleaseContext(pFileStreamContex);
        Data->IoStatus.Status = STATUS_SUCCESS;
        Data->IoStatus.Information = llFileSize;
        return FLT_PREOP_COMPLETE;
    }

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

头像被屏蔽
捷豹网络丶贱仔 发表于 2024-7-13 21:16
提示: 作者被禁止或删除 内容自动屏蔽
 楼主| Panel 发表于 2024-7-13 22:10
捷豹网络丶贱仔 发表于 2024-7-13 21:16
[mw_shl_code=c,true]NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_STREAM_CONTEXT pFileStreamContext  ...

谢谢前辈,你这份代码我之前的思路也是一样,但是一直测试发现我读的长度超过512就一直失败,所以没有采用,今天重写写了一份之后发现可以了,只不过我使用的是FltAllocatePoolAlignedWithTag
 楼主| Panel 发表于 2024-7-13 22:16
捷豹网络丶贱仔 发表于 2024-7-13 21:16
[mw_shl_code=c,true]NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_STREAM_CONTEXT pFileStreamContext  ...

目前发现如果出发多次写操作的话,只能成功FltRead成功一次(内容长度512,测试扇区对齐值也是512)
头像被屏蔽
捷豹网络丶贱仔 发表于 2024-7-13 23:06
提示: 作者被禁止或删除 内容自动屏蔽
willgoon 发表于 2024-7-14 13:15
感谢两位大佬分享的源码
 楼主| Panel 发表于 2024-7-14 15:26
捷豹网络丶贱仔 发表于 2024-7-13 23:06
[mw_shl_code=asm,true]NTSTATUS status = STATUS_UNSUCCESSFUL;
PFILE_STREAM_CONTEXT pFileStreamContex ...

感谢分享
yoga2joker 发表于 2024-7-14 21:10
感谢分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-12-15 05:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表