.NET実行可能ファイルを特定のマシンに制限して、そのマシンでのみ実行できるようにすることは可能ですか。
8 に答える
はい、私は自分のアプリでそれを行います。それは素晴らしく機能します。
WMIを使用すると、システム情報(CPUID、MacID、HDDの詳細)を簡単に取得できます(強くお勧めします)。
私は(あなたがプロのハッカーでない限り)実質的に絶対確実なシステムを作成しました。
私のアプリがユーザーのPCに初めてインストールされると、Webサービスを使用してサーバーに戻ります。彼らはパスワードハッシュを使用して自分自身を識別し、クライアントの認証コード/注文IDを探します。
クライアントが正しい認証コードを持っている場合、アプリケーションはシステムの詳細を暗号化してクライアントのコンピューターに保存し、情報のハッシュをサーバーに送信して保存します。次に、いくつかのハッシュフラグを使用してクライアントのコンピューターでソフトウェアがアクティブ化され、アプリが実行されるたびに、システム情報がファイル内のハッシュ情報と比較されます。
クライアントがコンピューターを再フォーマットする場合、必要なのは、ソフトウェアを自動的に再度アクティブ化するための注文IDだけです(プログラムがサーバーに確認するときに、システムの詳細が検証され、一致する場合は承認されます)。クライアントがソフトウェアを別のマシンにインストールする場合は、サポートチームに連絡して承認を得る必要があります。
-すべての情報は暗号化およびハッシュ化されます(二重暗号化)。-すべてのコードは難読化されてパックされています。
現在、かなり安全に機能しています。
そうです、それは可能です。フィールドテストが行われ、他の保護システムと同様に機能することが確認されています。
プロセッサIDを使用して毎回確認することはできません(?)
これは私がしばらく前に書いたサンプルコードです。
Imports System.Management
Public Class Form1
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
'Declare following three object variables
Dim objMOS As ManagementObjectSearcher
Dim objMOC As Management.ManagementObjectCollection
Dim objMO As Management.ManagementObject
'Now, execute the query to get the results
objMOS = New ManagementObjectSearcher("Select * From Win32_Processor")
objMOC = objMOS.Get
'Finally, get the CPU's id.
For Each objMO In objMOC
MessageBox.Show("CPU ID = " & objMO("ProcessorID"))
Next
'Dispose object variables
objMOS.Dispose()
objMOS = Nothing
objMO.Dispose()
objMO = Nothing
End Sub
End Class
マシンにNICがあると仮定すると、MACアドレスを使用できます。
箱から出して-いいえ。
インストール中にマシン署名を生成してみて、署名ファイルが存在しないか、この特定のマシンで無効な場合にアプリケーションが起動しないようにロックすることができます。
.NETは、一般的に利用可能なツールを使用してソースコードに戻すのが非常に簡単であるため、ひどいものです。(約2分で.NETをクラックするデモを行います)。Cyrilのソリューションは、ターゲットマシンに対して暗号化と指紋のハッシュを使用しているため、良さそうです。残念ながら、これらのソリューションは、ある種の中間者攻撃に対して脆弱ですが、彼のソリューションはほとんどのソリューションよりも優れています。マシンバインディングの問題の1つは、使用するフィンガープリントトークン(MACアドレス、CPUシリアル番号など)をOS呼び出しで取得する必要があることです。これは、中間レベルのクラッカーによってスプーフィングされる可能性があります。
CodeMeter、Hasp HL、KeyLokなどの優れたドングルを使用するソフトウェアの$値に応じて、重要な保護が提供されます。ただし、「悪い」ドングルを使用しても少しは役に立ちません。
このためには、マシンのMAC ID、HDD ID、CPUIDなどから生成されたある種のマシンコードを使用してライセンスコードを埋め込む必要があります。
次に、この埋め込みコードを、ソフトウェアの実行時に生成されたマシンコードで確認します。これらが一致しない場合は、ソフトウェアが別のマシンで使用されていることを意味します。
このシナリオをサポートする既製のライセンススキームが必要な場合は、CryptoLicensingを参照してください。
EXEにデジタル署名し、証明書を使用して何らかの保護を支援することもできますが、EXEが特定のPCで実行されないようにする場合は、ユーザーにパスワードの入力とキーファイルの使用を求める方がよいでしょうか。
.NET暗号化の 例http://aspnet.4guysfromrolla.com/articles/112002-1.aspxhttp://www.eggheadcafe.com/articles/20020630.asp
このシナリオをサポートする既製のライセンススキームが必要な場合は、CryptoLicensingを参照してください。
これは実際には真実ではありません。CryptoLicensingはコンピューター名のみを使用し、CPUIDは使用しません。