Есть ли способ определить, были ли системные часы изменены в окнах?
На компьютере с Windows, есть ли способ узнать, было ли время изменено назад без постоянного контроля за сообщениями WM_TIMECHANGE?
Например, я хотел бы сделать первое, что делает мое приложение при запуске, - увидеть, изменилось ли время с момента последнего запуска приложения.
Насколько я могу судить, единственный способ увидеть изменение - посмотреть сообщение WM_TIMECHANGE, но я только увижу, что если мое приложение запущено.
Ответы
Ответ 1
Да. Вы можете прочитать Журналы событий Windows и искать изменения в системном времени. (Системные изменения времени - это одно из системных событий, которые автоматически регистрируются.) Например, я просто изменил свое системное время на несколько секунд, и в журнале системных событий появилось следующее:
Информация 10/21/2011 11:16:26 AM Kernel-General 1 None
Системное время изменилось до 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>
Ответ 2
Нет, вы не можете. Именно поэтому чувствительные по времени схемы DRM в целом бесполезны.
Вы можете попытаться обойти это с помощью службы, а затем вам придется обойти время простоя службы, используя другой взлом, а также еще один взломать его.
В любом случае, если это все, что вы пытаетесь сделать, просто сохраняя где-то (зашифрованное, возможно) значение системного времени при выключении вашей программы, то убедиться, что он не был передан при запуске программы, должно быть достаточно. Это не остановит пользователей, которые в основном "заморозили" время от остановки до запуска, но этого будет достаточно для 9/10 людей, пытающихся пройти мимо вашего времени.
Ответ 3
Возможно, ваше приложение (в то время как оно выполняется) периодически сравнивает системное время с временем, выбранным из ресурса сервера. Если вы вдруг увидите, что разница между системным временем и временем сервера увеличилась, это означает, что системное время было восстановлено.
Очевидно, что это не сработает на машине без доступа в Интернет.
Ответ 4
Одна идея для этого выше (хотя я отмечаю, что проверка на внешние часы - это окончательный ответ, если это возможно) - вы также можете периодически читать системные часы и хранить их, возможно, зашифрованные, в каком-то скрытом файле. Каждый раз, когда вы делаете это, вы проверяете, чтобы новое значение было более новым, чем новое в файле. Триггер для этого может быть при каждом запуске и т.д.
Как и все внутренние методы, этот уязвим для кого-то, кто выясняет скрытый файл. Таким образом, вы можете указать проблему, если скрытый файл отсутствует, или если его штамп даты не соответствует его содержимому.