问题描述
我正在尝试通过 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 (将#修改为@)