Подтвердить что ты не робот

Есть ли способ определить, были ли системные часы изменены в окнах?

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

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

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

4b9b3361

Ответ 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

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

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