1

ライセンスが 1 年後に期限切れになるアプリケーションを VB.NET (Windows 用) で作成しています。1 年が経過したかどうかを確認するためにユーザーが操作できない日付を使用できますか?

ユーザーがソフトウェアを使用するためにオンラインである必要はありません。そのため、オンライン チェックは有効なオプションではありません。

ありがとう。

4

2 に答える 2

2

NIST (ネットワーク タイム サーバー) を使用しない日付ベースの有効期限は、唯一の代替手段がユーザーが操作できるローカル クロックであるため、不安定です。毎週、または 2 週間に 1 回のように定期的にチェックすると、非常に大きな脆弱性が生じます。これには、アプリが最後のチェックの日付をどこかに書き留める必要があり、ユーザーのマシンでそれを秘密にしておくことはまったく不可能です。

おおよその日付を取得する 1 つの方法は、最後の起動日時から計算することです。

Public Class WMI

    Friend Shared Function GetWMISetting(wmiClass As String, value As String) As String
        Dim retVal As String = ""
        Dim query = String.Format("SELECT {0} FROM {1}", value, wmiClass)

        Using searcher As New System.Management.ManagementObjectSearcher(query)
            For Each item As System.Management.ManagementObject In searcher.Get
                For Each p As System.Management.PropertyData In item.Properties
                    If String.Compare(value, p.Name,
                                      StringComparison.InvariantCultureIgnoreCase) = 0 Then
                        If p.Value IsNot Nothing Then
                            retVal = p.Value.ToString
                        End If
                        Exit For
                    End If
                Next
            Next
        End Using
        Return retVal

    End Function

    Friend Shared Function GetMinSystemDateTime() As DateTime

        Dim lastBoot = WMI.GetWMISetting("Win32_OperatingSystem", "LastBootUpTime")
        Dim uptime = WMI.GetWMISetting("Win32_PerfFormattedData_PerfOS_System", 
                   "SystemUpTime")

        Dim ts As New TimeSpan(0, 0, Convert.ToInt32(uptime))
        Dim MinimumDate = ManagementDateTimeConverter.ToDateTime(lastBoot).Add(ts)

        Return MinimumDate  
    End Function
End Class

LastBootUpは、日付と値からおおよその日付を計算しSystemUpTimeます。後者はTaskManagerの [パフォーマンス] タブで確認できます。日付形式は独特なので、名前空間はコンバーターを提供します。System.Management

「UpTime」には睡眠時間が含まれていないため、返される日付は概算です。それ以外の場合は、おおよその最小日付がわかります。

彼らはおそらくVMを使用してこれを偽装する可能性があり、バッテリーが切れていると完全に間違っている可能性があります.Windowsに時間を設定させないため、PCは永久にオフの日付になります. ライセンスにインストール/発行日 (クライアント PC ではなくホーム オフィスで設定) が含まれている場合、返された日付がインストール日よりも前であるかどうかをテストし、期限切れとして扱うことができます。

次に、トリックはそれらの値を保護するようになります。ライセンス発行時に、ユーザー名、シリアル、インストール日、有効期限をMemoryStreamにシリアライズします。次に、データに対して RSA ハッシュを実行して、非対称署名を作成します。

ライセンス データを base64 文字列と署名ハッシュとして保持し、それをファイルにシリアル化するクラスを作成します。実行時にそれを開き、ライセンス データと秘密鍵を使用して署名を検証します。検証された場合、「ライセンス」部分のデータは有効です。1

最終的には、コードにパッチを当てるだけで済みます。

' from:
IsRegistered = ValidateLicense()
' to:
IsRegistered = (True = True)

アプリを難読化して、その速度を低下させます。

さて、そのようなものがあなたの可能性のあるユーザーベースの80%を妨害すると思うなら、それを選んでください.

このthe user can not manipulate部分は実行可能ではありませんが、ある程度機能するソリューションを作成することはできます。誰を締め出そうとしているか (クラッカー vs スーパー ユーザー vs AOL-LoL) によって、どれだけ広範で洗練されている必要があるかが決まります。

1このようなファイルは、クライアントでは読み取り専用です。署名を無効にせずに書き込むことはできません。また、自殺したアプリに秘密鍵を含めずに更新/変更することはできません。

于 2013-10-03T19:58:31.107 に答える
0

オンラインの時計/サービス/などを見たくない場合、ユーザーはいつでも時間を変更でき、それを防ぐことはできないため、これを行うことはできません。

ただし、2 つの日付を使用して改ざんをチェックできます。1 つは有効期限用、もう 1 つは改ざんのチェック用です。彼らがあなたのアプリをロードするたびに、それは常に > 有効期限 - 1 年である必要があり、彼らが最後にあなたのアプリを起動したときよりも大きくなければなりません. ざっくり言うと、これらの日付を改ざんできないように、これらを暗号化する必要があります。

これにより、ユーザーにとって価値があるよりも面倒になり、最終的にロックアウトされます.1年かかるかもしれませんが、それは起こります.

この問題について考えてみてください。ファイル/レジストリ設定を削除して最初からやり直すことを妨げるものは何ですか. ハードドライブをフォーマットするか、システムの復元を行うのはどうですか。おそらく、仮想 PC やある種のアンドゥ ディスクを使用しているでしょう。これをどのように克服しますか?

于 2013-10-03T19:25:45.737 に答える