0

アプリケーションにMEFを介してクラスエクスポートを実装するインターフェイスがあります。実装クラスは別々のアセンブリにあり、コンパイル時に認識されません(プラグインを考えてください)。

インターフェイスは基本的に、「ここにキーと値のペアがたくさんあります。ライセンス状態を初期化します」という呼び出しで構成されています。つまり

public LicensingInfo InitialiseLicense(IEnumerable<KeyValuePair<string, string>> keys)

私が知りたいのは、そのインターフェースを「仲介者」の実装から保護する方法はありますか?つまり、アプリケーションからの呼び出しを受信し、プラグインアセンブリで同じメソッドを呼び出し、キーと値のペアの異なる束を使用して、基本的に「はい-ここにあります-すべてがあります」と言います。

アプリケーションがプラグインアセンブリを呼び出して、クエリ可能なオブジェクトを渡すという点で、私はそれを別の方法で考えてみました。そのメソッドは次のようになります。

public LicensingInfo InitialiseLicense(ILicenseQueryProvider provider)

ただし、この方法でも、インターセプトオブジェクトは単にライブラリに別のプロバイダーを提供できると思います。

それで、そのようなインターフェースの傍受を防ぐ方法はありますか、それともプラグインアセンブリがそれ自体のコード内のライセンスの読み込みなどを完全に担当するようにリファクタリングする必要がありますか?または、おそらく、私が考慮していなかったリファクタリングを行うことができる別の方法はありますか?

4

2 に答える 2

2

壊れにくくすることはできると思いますが、インターフェースを使うことはできません。

これがあなたがすることです:

2 + n個のプロジェクトが必要です。1つはexe用(program.exeと呼びます)、1つはコントラクト用(contracts.dll)、もう1つはn個のプラグイン(plugin.dll)用です。

program.exeには、plugin.dllと同様に、contracts.dllへのハードリファレンスがあります。

それらすべてに強力な名前キーで署名します。http://msdn.microsoft.com/en-us/library/xc31ft41.aspxを参照してください

インターフェイスILicenceQueryProviderの代わりに、contracts.dllに封印されたクラスLicenceQueryProviderを作成します。パブリックコンストラクター、内部コンストラクター、およびオブジェクトを変更するメソッド(構築時に初期化され、不変で、読み取り専用フィールドを使用)がないことを確認してください。

Contracts.dllにInternalsVisibleToAttributeのマークを付け、program.exeに内部コンストラクターへのアクセスを許可します。http://msdn.microsoft.com/en-us/library/System.Runtime.CompilerServices.InternalsVisibleToAttribute.aspxを参照してください

このようにして、program.exeはこのオブジェクトのコンストラクターを呼び出すことができ、plugin.dllはそこから読み取ることができます。

plugin.dllは、強力な名前署名のためにオブジェクトクラスが変更されていないことを「認識」しています。そして、それは封印されているので、真ん中の人は別の実装で代用することはできません。

さて、壊れにくくすることができると言ったことを思い出してください。しかし、それは不可能ではなく、特にマネージコードを使用している場合は決してそうなることはありません。

たとえば、中間者はリフレクションを使用して、内部コンストラクターでオブジェクトをインスタンス化できます。

さらに悪いことに、プラグインには、このオブジェクトから読み取り、ライセンス情報に基づいて決定を下すコードがあります。ハッカーはplugin.dllをILに逆コンパイルし、そのコードを常にすべての権限を付与するコードに置き換えることができます。

難読化は少しだけ役立ちますが、リフレクション攻撃に対しては役立ちません。ネイティブコードを使用すると多少難しくなりますが、ネイティブコードにパッチを適用することもできます。

最終的に、コードはハッカーのマシン上にあり、ハッカーは自分のやりたいことを実行できます。彼はそれをデバッガーで実行し、メモリ内のデータを変更することもできます。これは、すべてのコピー防止およびライセンスメカニズムが直面する問題です。私の意見では、ライセンスはクライアントがソフトウェアを使用するのを難しくし、断固としたハッカーを止めることはありません。あなた(またはあなたの会社)はあなたのクライアントがあなたのソフトウェアを使うのを難しくしたいですか?

これは、解決策がないという意味ではありません。実際には、ハッカーは自分のマシンにないコードを変更することはできません。自分の管理下にあるサーバーでコードを実行します。クライアントアプリは、Webサービスを介してそれにアクセスします。Webサービスはユーザーを認証します(呼び出し元のコードではなく、それは不可能です)。ユーザーを知ることで、サービスはユーザーのライセンスを検証できます。これが唯一の解決策です。

アップデート

明確にするために、このようなサービスは、ライセンスチェックだけでなく、ユーザーにとって価値のある実際のコードを実行する必要があります。後者の場合、ハッカーはクライアントを変更して、単に電話をかけないようにしたり、偽のライセンスサーバーに置き換えたりする可能性があります。ただし、ライセンスは、サービスに存在する実際のロジックを再作成するよりも安価であると想定されています。その場合、ハッカーでさえ、コードを再作成するよりも購入することを好みます。

于 2012-06-12T20:18:51.553 に答える
1

ソフトウェアを保護するための防弾方法はありません。

私たちはかつて、Safenet IncのSentinelハードウェアキー、dotfuscator pro、およびスマートアセンブリを使用して、一部のアプリケーションを保護していました。

ハードウェアキーを使用してライセンスを保存できます(つまり、各機能/プラグインには、ハードウェアキーで有効にして、アプリケーションで照会できる独自のライセンスがあります)。オプションで、それらの製品を使用してアプリケーションを暗号化できます。アプリケーションは暗号化され、メモリ内でのみ復号化され、適切なハードウェアキーがシステムに接続されている場合にのみ開始できます。誰かがデバッガーを使用しにくくするためのアンチデバッグメカニズムがあり、アプリケーションがメモリ内で復号化されるのを待ってからコピーします。

Dotfuscatorとスマートアセンブリを使用すると、アプリケーションのコードを「難読化」して、Reflectorなどのツールを使用した逆コンパイルを困難にすることができます。

ただし、これらのツールはどちらも防弾ではありません。しかし、「達成/盗むのは本当に本当に苦痛」ですか?私はそう言うでしょう、しかしそれは代償を伴います...あなたは確かにこれらのツールでたくさんのお金を投げることができます。

于 2012-06-12T20:27:25.560 に答える