Windows 过滤器驱动程序 - 重定向文件打开问题

问题描述

我正在尝试通过 IRP_MJ_CREATE 重定向 DLL LoadLibrary 调用。我在网上看到过包括 SimRep 在内的示例,但遇到了一些问题。

第一个问题是,当我释放以前的文件对象名称时,有时会因堆损坏而出现蓝屏。一行一行,我似乎在做与示例完全相同的免费,以及只是常识性编程告诉我这个免费是有道理的。

问题 2 是 IoReplaceFileObjectName 似乎根本不起作用。也许这些问题是相关的,我在使用该功能时犯了一些明显的错误?如果我使用手动方法它似乎有效,但文档警告说这可能不安全并且是不好的做法。

代码示例:

UNICODE_STRING toReplace;
RtlInitUnicodeString(&toReplace,L"\\targetDLL.dll");
const WCHAR* replaceWith       = L"\\someDLL.dll";

UNICODE_STRING* name = &Data->Iopb->TargetFileObject->FileName;
BOOLEAN shouldReplace = RtlCompareUnicodeString(name,&toReplace,TRUE) == 0;

if (shouldReplace) {
    // Try catch here just for saftey and debugging
    try {
        USHORT replaceWithLen = (USHORT) wcslen(replaceWith);
        WCHAR* newName = ExAllocatePoolWithTag(PagedPool,replaceWithLen * sizeof(WCHAR),DRIVER_TAG);
        if (newname) {
            RtlZeroMemory(newname,replaceWithLen * sizeof(WCHAR));
            memcpy(newname,replaceWith,replaceWithLen * sizeof(WCHAR));
            ExFreePool(name->Buffer);

            // IoReplace... does not work but this manual replacement does?
            //IoReplaceFileObjectName(Data->Iopb->TargetFileObject,newname,replaceWithLen * sizeof(WCHAR));
            name->Buffer = newname;
            name->Length = replaceWithLen * sizeof(WCHAR);
            name->MaximumLength = name->Length;

            Data->Iopb->TargetFileObject->RelatedFileObject = NULL;
            Data->IoStatus.Status = STATUS_REPARSE;
            Data->IoStatus.Information = IO_REPARSE;
            FltSetCallbackDataDirty(Data);
        }
        return FLT_PREOP_SUCCESS_NO_CALLBACK; // PREOP_COMPLETE?

    } except(EXCEPTION_EXECUTE_HANDLER) {
        // Output failure to some log file (I never see this)
    }
}

额外问题:dll 加载的处理方式不同吗?这是我的驱动程序可能看不到打开和读取的方式吗?我知道像KnownDlls这样的缓存用于重要的系统DLL,但是缓存是否存在会阻止我进行这些类型的重定向?我注意到不同的结果取决于我的测试目标文件。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...