- PR -

自作のクラスライブラリDLLの、第3者からの利用を制限するには?

投稿者投稿内容
bminor
会議室デビュー日: 2005/07/30
投稿数: 6
投稿日時: 2005-07-30 10:53
C#でクラスライブラリを作って、自作のアプリケーションで使用しているのですが、このDLLの参照、またはその利用を制限する方法ってあるのでしょうか?

自分だけ利用可能で、第三者はildasmで中は見えてもライブラリは利用できない、という形が理想的なのですが、その方法がみつかりません。。

関係ないかもしれませんが、DLLは厳密な名前を使用して署名しています。

ご教示よろしくお願いします。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-07-30 11:19
引用:

自分だけ利用可能で、第三者はildasmで中は見えてもライブラリは利用できない、という形が理想的なのですが、その方法がみつかりません。。



どんな仕組みを盛り込んだとしても、ildasm 可能ということは改変も可能なわけですが、「改変による不正使用」はOKなんですか?
bminor
会議室デビュー日: 2005/07/30
投稿数: 6
投稿日時: 2005-07-30 12:22
レスありがとうございます。

厳密な名前で署名すれば、ライブラリが改変されてもロードで失敗するという仕組みだと思っているのですが、このへんのところはよくわかっていません。

ライブラリの改変が心配というより、気軽にライブラリ内のクラスが参照され、そのまま使用される、というのを防ぐことはできないものかと思っています。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2005-07-30 12:45
bminorさんが作ったアセンブリa.exeとb.dllがあるとして、厳密名をつければたしかにa.exeが改変されたb.dllをロードすることを防ぐことはできるでしょう。
ですがildasm/ilasmが可能な以上、誰かが作ったc.exeがb.dllまたはその改変dllをロードすることは防ぎようがありません。
難読化すればある程度抑止できるとは思いますが。
渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-07-30 13:53
引用:

ライブラリの改変が心配というより、気軽にライブラリ内のクラスが参照され、そのまま使用される、というのを防ぐことはできないものかと思っています。



既にコメントが付いていますが、改変したライブラリを他のアプリケーションで使うのを防ぐ、効果的な方法はありません。

例えば、「クラスライブラリ = .dll のイメージを暗号化してしまい、アプリケーションでライブラリを使用する際はオンメモリで復号して、ランタイムに機能を呼び出す」位すれば、難読化より少し上の強度を実現できます。

が、それでも「100%」ではあり得ません。

アプリケーションをデバッグ実行すれば、復号済みのライブラリコードにアクセス可能ですから、それを抜き出して再利用することも可能です。


_________________
// 渋木宏明 (Hiroaki SHIBUKI)
// http://hidori.jp/
// Microsoft MVP for Visual C#
//
// @IT会議室 RSS 配信中: http://hidori.jp/rss/atmarkIT/
yayadon
常連さん
会議室デビュー日: 2003/07/23
投稿数: 41
投稿日時: 2005-07-30 14:04
.NET Framework 2.0 からだけど,
InternalsVisibleToAttribute という属性で,
[assembly:InternalsVisibleToAttribute("AssemblyB, PublicKeyToken=32ab4ba45e0a69a1")]
な感じでやると,Publicでない型もAssemblyBには見えます。

cf.
Friend Assemblies
bminor
会議室デビュー日: 2005/07/30
投稿数: 6
投稿日時: 2005-07-30 17:30
いろいろとレスありがとうございます。

> ですがildasm/ilasmが可能な以上、誰かが作ったc.exeがb.dllまたはその改変
> dllをロ ードすることは防ぎようがありません。

アプリも中が見えるので、ある程度は仕方ないんですよね。希望としては、ライブラリを利用するのに相応の「手間」がかかるのなら、それでいいかなと思っています。

最初は、Cの.libファイルをリンクするような方法でいけるかと思っていたのですが、みつからないですね。ドキュメント読んだところでは、.netmodule がそれに相当するのかと思っていましたが、その利用は MSVS.NET でサポートされていないとありますし。。

> 例えば、「クラスライブラリ = .dll のイメージを暗号化してしまい、
> アプリケーションでライブラリを使用する際はオンメモリで復号して、
> ランタイムに機能を呼び出す」位すれば、難読化より少し上の強度を実現できます。

SDKのツールでオンメモリに登録できるようですね。そこまですることはないと思うのですが、このツール、インストーラでの利用(配布)はできなさそうな感じですが、そのへん気になるところです。

> .NET Framework 2.0 からだけど,
> InternalsVisibleToAttribute という属性で,
> [assembly:InternalsVisibleToAttribute("AssemblyB,
> PublicKeyToken=32ab4ba45e0a69a1")]

なるほど、2.0の属性ですか。ドキュメント調べてみます。1.1がターゲットなのですが、属性のところ、見直してみます。

渋木宏明(ひどり)
ぬし
会議室デビュー日: 2004/01/14
投稿数: 1155
お住まい・勤務地: 東京
投稿日時: 2005-07-30 18:02
引用:

最初は、Cの.libファイルをリンクするような方法でいけるかと思っていたのですが、



と言うと?

開発時点では .exe と .dll を別々にビルドして、配布前に .exe 1個にまとめたいとか、そういうことですか?

であれば、

ilmerge
http://research.microsoft.com/~mbarnett/ilmerge.aspx

でできますよ。

スキルアップ/キャリアアップ(JOB@IT)