アセンブリ埋め込み
はじめ
アセンブリ埋め込み アセンブリ自体にアセンブリの依存関係を埋め込むことができます。これは展開とセキュリティの観点から のセキュリティ上の利点があります。
アセンブリの埋め込みは、マージに似ています。主な相違点は、 である場合、アセンブリが単一アセンブリにマージされないことです。それらは暗号化され、アセンブリとしてパックされます リソース。その結果、出力には単一のアセンブリがあり、 には、同じファイルにパックされた依存関係が含まれています。
マージ時に埋め込むポイントは何ですか(またはその逆)。 アセンブリーをマージすると、結果として アセンブリのパフォーマンスが最適化されます。彼らはNGENすることができます、彼らはすべての制約付きの 環境(Windows Phone、Compact Frameworkなど)で動作します。ファイルマッピング とJIT'tedコードは、このような アセンブリ用のオペレーティングシステムによってキャッシュされ、高速のアプリケーション起動を驚かせることができます。アセンブリ は確実に合併します。
マージの唯一の欠点は、アプリケーションを壊すことなく を適用することが常に可能であるとは限りません。これは、 組み込み埋め込みが救助に来るポイントです。
組み込みアセンブリは、達成するのが簡単な目標であり、 ボックスから作業します。欠点?まあ、彼らは存在します。組み込みアセンブリは NGENできません。制約のあるいくつかの環境(Xbox、 Windows PhoneおよびCompact Framework)では動作しません。アプリケーションのロード中に組み込みのアセンブリを抽出すると、パフォーマンスペナルティ (ペナルティはかなり小さいので、気づくことはありません)です。
組み込みアセンブリにはいくつかの利点もあります。組み込みの アセンブリは暗号化されているため、これは、 ハッカーに対するセキュリティ強化です。組み込みアセンブリは圧縮され、結果のアセンブリのサイズは になります。そしてもちろんアセンブリ 埋め込みは、単一のファイル展開を実現する最も簡単な方法です。 アプリケーションを1つの.exe(または.dll)ファイルで構成します。
手順
はあなたのアセンブリに特別に形成され 属性(複数可)を適用すべき埋め込むアセンブリを有効にするには。これを行うには、下記の 手順を使用してください。 IDE内部
オープンobfuscatableプロジェクトが プロジェクトに新しいソースファイルを追加し、(C#の場合)ObfuscationSettings.csまたは(Visual Basic .NETのための) ObfuscationSettings.vbそれを呼び出す埋め込むアセンブリを有効にする手順。とObfuscationSettings.vb記入は、Visual Basic .NETの場合
using System;
using System.Reflection;
[assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]
:あなたは、次の コンテンツ(C#の)とObfuscationSettings.csを埋める代わりにObfuscationSettings.csまたは ObfuscationSettings.vbの に別の名前を使用することを好むかもしれません次 内容:
Imports System
Imports System.Reflection
<Assembly: Obfuscation(Feature:="embed XXXXXX.dll", Exclude:=False)>
注目と
変更XXXXXX.dllアセンブリのファイル名を に埋め込みます。
重要
埋め込まれたアセンブリをobsuscateすることをお勧めします。
ヒントだけ ファイル名が供給されると、自動的にアセンブリのパスを検索Eazfuscator.NET
。あなたがアセンブリに厳密なファイルパス を指定することを好むなら、あなたはスクリプト変数を使用することができます。
[assembly: Obfuscation(Feature = @"embed $(InputDir)\Lib\AssemblyToEmbed.dll", Exclude = false)]
ヒント
あなたは、いくつかのアセンブリを埋め込みたい場合は、単にいくつかの の属性を追加:
を[assembly: Obfuscation(Feature = "embed Assembly1.dll", Exclude = false)]
[assembly: Obfuscation(Feature = "embed AnotherAssembly2.dll", Exclude = false)]
…
チューニング
組み込みアセンブリは、デフォルトで圧縮および暗号化されています。 は、圧縮、暗号化、またはその両方を無効にすることをお勧めします。 を注文するには、下記の注意事項をお読みください。 【フラグ】スペースで区切られたフラグの任意の列挙である
[assembly: Obfuscation(Feature = "embed [flags] XXXXXX.dll", Exclude = false)]
:
アセンブリ埋め込み用のカスタム属性の完全な表記は 次の形式を有します。
利用可能なフラグのリストを下の表に示します。以下は
アセンブリのためのフラグのリストは、属性
フラグ説明no_compressが は暗号化no_satellitesを無効no_encrypt圧縮が 組み込みアセンブリをロードするように指示Eazfuscator.NET load_from_file サテライトアセンブリの自動埋め込みを無効に無効に埋め込むことです 難読化アセンブリの実行時にメモリの代わりにファイルから削除します。これは、System.Reflection.Assembly タイプのLocationプロパティの意味のある値を に保存するために使用できます。
例を見てみましょう。
例4.24。圧縮と暗号化なしの組込みアセンブリ
using System;
using System.Reflection;
[assembly: Obfuscation(Feature = "embed [no_compress no_encrypt] XXXXXX.dll", Exclude = false)]
例4.25。暗号化せずに組み込みアセンブリ。圧縮は が有効になります。
using System;
using System.Reflection;
[assembly: Obfuscation(Feature = "embed [no_encrypt] XXXXXX.dll", Exclude = false)]
例4.26。組み込みアセンブリ。圧縮と暗号化が有効になります。
using System;
using System.Reflection;
[assembly: Obfuscation(Feature = "embed XXXXXX.dll", Exclude = false)]
例4.27。衛星アセンブリを埋め込む。圧縮と暗号化 は、アセンブリの埋め込みは、アセンブリをリンクするための最も非侵入的な方法ですが、いくつかのまれな問題が発生する可能性のトラブルシューティング
using System;
using System.Reflection;
[assembly: Obfuscation(Feature = "embed satellites", Exclude = false)]
を有効にしています。考えられる問題 については、 の対応する解決策と共に、この章で説明します。 System.Reflection.AssemblyクラスのLocationプロパティ 問題の概要。 System.Reflection.AssemblyクラスのLocationプロパティ は、アセンブリの近くのファイルのパスを検索するためによく使用されます。 は適切な解決策ではありませんが、これはほとんどの展開シナリオで機能します。
何が問題になることがありますか?まず、アセンブリシャドウコピーを使用する場合、Locationプロパティの は完全に予期しない値になる可能性があります。したがって、 は意図したアプリケーションロジックを破棄します。第2に、位置プロパティー は、対応するアセンブリが埋め込まれているときにヌル値を持ちます。
解決策。代わりにEscapedCodeBaseプロパティを使用してください。このプロパティは常に がすべての展開シナリオで正しい値を持っています。下のサンプル をご覧ください。
using System;
class Program
{
static string GetEulaPath()
{
var assembly = typeof(Program).Assembly;
// string location = assembly.Location; // Please do not use this. This is a flawed approach
string location = new Uri(assembly.EscapedCodeBase).LocalPath; // <-- Use this instead
return Path.Combine(Path.GetDirectoryName(location), "EULA.rtf");
}
}
私は(アンマネージコードを持っていた)の依存関係を統合する目的のためだけにこれらの様々なを試してみましたが、私はそれだけでスマートなアセンブリで達成できます。悲しいことに、それは無料ではありません.. – nawfal
これに関連する:http://stackoverflow.com/questions/4844345/alternatives-to-smartassembly-for-exception-handling-and-reporting – nawfal
AFAIK、これらのすべての機能を持つ無料の代替手段はありませんしかし、コストの低いソフトウェアを検討することができれば、これらの機能をすべて備えた[Crypto Obfuscator](http://www.ssware.com/cryptoobfuscator/obfuscator-net.htm)をご覧ください。免責事項:私はLogicNP、Crypto Obfuscatorの開発者のために働いています。 – logicnp