Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > C/C++: Системное программирование и WinAPI > Как определить, что системное время перевели назад?


Автор: Vladimir_ 03.05.16, 11:26
Простенькая программа, без инсталяшки, должна после определенной даты, хранящейся в программе, перестать запускаться.
Но вот есть проблема: как можно отследить, что пользователь перевел время/дату назад?
Реестр можно подправить, файлы программы можно заново скопировать...
Думал при старте определять время последнего доступа в каталоги "Program Files" и Windows, и брать самое позднее время/дату,
но ведь после запуска система исправит на время, установленное пользователем.
Сканировать каталог и смотреть время у каждого файла - во-первых это долго, во-вторых, если старенький винт, то грохот будет...
А сканировать определенное число файлов, так можно не попасть на самый свежий...

Как быть?

Автор: JoeUser 03.05.16, 12:41
Самый надежный вариант, при наличии инета, это - NTP, опрос серверов времени.

Добавлено
Если без инета, то "осмотр" некоторого множества, скажем так, "ключевых" файлов и времен их создания/доступа:
%SYSTEMDRIVE%\hiberfil.sys
%USERPROFILE%\NTUSER.DAT
%USERPROFILE%\NTUSER.DAT{*}
%USERPROFILE%\Local Settings\History\History.IE5\*
%USERPROFILE%\AppData\Roaming\Mozilla\Firefox\Profiles\*
...
...
...
Ну и в таком духе ... Ну и ждать кряка программы, если программа норм - быстро ее вылечат.

Автор: Vladimir_ 03.05.16, 13:10
Спасибо!
Тут не только без интернета, да еще на некоторых ПК стоит Windows 98!
А что в ней схожего есть?

Автор: B.V. 03.05.16, 13:13
Цитата Vladimir_ @
должна после определенной даты, хранящейся в программе, перестать запускаться.

Предлагаю заменить дату на количество запусков.

Автор: JoeUser 03.05.16, 13:27
Цитата B.V. @
Предлагаю заменить дату на количество запусков.

Это самое простое - что обходится, даже без кряков. Монитор реестра + Файловый монитор + контроль операций удаления, создания и записи (чтение не интересует). Пишется loader который приводит все в первозданное состояние. ИМХО, нужно читать даты тех файлов, которые пишет не эта программа, а системные, временные, кэши разные.

Автор: Vladimir_ 03.05.16, 13:46
Цитата B.V. @

Тут дата нужна

Автор: B.V. 03.05.16, 15:12
Цитата JoeUser @
Это самое простое - что обходится, даже без кряков.

То, что ты описал далее, на самом деле и является "кряком". А насчет "простое" -- это проще, чем поменять системную дату?

Автор: JoeUser 03.05.16, 15:23
Цитата B.V. @
То, что ты описал далее, на самом деле и является "кряком"

Ну да, я имел ввиду - патчи.

Цитата B.V. @
А насчет "простое" -- это проще, чем поменять системную дату?

В том то и дело, если ловить действия программы по файлам и реестру, то:

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

В итоге, "счетчик" я бы обошел легче.

Автор: Vladimir_ 03.05.16, 15:56
Тут надо найти какие-то хитрые файлы, которые после смены даты/времени не сразу меняют свою дату/время - а то как отследить, если система после перезагрузки сразу изменит?

Автор: Gonarh 03.05.16, 17:16
В чистом виде никак, имхо проще сделать триал, с реально вырезанным функционалом, а не просто заблоченным по какому либо критерию.

Автор: Vladimir_ 03.05.16, 17:37
Да у меня простенькая программа, нужно так же просто ограничить время работы с отслеживанием перевода даты назад. И ломать смысла нет

Автор: ЫукпШ 03.05.16, 19:25
Цитата JoeUser @
Самый надежный вариант, при наличии инета, это - NTP, опрос серверов времени.

При реализации этой задачи возможны интересные препятствия.
Указанный формат не соответствует правильному, хотя эта
информация из RFC.
Впрочем, Wireshark декодирует и покажет всё как надо.
---
Удивительно, уже не первый раз сталкиваюсь.
Читаешь RFC, а потом оказывается, что "не соответствует".

Автор: JoeUser 03.05.16, 20:20
Цитата Vladimir_ @
Тут надо найти какие-то хитрые файлы, которые после смены даты/времени не сразу меняют свою дату/время - а то как отследить, если система после перезагрузки сразу изменит?

"Против лома - нет приема!" :lol: Совет простой - не зацикливайся на 100%-ном отказе работы по лимиту календаря. Напиши шрифтом стопицотого размера, что "программа по истечении времени и без регистрации будет нестабильна на 77%". Нарушения ищи по файлам, на которые я тебе дал наколку, молча выгружай прогу спустя 3-17 мин, как- только обнаружен ахтунг. Для энд-юзера это гемор аццкий и уверенный аргумент достать лопатник и отслюнявить лавэ :lol:

Автор: Vladimir_ 04.05.16, 05:03
В общем поигрался с переводом времени и перезагрузкой винды.
Пока нашел какие файлы искать, которые после перезагрузки не меняют свои дату/время:
C:\Windows\*.ini
TEMP\*.*
Добавлю еще время каталогов C:\Windows, С:\RECYCLER и самой программы.
Думаю, что этого для такой проги будет достаточно.

И еще попутные вопросы:
1. чем быстрее получить время создания/модификации ОДНОГО каталога или файла? Ведь он может быть не доступен. Для поиска по маске пользуюсь FindFirstFile()
2. поиск файлов засуну в поток, стартанув его при старте проги. Допустим было найдено, что время перевели. Как более-менее правдоподобно аварийно завершить программу? Т.е. чтобы было видно, что это не защита сработала, а ошибка в проге?

Автор: JoeUser 04.05.16, 06:27
Цитата Vladimir_ @
И еще попутные вопросы:
1. чем быстрее получить время создания/модификации ОДНОГО каталога или файла? Ведь он может быть не доступен. Для поиска по маске пользуюсь FindFirstFile()

Быстрее API не найдешь.

Цитата Vladimir_ @

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

Самое, имхо, правильное - сообщать не сразу по факту обнаружения, а спустя 7-27 минут. Это усложнит реверс.

Автор: ЫукпШ 04.05.16, 08:49
Цитата Vladimir_ @
Как более-менее правдоподобно аварийно завершить программу? Т.е. чтобы было видно, что это не защита сработала, а ошибка в проге?

Например, вообще ничего не сообщать и не завершать.
Просто с какого-то момента ограничить функционал.
Не выполнять какие-то функции и всё.

Автор: Prince 04.05.16, 17:15
Цитата
Как более-менее правдоподобно аварийно завершить программу? Т.е. чтобы было видно, что это не защита сработала, а ошибка в проге?

"Точка входа в процедуру в библиотеке kernel32.dll не найдена" :whistle:

У меня вопрос: - какой смысл НЕ сообщать пользователю о том, что период триала простенькой программы закончился?

Автор: Славян 04.05.16, 17:37
Цитата Prince @
какой смысл НЕ сообщать пользователю о том, что период триала простенькой программы закончился?
Очевидно, чтобы пользователь не захотел рыться в поисках взлома программы, а обдумал свои действия и наверняка увидел, что период закончился. Если же не увидит, то может сообщить издателю, а тогда автор прожки намекнёт, что "срок то вышел, поди? :whistle: ".

Автор: Prince 04.05.16, 18:53
Пожалуй, я бы подумал, что автор программы очень странный и лучше с ним не связываться. Куплю лицензию, вылезет какая-то ошибка, и поди знай, намек ли это автора на что-либо, или глюк программы...

Автор: Qraizer 04.05.16, 20:37
Ограничивать функционал непродуктивно, найти под дебагером точку ветвления несложно. Однако простое отсрочивание решения куда сильнее напрягает хацкеров. Сделать несколько прокси-объектов, передающий некое состояние друг другу с произвольной задержкой каждый (особенно если состояние не банальный bool, а какое-нибудь DWORD, а ещё лучше HANDLE от GlobalAlloc(), хранящий экземпляр полиморфного класса, чем метод будет PostMessage()ить этот признак каким-нибудь WM_COPYDATA), явно на порядок проще в реализации, чем во взломе. Только главное, как абсолютно верно заметил Prince, ничего не портить. Выдать транспарант, сохранить состояние и выйти – самое то. Пусть запускает повторно, открывает документы итп заново, если ему нравится такой рабочий процесс.

Автор: ЫукпШ 05.05.16, 08:50
Цитата Qraizer @
Ограничивать функционал непродуктивно, найти под дебагером точку ветвления несложно.

Найти не сложно, если такая точка вообще есть.
Можно ограничить функционал (в dll, например) как посредством физической
редакции исполнимого файла, так и полной заменой полноценной dll
на демо-версию.
Те полноценное приложение вообще может отсутствовать.
.. И пусть тогда заново скачивает, устанавливает..
"запускает повторно, открывает документы итп заново, если ему нравится такой рабочий процесс". ©

Автор: ^D^ima 05.05.16, 11:09
Vladimir_
Можно поставить диапазон дат в которые прога запускается(или минимальную дату) 05.05.2016-07.09.2016. Если умельцы мотают дату, как правило сразу несколько лет.

Автор: JoeUser 05.05.16, 11:55
Цитата ^D^ima @
Можно поставить диапазон дат в которые прога запускается(или минимальную дату) 05.05.2016-07.09.2016. Если умельцы мотают дату, как правило сразу несколько лет.

Не не не :lol: Мотают на дату первого запуска.

Vladimir_, а в чем суть программы, что она делает?

Автор: B.V. 05.05.16, 12:54
Все советчики в этой теме забывают главное: не ломаемой защиты не существует. Весь вопрос в целесообразности взлома, а целесообразность зависит от востребованности. Если программа простая и не пользуется особой популярностью, смысла усложнять защиту никакого нет.

Сообщения были разделены в тему "Обсуждение методов защиты ПО"

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)