gpt4 book ai didi

c++ - 解决 PE SxS 导入 Windows

转载 作者:可可西里 更新时间:2023-11-01 10:27:24 26 4
gpt4 key购买 nike

我正在编写我自己的 Windows Loader 版本(尽管是一个非常简单的版本),到目前为止一切顺利。但是,在递归遍历已加载模块的导入表时,我遇到了一些小问题。

对于大多数依赖项,一切都很顺利,我可以简单地递归加载模块。但是,对于某些依赖项,这只会破坏目标进程。经过进一步调查,我意识到这是因为 Windows 并行程序集。本质上,加载的 PE 中的依赖项是目标进程中使用的模块的不同 SxS 版本。

在一种情况下,我正在加载的 DLL 引用了 msvcr90.dll,但目标进程使用的是运行时的早期版本:msvcr71.dll。

现在,windows 加载程序可以很好地处理这个问题,所以显然有一种“正确”的方法可以做到这一点。我已经阅读了一些关于 Activation Contexts 的内容,但它们并没有真正帮助我理解这个问题。

调用 LoadLibrary 本身也不会将 dll 解析为正确的版本

LoadLibraryW(L"msvcr90.dll");

简单返回0。有谁知道

a) How to detect if an import is a SxS assembly

b) How to resolve the import into the correct SxS version for the process.

我真的不知道如何做到这一点。我现在从研究中了解了大部分 PE 文件格式,但我很确定 SxS 超出了 PE 结构的范围。

如果您需要更多信息,请发表评论。可执行文件没有外部 list ,其嵌入式 list 未指定运行时版本。但是,它确实在其工作目录中包含 msvcr71.dll 的拷贝,如果这对任何人都有帮助的话。

干杯。

最佳答案

事实上,SxS 依赖关系超出了 PE 结构的范围!如您所知,PE 的导入表列举了依赖项名称,但没有列举它们的版本。在处理这些依赖表时,加载程序还会查看 PE 依赖镜像的 list 。如果 list 记录了一个或多个库(例如 msvcr90、advapi32 等),则加载程序会在 winsxs 文件夹中查找依赖项。 Here an article概述了此程序集以及如何在 C++ 中收集这些信息。

关于c++ - 解决 PE SxS 导入 Windows,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11175430/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com