Защита программы от взлома

 
0
 
Delphi, Kylix & Pascal
ava
Antony41 | 25.09.2013, 10:12
Нужен совет
Суть работы следующая
Есть клиент и сервер.
На сервере есть лицензии, так сказать Ini файлы и коды доступа к ним. На сервере можно установить активирована лицензия или нет, а так же срок действия лицензии после активации.
Если лицензия еще не активирована, то когда клиент начинает активацию, берется его текущая дата и к ней прибавляется кол-во дней установленное при активации.
Например создали лицензию не активированную на 5 дней после активации, как только клиент начинает активацию, идет запрос на сервер и сервер сообщает ему, что эта лицензия на 5 дней. Клиент берет текущую дату и прибавляет к ней 5 дней, получается срок окончания лицензии в его локальном формате.
Создается локальный файл ключей на стороне клиента, куда записываются даты. клиент отслеживает перемотку дат и если была зафиксировна, запускает снова окно регистрации/восстановления. Теперь, что бы программа запустилась, нужно либо установить дату обратно, либо пройти этап восстановления.
При прохождении восстановления сервер сообщит ему уже не кол-во дней которые осталось, а ответ=даты окончания-дата активации, т.е клиент к текущей дате прибавит ответ от сервера и получится дата окончания снова в его локальном формате, но уже будет меньше, т.е столько сколько положено работать программе.

В общем уязвимость тут вот в чем, если скопировать ключ активации и запомнить время на компе, то по истечению лицензии можно будет заменить файл ключа и перемотать время назад и снова пользоваться.
Нужно где то хранить дату последнего изменения файла ключа. Вопрос где то это легко сказано, а вот где? Или есть более разумный метод решения. При этом программа на стороне клиента должна работать, даже когда нет доступа к инету.

added later:
только не нужно говорить что можно взломать программу, и обойти защиту, уже и так наверное все это знают.
Comments (15)
ava
Poseidon | 25.09.2013, 09:28 #
Клиент прошел активацию и вытянул с сервере информацию о пяти днях работы. Сохранил это локально. Плюс сохранил дату активации. При каждом запуске программы клиент проверяет текущую дату, если от даты активации прошел день, отнимает этот день от сохраненных пяти дней работы. Т.е. фиксируем не дату когда нужно сказать "лицензия истекла", а фиксируем дни работы программы. И с каждым прошедшим днем это количество дней уменьшаем. То же самое фиксируем и на сервере. При любом шухере, будь то перевод локальной даты у клиента или еще чего запускаем восстановление при котором лезем на сервер и смотрим там сколько осталось дней лицензии. В итоге получится, что по истечении пяти дней лицензия будет иметь статус "осталось 0 дней работы". При чем этот статус будет как локально, так и на сервере, и при попытке перевести локальную дату и запустить восстановление, ничего не выйдет т.к. сервер тоже знает, что лицензия уже истекла.
ava
Akella | 25.09.2013, 10:31 #
а может дату брать не на ПК клиента, а на сервере

added later:
Цитата (Antony41 @  25.9.2013,  09:12 findReferencedText)
Есть клиент и сервер.


Цитата (Antony41 @  25.9.2013,  09:12 findReferencedText)
программа на стороне клиента должна работать, даже когда нет доступа к инету.


Тут непонятно. Сервер в локальной сети или в интернете?
ava
Antony41 | 25.09.2013, 11:49 #
Сервер в интернете, опять же уязвимость с переводом времени назад и копированием файла ключа. Прежде сохраненный файл локального ключа копируем в то место где он должен быть, переводим дату назад и запускаем клиента, и всё прекрасно опять работает... Нужно защиться от подмены локального файла ключей.
ava
Poseidon | 25.09.2013, 12:20 #
Мое сообщение читал? Подмена файла при таком раскладе не прокатит т.к. информация о лицензионном сроке будет на сервере.
ava
Antony41 | 25.09.2013, 13:26 #
Читал. По моему твой вариант не сильно отличается.  Тогда получается при каждом запуске программы должна проходить сверка с сервером.

А так получается допустим
активацию программы я прошел 01.01.2013 и у меня было 10 дней, значит локальный файл ключа должен сохранить значения например:
DTActivate=01.01.2013 00:00:00
DaysExp=10
Внимание я беру и копирую созданный файл ключа куда нибудь.
затем когда у меня наступает 11.01.2013 прога жалуется.
Я значит беру такой закрываю её и заменяю текущий файл ключа, тем что скопировал ранее, перематываю дату на 01.01.2013 00:00:10
и запускаю программу. получается если не будет сверка с сервером, то программа откроется и будет вести себя так как буд то лицензия активна.
ava
Poseidon | 25.09.2013, 14:15 #
Цитата (Antony41 @  25.9.2013,  13:26 findReferencedText)
Я значит беру такой закрываю её и заменяю текущий файл ключа, тем что скопировал ранее, перематываю дату на 01.01.2013 00:00:10и запускаю программу. получается если не будет сверка с сервером, то программа откроется и будет вести себя так как буд то лицензия активна.
Все это так, но есть но:
  • У пользователя будет "левое" время. Не всем это нравится и это не удобно
  • Данные можно дублировать в другом файле/реестре и шибко не афишировать это. При подмене файла-ключа программа видит, что данные отличаются и просит запустить процедуру восстановления (связи с сервером). А сервер скажет "прости, время вышло". При чем дублировать можно не именно те данные, которые в файле ключе. Можно в тот же реестр тупо записывать дату последнего запуска программы и при каждом последующем запуске ее проверять и перезаписывать. Если вдруг выяснится, что дату "откатили" - запускаем восстановление лицензии.
Вообще вся идея в том, что срок отматывается на сервере. А локально все делается только из-за возможного отсутствия соединения с сервером. При любой локальной нестыковке нужно ломиться на сервер и уточнять что да как. Откат даты и подмена файла отлавливаются локально элементарно. Не думаю что с этим могут возникнуть проблемы.
ava
Antony41 | 25.09.2013, 14:29 #
Спасибо всем за помощь, пока вопросов больше нет.
ava
Akella | 25.09.2013, 16:13 #
Интересно, а как клиент-сервер будет работать автономно, если нет доступа к серверу? Значит это не клиент-сервер?
ava
Antony41 | 26.09.2013, 20:23 #
Не совсем так. Есть сервер лицензий который хранит и следит за сроком окончания лицензий для клиента. Клиент работает не то что бы в инете, он работает с базой данных которая может распологаться как в инете так и локально, и только на этапе регистрации/восстановления если что то пошло не так, должен иметь доступ в инет, для того чтобы сервак ему сообщил каков статус и срок его ключика, разрешить или нет доступ для восстановления, а так же переодически проверять, если есть инет в данный момент, если нет то нет))), если есть, фиксировать например последнюю дату синхронизации параметров с сервером лицензий. Так же идет привязка к железке со стороны клиента, и если скопировать файл ключа на другой комп, то так же вылезет окошко регистрация/восстановление из за не соответствия UID компов. И только позвонив в службу поддержки можно будет перевыпустить лицензию.

А на предыдущем компе при первой синхронизации, если есть доступ в инет произойдет блокировка, из за смены UID.

Конечно я понимаю что это всё ломается и нет защиты никакой обсолютно, но я использовал некоторые рекомендуемые методы продления времени на взлом например такие как подмена значений, не являющимися настоящими, или проверка в разных потоках, избавился от диалоговых окон в тех местах где можно поставить брекпоинт на клике по "ОК" а потом посмотреть что было до... Лучшего способа я не придумал. Требования сводили к тому что если сервер лицензий не запущен или произойдет какой либо сбой света серв вырубит, то работать программа всё равно должна, при чем именно столько на сколько дней была приобретена лицензия.
ava
Akella | 26.09.2013, 21:10 #
При изменении/установке лицензионного ключа можно создавать/изменять какой-то файл.
Потом, при отсутствии доступа к серверу лицензий, можно проверять дату создания/изменения файла, а не дату, установленную на ПК.
ava
DYUMON | 27.09.2013, 07:29 #
берется timefreez и программа будет считать что дата не меняется.
пусть программа берет с сервера сколько времени ей работать. а на сервере сделаешь скрипт который будет дни отнимать .
ava
Antony41 | 27.09.2013, 18:03 #
Цитата (DYUMON @  27.9.2013,  07:29 findReferencedText)
пусть программа берет с сервера сколько времени ей работать. а на сервере сделаешь скрипт который будет дни отнимать .

В общем так оно и есть!
ava
ZaDoXliK | 30.09.2013, 02:13 #
Бери какие то неизменные файлы. На пример системный файл который нельзя редактировать. В общем DYUMON правильно подсказывает, бери не время и даты на самом ПК, а манипулируй с файлами на нём.
ava
ZaDoXliK | 30.09.2013, 02:14 #
Но не забывай о том что всё что сделано руками человека ломается руками другого более опытного человека smile
ava
Antony41 | 22.10.2013, 17:56 #
всем огромное спасибо! это я знаю что всё можно взломать это лишь вопрос во времени или выгоде.
Please register or login to write.
Firm of day
Вы также можете добавить свою фирму в каталог IT-фирм, и публиковать статьи, новости, вакансии и другую информацию от имени фирмы.
Подробнее
Contributors
advanced
Submit