Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.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 |
Предлагаю заменить дату на количество запусков. |
Автор: JoeUser 03.05.16, 13:27 |
Это самое простое - что обходится, даже без кряков. Монитор реестра + Файловый монитор + контроль операций удаления, создания и записи (чтение не интересует). Пишется loader который приводит все в первозданное состояние. ИМХО, нужно читать даты тех файлов, которые пишет не эта программа, а системные, временные, кэши разные. |
Автор: Vladimir_ 03.05.16, 13:46 |
Цитата B.V. @ Тут дата нужна |
Автор: B.V. 03.05.16, 15:12 |
То, что ты описал далее, на самом деле и является "кряком". А насчет "простое" -- это проще, чем поменять системную дату? |
Автор: JoeUser 03.05.16, 15:23 |
Ну да, я имел ввиду - патчи. В том то и дело, если ловить действия программы по файлам и реестру, то: 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 |
При реализации этой задачи возможны интересные препятствия. Указанный формат не соответствует правильному, хотя эта информация из RFC. Впрочем, Wireshark декодирует и покажет всё как надо. --- Удивительно, уже не первый раз сталкиваюсь. Читаешь RFC, а потом оказывается, что "не соответствует". |
Автор: JoeUser 03.05.16, 20:20 |
Цитата Vladimir_ @ Тут надо найти какие-то хитрые файлы, которые после смены даты/времени не сразу меняют свою дату/время - а то как отследить, если система после перезагрузки сразу изменит? "Против лома - нет приема!" Совет простой - не зацикливайся на 100%-ном отказе работы по лимиту календаря. Напиши шрифтом стопицотого размера, что "программа по истечении времени и без регистрации будет нестабильна на 77%". Нарушения ищи по файлам, на которые я тебе дал наколку, молча выгружай прогу спустя 3-17 мин, как- только обнаружен ахтунг. Для энд-юзера это гемор аццкий и уверенный аргумент достать лопатник и отслюнявить лавэ |
Автор: 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 не найдена" У меня вопрос: - какой смысл НЕ сообщать пользователю о том, что период триала простенькой программы закончился? |
Автор: Славян 04.05.16, 17:37 |
Цитата Prince @ Очевидно, чтобы пользователь не захотел рыться в поисках взлома программы, а обдумал свои действия и наверняка увидел, что период закончился. Если же не увидит, то может сообщить издателю, а тогда автор прожки намекнёт, что "срок то вышел, поди? ". какой смысл НЕ сообщать пользователю о том, что период триала простенькой программы закончился? |
Автор: 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. Если умельцы мотают дату, как правило сразу несколько лет. Не не не Мотают на дату первого запуска. Vladimir_, а в чем суть программы, что она делает? |
Автор: B.V. 05.05.16, 12:54 |
Все советчики в этой теме забывают главное: не ломаемой защиты не существует. Весь вопрос в целесообразности взлома, а целесообразность зависит от востребованности. Если программа простая и не пользуется особой популярностью, смысла усложнять защиту никакого нет. Сообщения были разделены в тему "Обсуждение методов защиты ПО" |