- ベストアンサー
DLLで期限付きライセンス
こんにちは。 WinXP,SDKで開発しています。 DLLで期限付きライセンスを作成しようと思っています。 こちらで指定した日付を超えたらこのDLLをリンクするアプリケーションが使えなくなるようにしたいです。 どのような作りが良いのでしょうか? よく、30日限定だったり、12月31日までだったりする期限付きの試用版プログラムを見ますが、パソコンの日にちを修正してしまえばまた使えたりするのもあると思います。 相当そのあたりに精通した使用者であればもう諦めるしかないのかもしれませんが、ある程度不正を防ぐ事が出来るとしたら、どのような作りが良いのかアドバイスを頂きたいと思います。 宜しくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
0.インストーラーを使用しないと、使えないようにする。単にDLLファイルをフォルダにコピーしても動作しない。 1.インストーラーでの処理インストール処理は以下のようにする。 (1)インストーラーが「まだインストールされてない」と判断した場合に限り、インストーラーの中で、レジストリの「HKEY_LOCAL_MACHINE\Software\社名\ソフト名\」の下に「暗号化したインストール日付」と、同じ値で「暗号化した前回起動日時」も書き込む。 インストール済みと判断した場合は「アンインストールか修復インストール(上書きインストール)」を選ばせ、アンインストールか修復インストールを行う。 (2)暗号化は「暗号化済みデータが日付の大小に比例しない」ようにして、かつ、チェックコードを入れて、データの改変を検知出来るようにする。 これにより「レジストリの改変」に対応できる。 (3)上記(1)で書き込むレジストリ値は「アンインストールしても消えない」ようにしておく(インストーラーの「アンインストール時に自動的に消去するレジストリ値」に含めない) (4)インストール時に、既に「暗号化したインストール日付」か「暗号化した前回起動日時」がレジストリに存在した場合は、書き替えたりせず、そのままにする。 上記(3)(4)により「アンインストールして、再インストール」をしても「最初の1回目のインストール日」だけが保持されたままになる。 但し「システムの復元」を行って「レジストリをインストール前に戻された場合」には対処出来ない。 2.プログラムが起動されたら、レジストリを見て「正式登録」されている(有料ソフトの支払いが済んでいる)場合は、以下3~4のチェックはせず、フルに使用出来るようにする。 3.レジストリを見て「未登録」と判断した場合は、レジストリから「暗号化したインストール日付」と「暗号化した前回起動日時」を読み込む。 4.上記3の後、以下(1)~(8)のような場合には「期限切れ」として扱う。 (1)レジストリから読み込んだ暗号化日付データが、チェックコードエラーなどで復号化出来ない。 (2)レジストリから、片方または両方が読み取れなかった、または、片方または両方が消されていて読み取れなかった。 (3)「PCの時計の現在日時」が「インストール日付」よりも前だった。 (4)「PCの時計の現在日時」が「インストール日付」よりも後だが、使用期限を越えていた。 (5)「PCの時計の現在日時」が「前回起動時日付」よりも前だった。 (6)「前回起動時日付」が「インストール日付」よりも前だった。 (7)「前回起動時日付」が「インストール日付」よりも後だが、使用期限を越えていた。 (8)自分自身のファイルのCRCチェック値を計算し、自分自身の中に埋め込んである値と一致しなかった時。 5.上記4のすべてにパスして「試用期間内」と判定した場合は、「前回起動時日付」の値を「現在日時」で更新する。4のチェックで引っ掛かった場合は、レジストリは更新しない。
その他の回答 (3)
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
追記の追記。 「日付の暗号化」と「日付の復号化」には「Windows本体のプロダクトIDなど、Windows1つ1つ固有の値」を使って計算を行って、別のPCにレジストリをコピペして持って来ても動かないようにした方が良いでしょう。 また、暗号化の際には「乱数で作った無意味なデータを、ビット単位で有効データの間に挟む」などの処理をして、データ全体が一様に変化するようにしましょう。そうしないと「年月日の『日』が変わったら、データのここが変化したから、この部分が『日』だな」など、暗号解読されやすくなってしまいます。
お礼
最初の回答をじっくり読みお礼させて頂いている間に、更にアドバイスありがとうございます! どのアドバイスもとてもありがたいです。 多分…いえ絶対自分では気付きませんでした。 感謝です!
- chie65536(@chie65535)
- ベストアンサー率44% (8742/19841)
追記。 >2.プログラムが起動されたら、レジストリを見て DLLの場合、期限切れを検知したら、DLLの初期化ルーチンで「初期化失敗」を返すようにして下さい。 「初期化失敗」を返すと、ロードされたDLLはアンロードされ、DLLの呼び出し元には「ERROR_DLL_INIT_FAILED」が返されます。
- redfox63
- ベストアンサー率71% (1325/1856)
レジストリやINIファイルに自分が起動された日付を記憶しておくといった手法でしょう DllMainでfdwReasonが DLL_PROCESS_ATTACHの場合に 前回起動された日付を取得(レジストリ/INIファイル) 記憶された日付より現在の日付が古くかったらFALSEを返す 規定の日付以前なら記憶先の更新をする といった具合で これでもIniファイルやレジストリーキーを削除されてしまえば再使用されてしまいそうですが ...
お礼
redfox63さま、アドバイスありがとうございます! INIファイルなどはすぐにバレそうなイメージがありますが、これをダミーに使うという手?もありそうですね。 fdwReasonの値の事などもよく分かっていなかったので助かります。 ありがとうございました!
お礼
chie65535さま、ありがとうございます。 有名なソフトなどはこのような作りになっているのでしょうか? 私には分かっているようでいて、考えられなかった内容です。 細かくアドバイス頂いて、とても参考になりました。 これから利用させて頂く事になりそうです。 ありがとうございました。