2011-10-21 28 views
12

Windowsマシンでは、WM_TIMECHANGEメッセージを継続的に監視せずに時間が逆方向に変更されているかどうかを調べる方法はありますか?Windowsでシステムクロックが逆方向に変更されたかどうかを検出する方法はありますか?

たとえば、アプリケーションを最後に実行してから時間が変更された場合、起動時にアプリケーションが最初に行うことを確認します。

私が知る限り、変更を見る唯一の方法はWM_TIMECHANGEメッセージを見ることですが、アプリケーションが動作している場合にのみ表示されます。

+0

[Windowsでクロックを変更する人のためのAPIイベントはありますか?](http://stackoverflow.com/questions/756506/is-there-an-api-event-for-when-person-変更 - 時計 - オン - ウィンドウ) –

+1

これを行う方法があれば、私は非常に、非常に驚​​くだろう。また、それは欺瞞ではありません(質問には "WM_TIMECHANGE"がないと明記されています)。 – Jon

+2

私はそれが事実の後に変化を検出する方法があるかどうかを見つけるために探しているので、重複しているとは思わない。その他の質問は、発生したときに変更を検出することです。 –

答えて

17

はい。 Windows Event Logsを読んで、システム時刻の変更を調べることができます。たとえば、私はちょうど私のシステム時刻を数秒間微調整し、システムイベントログに次のように表示されます。

情報10/21/2011 11:16:26 AMカーネル全般1なし

システム時間が2011 - 10 - 21T16に変更されました:16:26.000000000Z 2011 - 10 - 21T16: 16:26.000000000Z。

use the Win32 API to get access to the event logsこれらのイベントを照会して、時間が実際に変更されたかどうかを確認できます。このソリューションの素晴らしい点は、組み込みで常に実行されていることです。カスタムサービスなどを介してイベントを監視する必要はありません。OSのデータを照会するだけです。

管理者権限を持つ人が設定やクリアログなどを行うことができるため、これはまだ防弾対策ではありませんしかし、あなたは間違いなくあなたのアプリを偽造するでしょう。システムイベントログは、通常のWindowsユーザーが考えるものではありません。

その特定のイベントのためのXML:(プライバシー&セキュリティのための匿名化)

<Event xmlns="http://schemas.microsoft.com/win/2004/08/events/event"> 
    <System> 
    <Provider Name="Microsoft-Windows-Kernel-General" 
     Guid="{xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}" /> 
    <EventID>1</EventID> 
    <Version>0</Version> 
    <Level>4</Level> 
    <Task>0</Task> 
    <Opcode>0</Opcode> 
    <Keywords>0x8000000000000010</Keywords> 
    <TimeCreated SystemTime="2011-10-21T16:16:26.001000000Z" /> 
    <EventRecordID>138478</EventRecordID> 
    <Correlation /> 
    <Execution ProcessID="40044" ThreadID="50016" /> 
    <Channel>System</Channel> 
    <Computer>xxxxx.xxxxxxxxx.org</Computer> 
    <Security UserID="xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx" /> 
    </System> 
    <EventData> 
    <Data Name="NewTime">2011-10-21T16:16:26.000000000Z</Data> 
    <Data Name="OldTime">2011-10-21T16:16:26.000000000Z</Data> 
    </EventData> 
    </Event> 
+0

これは正しい答えだと思います。私はちょうど私のログをチェックして、いくつかの時間の変化を見ることができます。私は小さなユーティリティを書いて、変更を検索してダンプします。助けてくれてありがとう。 –

+0

しかし、これらのイベントは削除することができるので、それでも情報の信頼できる情報源ではありません。 –

+0

エレガントなソリューションであるPaulも、これは標準的な情報源ではなく、依拠してはならないと私は依然として考えています。時間が変更されたかどうかを実際に判断する方法はありません。上記のa_horseのように、これらのイベントは削除できますが、同じマシン上の別のOSやBIOS自体から時刻を変更すると、これらのイベントを完全にバイパスすることもできます。 –

3

いいえ、できません。そのため、時間に敏感なDRMスキームは一般的にむしろ無駄です。

サービスを使用してその問題を回避しようとすると、別のハッキングともう1つのハッキングを使用してサービスのダウンタイムを回避する必要があります。それはあなたが、単にどこかに保存やろうとしているすべてだ場合

とにかく、それはプログラムの起動時に渡されていないことを確認して、あなたのプログラムのシャットダウン時にシステム時刻の値を(おそらく、暗号化された)べき足ります。それは基本的にシャットダウンからスタートアップまでの時間を「凍結」するユーザーを停止させることはありませんが、あなたのタイムド・トライアルを乗り越えようとしている人々の9/10には十分です。

+0

+1良い考え。 –

+0

タイムゾーンの変更または日付ラインを越えるユーザーを考慮してください。 – peterchen

2

(それが実行されていることを起こるながら)あなたは定期的にからフェッチ時間とシステム時間を比較し、あなたのアプリを持っている可能性がありどこかのサーバーリソース。システム時刻とサーバー時刻の差が急増したことが突然表示された場合は、システム時刻が戻ってきたことを意味します。

明らかに、これはインターネットにアクセスできないマシンでは機能しません。

2

可能性がある場合は、外部クロックをチェックすることが決定的な答えです) - 定期的にシステムクロックを読み取り、おそらく暗号化されたファイルをどこかの隠しファイルに保存することもできます。これを行うたびに、新しい値がファイル内の値よりも新しいことを確認します。これを行うためのトリガは、スタートアップ時などに行うことができます。

すべての内部メソッドと同様に、このメソッドは隠しファイルを見つけ出す人にとって脆弱です。したがって、隠しファイルがない場合、または日付スタンプがその内容と一致しない場合には、問題にフラグを立てることもできます。

+0

あなたの投稿に署名しないでください。あなたの回答が、あなたが所属する製品、会社、またはWebサイトを宣伝しない限り、開示を含める必要もありません。 –

関連する問題