4

既存の .NET アセンブリ dll のコードにいくつかの変更を加えました。コードの署名に使用されるキーファイルがありません。検証をスキップするために登録せずに(移植性がない)、StrongNamesを削除せずに(アプリケーションに損害を与える)、.NET実行可能ファイルを強制的にロードするにはどうすればよいですか?

4

2 に答える 2

13

それはできません。それが強力な名前の要点です。

厳密な名前は、実行可能ファイルが作成者以外によって改ざんされていないことを確認します。(元のキー ファイルを持っている人は誰でも作成者であると見なされます。) あなたはキー ファイルを持っていないため、作成者であってはなりません。そのため、厳密な名前付けを行うと、必要な変更を行うことができなくなります。

DLL をロードする場合は、提案したいずれかのソリューションを使用する必要があります。

EDIT .NET 3.5 SP1 以降、次の条件の少なくとも 1 つが満たされている場合、厳密な名前の検証はバイパスされます。

  • アセンブリは Authenticode で完全に署名されています。
  • アセンブリは完全に信頼されています (厳密な名前の証拠に関係なく)。
  • アセンブリは、完全に信頼された AppDomain に読み込まれます (これは、ほとんどのシナリオでデスクトップ アプリケーションで発生することです)。
  • アセンブリは AppDomain の下の場所から読み込まれますApplicationBase(つまり、アセンブリはアプリケーションと共に配布され、同じディレクトリに存在します)。

基本的に、厳密な名前の検証は、Silverlight を除くすべてのユース ケースで無効にされていました。ただし、システム管理者は、レジストリ キーを使用してデフォルトで名前の検証を再度有効にすることができます。

[HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\.NETFramework]
"AllowStrongNameBypass"=dword:00000000

Microsoft によると、この変更が許可された理由は、厳密な名前は整合性チェック メカニズムではなく、アセンブリ識別メカニズムであったためです。実際の整合性チェックには、Authenticode が適しています。

これは、すべての実用的な目的において、改ざんを防ぐために厳密な名前は役に立たず、システム管理者が防止しない限り、誰でも任意のアセンブリを改ざんして正しく読み込むことができることを意味します。

この質問に正しく答えるには、アセンブリを変更するその厳密な名前が無効になるため、snk が利用できない場合、厳密な名前を無効にせずに DLL を編集する方法はないことに注意してください。ただし、ほとんどの場合、読み込みが妨げられることはありません。

于 2012-09-10T22:38:09.387 に答える
3

Reflexil (.NET Reflector アドオン) で .NET dll を編集し、変更されたコードで元の署名を保持できます。回答ありがとうございます。

アセンブリを再編集せずに編集したい場合は、Reflexil を使用してください。人々がこの回答に反対票を投じているからといって、それが間違っているという意味ではありません。

于 2012-09-10T23:25:40.747 に答える