Есть ли способ обнаружить, если системные часы были изменены в обратном направлении в Windows? - PullRequest
12 голосов
/ 21 октября 2011

На машине с Windows, есть ли способ узнать, было ли время изменено в обратном направлении, без постоянного отслеживания сообщений WM_TIMECHANGE?

Например, я хотел бы сделать первое, что мое приложение делает при запуске, это посмотреть, не изменилось ли время назад с момента последнего запуска приложения.

Насколько я могу судить, единственный способ увидеть изменение - это посмотреть сообщение WM_TIMECHANGE, но я увижу это только в том случае, если мое приложение работает.

Ответы [ 4 ]

19 голосов
/ 21 октября 2011

Да. Вы можете прочитать Журналы событий Windows и посмотреть изменения системного времени. (Изменения системного времени являются одним из системных событий, которые автоматически регистрируются.) Например, я просто подстроил системное время на несколько секунд, и в журнале системных событий появилось следующее:

Информация 21.10.2011 11:16:26 Генерал ядра 1 Нет

Системное время изменилось на 2011 - 10 - 21T16: 16: 26.000000000Z с 2011 года - 10 - 21T16: 16: 26.000000000Z.

Вы можете использовать Win32 API, чтобы получить доступ к журналам событий , а затем запросить эти события, чтобы определить, действительно ли время было изменено. Что хорошо в этом решении, так это то, что оно встроено и всегда работает. Нет необходимости отслеживать события через пользовательский сервис и т. Д. Вы просто запрашиваете данные ОС.

Это по-прежнему не является пуленепробиваемым решением , поскольку люди с правами администратора могут изменять настройки, очищать журналы и т. Д. Но вы определенно хотите защитить свое приложение от непрофессионала. Системные журналы событий - это не то, о чем думают обычные пользователи 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>
3 голосов
/ 21 октября 2011

Нет, вы не можете. Вот почему чувствительные ко времени схемы DRM в целом довольно бесполезны.

Вы можете попытаться обойти это с помощью службы, а затем вам придется обходить время простоя службы с помощью другого хака и еще одного хака в дополнение к этому.

В любом случае, если это все, что вы пытаетесь сделать, просто сохраните где-нибудь (возможно зашифрованное) значение системного времени при завершении работы вашей программы, а затем убедитесь, что оно не было передано при запуске программы должно хватит. Это не остановит пользователей, которые в основном «заморозили» время от выключения до запуска, но этого будет достаточно для 9/10 людей, пытающихся пройти вашу временную пробную версию.

2 голосов
/ 10 ноября 2011

Идея вышеизложенная (хотя я отмечаю, что проверка по отношению к внешним часам является окончательным ответом, если это возможно) - вы также можете периодически читать системные часы и сохранять их, возможно, зашифрованные, в скрытом файле где-то. Каждый раз, когда вы делаете это, вы проверяете, чтобы убедиться, что новое значение более новое, чем значение в файле. Триггер для этого может быть при каждом запуске и т. Д.

Как и все внутренние методы, этот уязвим для того, чтобы кто-то выяснил скрытый файл. Таким образом, вы также можете отметить проблему, если скрытый файл отсутствует или если его отметка даты не соответствует его содержимому.

2 голосов
/ 21 октября 2011

Ваше приложение может (пока оно работает) периодически сравнивать системное время с временем, полученным с какого-либо ресурса сервера.Если вы вдруг увидите, что разница между системным временем и временем сервера увеличилась, это означает, что системное время было установлено назад.

Очевидно, что это не будет работать на машине без доступа в Интернет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...