質問者
DLL の参照を防ぐには?

質問
-
現在開発しているソリューションには実行ファイル生成プロジェクト1つとDLL(クラスライブラリ)プロジェクト3つがあるのですが、これらのファイルを配布したときに、DLLをVisual Studio で参照されるとクラスやメソッドがそのまま使用されてしまう状態になってしまっています。
これを、私が開発しているプロジェクトからのみ参照できるようにしたいのですが、何か方法はあるのでしょうか?(極力 internal を使うか、全てのコードを実行ファイルに埋め込む方法しか思いつきません。)
<開発環境>
- Visual C# 2005 Express Edition
- Windows XP HomeEdition
すべての返信
-
-
-
> > # ところで、Express Edition に Dotfuscator は標準でついてくるんだったかな?
> これは Visual Studio とは別の付属ソフトなのでしょうか? そうだとしたら Express Edition にはないようです。(ソフト単体しかありません)
そうですか、やはり Express Edition にはありませんでしたか。
私は Professional Edition を使用していますが、「ツール」メニューの中に「Dotfuscator Community Edition」という項目があります。Dotfuscator 自体は Community Edition であれば無償で使用できたはずですので一度お試しになってみてはいかがでしょうか。
以下の URL からダウンロードできるようです。
http://www.gotdotnet.com/team/dotfuscator/# Express Edition にインストールして使用可能かどうかわかりませんが・・・
より詳しい情報は Google などで検索するとたくさん見つかると思います。
-
internalにしてInternalsVisibleToAttributeを使ってみるっていうのはどうでしょう?
-
自分はプログラムからコピペするのにType.AssemblyQualifiedNameとかから引っ張ってますね~
-
TKY さんありがとうございます。
[assembly:InternalsVisibleToAttribute("AssemblyB, PublicKey=32ab4ba45e0a69a1")]
を使ってみましたが、どうもうまくいきません。今やっているプログラムは「a.dll」から「b.dll」を参照しているのですが、とりあえず両方署名して、b.dll の AssemblyInfo.cs に
[assembly:InternalsVisibleToAttribute("a(/*a.dll のアセンブリ名*/), PublicKey=xxxxx(a.dll の PublicKeyToken)")]
を追加しても「警告 1 アセンブリ参照 'a, PublicKey=xxxxxxx' は無効なため、解決できません。 」と出てきて、internal のクラスは「アクセスできない保護レベル」のエラーになってしまっています。
で、ヘルプを見ると「/out コンパイラ オプション」を使うらしいのですが、この使い方がいまいち分かりません。a.dll プロジェクトのプロパティ→ビルドイベント→ビルド前に実行するコマンドラインに「/out;$(TargetFileName)」を入れるのかと思ったのですが、これでビルドすると、今までのエラーは消えるのですが「エラー 1 コマンド "/out;a.dll" はコード 9009 で終了しました。」というエラーが出てきてしまいます。
多分「/out」の部分の使い方が悪いと思うのですが、どのようにしたらいいのでしょうか?ちなみに b.dll のひとつのクラスを a.dll の多数のコードファイルで参照している状態です。
-
オノデラ は書きました: 現在開発しているソリューションには実行ファイル生成プロジェクト1つとDLL(クラスライブラリ)プロジェクト3つがあるのですが、これらのファイルを配布したときに、DLLをVisual Studio で参照されるとクラスやメソッドがそのまま使用されてしまう状態になってしまっています。
これを、私が開発しているプロジェクトからのみ参照できるようにしたいのですが、何か方法はあるのでしょうか?(極力 internal を使うか、全てのコードを実行ファイルに埋め込む方法しか思いつきません。)
Unmanaged の DLL にしても,第三者から使用できることには違いありませんよね?
.NET のデメリットというわけではないことは予めご注意下さい.「実行可能ファイル」を一段抽象化して従来の NT-Loader のモジュールモデルを再構築した .NET では,例えばバイトストリームとしてアセンブリを CLR に渡すことも簡単にできるようになっています.従って,適当に変換されたバイトデータを実行時に展開することで,参照設定に加えることが出来ないが実行時にアセンブリに変換できるようなファイルを作ることができます.(もちろん自分自身もそのファイルをそのまま参照設定に加えることは出来なくなります)
Assembly.Load メソッド (Byte[])非標準的な方法ですので,ポータビリティの低下や情報収集の困難さはありますが,どうしても必要ならこの方面を調べてみるのも1つの方法かと思います.
『Customizing the Microsoft.NET Framework Common Language Runtime』
に恐らく必要になるであろう背景知識が一通り書かれています.また従来からのコンポーネントのライセンス処理を応用する方法もあるのかもしれませんが,こちらは詳しく知りません.とりあえずポインタだけ.
方法 : コンポーネントおよびコントロールのライセンス処理を行う -
NyaRuRu さんありがとうございます。
> Unmanaged の DLL にしても,第三者から使用できることには違いありませんよね?
.NET のデメリットというわけではないことは予めご注意下さい.まあ、確かにそうですね。ただ .NET で作成した DLL が参照するだけで使えてしまうというのもどうかと思ったもので…。
> 「実行可能ファイル」を一段抽象化して従来の NT-Loader のモジュールモデルを再構築した .NET では,例えばバイトストリームとしてアセンブリを CLR に渡すことも簡単にできるようになっています.従って,適当に変換されたバイトデータを実行時に展開することで,参照設定に加えることが出来ないが実行時にアセンブリに変換できるようなファイルを作ることができます.(もちろん自分自身もそのファイルをそのまま参照設定に加えることは出来なくなります)
Assembly.Load メソッド (Byte[])確かに簡単にはアクセスできなくなるのはとてもいいのですが、「自分自身もそのファイルをそのまま参照設定に加えることは出来なくなる」のは欠点かもしれませんね。(結構DLL の方も頻繁に書き換えているもので)
-
みなさんいろいろアドバイスありがとうございました。
とりあえずいろいろ調べたり検証してみて、対処法を考えてみました。
1.参照の防止について
クラスなどを internal で使用するようにして、モジュール間は InternalsVisibleToAttribute を使用してフレンド アセンブリとする。
2.逆アセンブラの対処法
Dotfuscator Community Edition を使用してコードを難読化させる(Standard Edition 以上?)。
皆さんのおかげで今まで知らなかったことなど参考にでき、とても勉強になりました。ありがとうございます。
-
InternalsVisibleTo はお手軽で、カジュアルな使用を防ぐにはよいと思うのですが、単純にディスアセンブルして使いたいメソッドのシグナチャを適当に変えてアセンブルすることにより、まったく同じ機能のDLLを作ることができます。つまり、DLLの機能を使わせないという目的には無力です。また、難読化もロジックを盗まれにくくするためのものであり、丸ごと使うということを防ぐには力不足です。
> この場合、全てのメソッド内に記述しないといけないのでしょうか?
(実際にはこれでは問題なのですが)単にメソッドの先頭でチェックするだけでよいというのならば、public メソッドを抽出する正規表現は簡単なので、そのためのコードを挿入するのは容易です。プロパティは、実質的にはメソッドと同じです。適当なpublic メソッドを internalに書き換えることができるなら、これもできると思います。
実用上は重要な少数の内部クラスやメソッドを間接的に使われることを防御すればよいので、そのスタティックコンストラクタやメソッドで自分自身の署名をチェックするという手もあります。(難読化は、もちろん必要)