別件で連続投稿になりますが、よろしくお願いします。
VS2005でMFCを使って作成しています。
現在、試用期間を設定した日数制限の処理を作ろうと思っています。
自分が考えたやり方としては
1)初回起動した時の日付をファイルに書き込む。
※ファイル内は暗号化します。
2)次回起動時に、ファイル内の日付から経過日数を求める。
3)経過日数が試用期間を超えていたら、プログラムを強制終了
この方法でいこうと思ったのですが、この方法では2回目以降の起動で
起動時の日付を取得した場合、パソコンの日付を初回起動時の日付に
設定されると無制限に起動できてしまいます。
その他、色々考えても結局、現在の日付を取得しないと処理できないという
考え方にぶつかってしまいます。
しかし、既存のソフトではパソコンの日付を変えても、制限日数外なら
起動できないようになっています。
このような仕組みを追加するには、どのようにしたら良いのでしょうか?
よろしくお願いします。
まあよくあるプロテクトの話ですね。色々ありますが、
・日付ではなく「起動時間の合計」で判断する。
・ウィルスのようにこっそり別プログラムを動かしておき、パソコンの日付が変更されてないかチェックする。
・外部のPCへ日付を取得しにいく(ntpサーバとか)
ちなみにスタンドアローンのPCで「日付による制限」を完璧に実施するのは不可能なはずです。BIOSやOSレベルから改造するか、ドングルのようなハードに頼るなら可能かもしれませんが、少なくともアプリレベルでは無理でしょう。
おっとさん、回答ありがとうございます。
やはり、スタンドアローンで日付による制限は不可能なんですか
では一体他の良く見るソフトでは、どうやって処理しているのか
気になります。
検索しても、サンプルとか処理方法を紹介しているサイトが
見つからなかったのですが、これからもう少しだけ調べてみたいと
思います。
>どうやって処理しているのか気になります。
いえ、やっぱり不可能です(笑)。
えーと、もうちょっと詳しく書くと、例えば最近の例ではVISTA(OS)の日付制限なんかも海外では2,3日で突破されていました(詳しくは書きませんが)。最新のOSでさえ不可能なのに、アプリレベルではどうやっても無理です。
考えられるのはユーザーに内緒でウィルスのように動いているか、外部サーバへ問い合わせているかです。前者はrookit的で非常に悪質なアプリだと思われ、後者はネット接続がないと無効になるか、起動させないかになりますので限界があります。
結局「起動時間の合計」で判断するのが無難で、ほとんどのシェアウェアなどはこの方式のはずです。
補足ですが、そのアプリは本当に日付で判断してますか?例えば「あと30日使用できます」と出ていても、2日に1日しか起動しないと60日使用できる場合は「起動時間の合計」で判断していますよ。
すいません、自分の書き方が悪かったです。
日付で見てるとかそういうことではなく、ある期間が過ぎたら
動かなくするソフトって結構ありますよね?
その期間の判定をどうやっているのか知りたかったのです。
(それが日付で無理なら、一体どうやって・・・みたいな感じです)
起動時間の合計も魅力的な方法ですが、もっとしっかり日付で見ている
ような気がしたんで。
っで、自分で考えてみたんですが
日付と起動カウンターを保存しておいて、保存されている日付と起動した時の
日付が違っていたらカウンターを-1する。
もしカウンターが0なら起動不可にする。
こうやっておけば、過去に日付を戻してもただ単にカウンターが-1されるだけで
問題なし。
1日に何回も日付を変えるとその分、早くカウンターが0になるけど
それは使い方が悪いと言うことで。
結構良い案だと思っていますが、まだ時間があるんで、もうちょっと考えてみます。
ああ、なるほど、そういうことですか。
ちなみにユーザーから見て一番いいのは単に「起動時間の合計」で判断する方法です。毎日起動するユーザーも、週に1回しか起動しないユーザーも平等に同じ時間試用できますから。「日付」で判断するのはむしろそこらへんが不平等です。
その上で次善の策として「日付」と「起動時間の合計」の両方を保存するパターンです。つまり「30日もしくは720時間まで試用できます」というパターンです。
このパターンだと不正しないユーザーは30日利用できますし、日付変更等の不正をするユーザーも30日(720時間)しか利用できません。またこのパターンを適用した上で、あえて「720時間」の方をマニュアル等に記述しなければ、ユーザーからは単に「30日」に見えますので、分かりやすいと思います。
他にこれと言った案も浮かばなく、色々考えた結果
おっとさんの言うとおり、起動時間の合計でチェックしたいと思います。
長い時間、付き合って下さってありがとうございました。
ツイート | ![]() |