Разрешение PE SxS импортирует Windows

Я нахожусь в процессе написания своей собственной версии Windows Loader (хотя и очень простой версии), и до сих пор все получалось довольно хорошо. Однако я столкнулся с небольшим затруднением, когда дело доходит до рекурсивного обхода таблицы импорта для загруженного модуля.

Для большинства зависимостей все работает хорошо, и я могу просто рекурсивно загрузить модуль. Однако для некоторых зависимостей это просто нарушает целевой процесс. После дальнейшего изучения я понял, что это из-за параллельных сборок Windows. По сути, зависимость в загруженном PE была другой версией SxS модуля, используемого в целевом процессе.

В одном случае загружаемая DLL-библиотека ссылалась на msvcr90.dll, но целевой процесс использовал более раннюю версию среды выполнения: msvcr71.dll.

Теперь загрузчик Windows может справиться с этим, так что, очевидно, есть "правильный" способ сделать это. Я немного прочитал об контекстах активации, но они не очень помогли мне понять проблему.

Вызов LoadLibrary сам не разрешает DLL к правильной версии либо

LoadLibraryW(L"msvcr90.dll");

Просто возвращает 0. Кто-нибудь знает

а) Как определить, является ли импорт сборкой SxS

б) Как разрешить импорт в правильную версию SxS для процесса.

Я действительно озадачен тем, как это сделать. Я знаю большую часть формата PE-файлов из исследований в настоящее время, но я почти уверен, что SxS выходит за рамки PE-структуры.

Если вам нужна дополнительная информация, просто прокомментируйте. Исполняемый файл не имеет внешнего манифеста, а его встроенный манифест не указывает версию времени выполнения. Однако он содержит копию msvcr71.dll в своем рабочем каталоге, если это вообще кому-нибудь поможет.

Приветствия.

1 ответ

Решение

На самом деле, зависимости SxS выходят за рамки структуры PE! Как вы знаете, таблицы импорта PE перечисляют имена зависимостей, но не их версии. При обработке этих таблиц зависимостей загрузчик также просматривает манифест PE-зависимых образов. Если Manifest документирует одну или несколько библиотек (например, msvcr90, advapi32,....), загрузчик просматривает папку winsxs, чтобы найти зависимость. Вот статья, которая дает обзор этой сборки и как собрать эту информацию в C++.

Другие вопросы по тегам