我正在编写自己的Windows Loader版本(尽管是非常简单的版本),目前为止一切工作都很好。但是,在递归遍历加载模块的Import表时,我遇到了一些麻烦。
对于大多数依赖项,一切工作正常,我可以简单地递归加载模块。但是,对于某些依赖项,这只会破坏目标过程。经过进一步的调查,我意识到这是由于Windows并行程序集。本质上,加载的PE中的依赖性是目标过程中使用的模块的不同SxS版本。
在一种情况下,我正在加载的DLL引用了msvcr90.dll,但是目标进程使用的是运行时的早期版本:msvcr71.dll。
现在,Windows加载程序可以很好地处理此问题,因此显然有一种“正确”的方法可以做到这一点。我已经阅读了一些有关激活上下文的内容,但是它们并没有真正帮助我解决问题。
调用LoadLibrary本身也无法将dll解析为正确的版本

LoadLibraryW(L"msvcr90.dll");
只需返回0。有人知道吗

我真的很困惑如何做到这一点。我现在从研究中了解大多数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/

10-13 07:14