2

私は自分のバージョンのWindowsローダー(非常に単純なバージョンですが)を書いている最中ですが、これまでのところ、かなりうまくいっています。ただし、ロードされたモジュールのインポートテーブルを再帰的にウォークすることになると、ちょっとした問題に遭遇しました。

ほとんどの依存関係では、物事はうまく機能し、モジュールを再帰的にロードするだけです。ただし、一部の依存関係では、これはターゲットプロセスを壊すだけです。さらに調査したところ、これはWindowsのサイドバイサイドアセンブリが原因であることがわかりました。基本的に、ロードされたPEの依存関係は、ターゲットプロセスで使用されているモジュールの異なるSxSバージョンでした。

あるケースでは、ロードしていたDLLはmsvcr90.dllを参照していましたが、ターゲットプロセスは以前のバージョンのランタイムmsvcr71.dllを使用していました。

現在、Windowsローダーはこれをうまく処理できるので、これを行うための「正しい」方法が明らかにあります。アクティベーションコンテキストについて少し読みましたが、問題を把握するのに実際には役立ちませんでした。

LoadLibrary自体を呼び出しても、dllが正しいバージョンに解決されません

LoadLibraryW(L"msvcr90.dll");

単に0を返します。誰か知っていますか

a)インポートがSxSアセンブリであるかどうかを検出する方法

b)プロセスの正しいSxSバージョンへのインポートを解決する方法。

私はこれを行う方法に本当に困惑しています。私は現在、研究からほとんどのPEファイル形式を知っていますが、SxSはPE構造の範囲を超えていると確信しています。

さらに情報が必要な場合は、コメントしてください。実行可能ファイルには外部マニフェストがなく、その埋め込みマニフェストはランタイムバージョンを指定しません。ただし、作業ディレクトリにmsvcr71.dllのコピーが含まれている場合は、それが誰かに役立ちます。

乾杯。

4

1 に答える 1

2

実際のところ、SxSの依存関係はPE構造の範囲を超えています。ご存知のように、PEのインポートテーブルは依存関係の名前を列挙しますが、バージョンは列挙しません。これらの依存関係のテーブルを処理するとき、ローダーはPE依存イメージのマニフェストも確認します。マニフェストが1つ以上のライブラリ(msvcr90、advapi32など)を文書化する場合、ローダーはwinsxsフォルダーを調べて依存関係を見つけます。ここでは、このアセンブリの概要と、C++でこれらの情報を収集する方法について説明します。

于 2012-06-24T08:41:49.920 に答える