Срок действия исполняемого файла C # или программного обеспечения истекает в определенную дату

#c# #registry #exe

#c# #реестр #exe

Вопрос:

Как мне завершить срок действия EXE-файла после определенной даты / времени. Например, я хочу, чтобы срок действия exe / приложения истек в дату 12-12-2018.

В настоящее время я знаю только о двух способах ::

  1. Дата компьютера: у меня есть DateTim.Теперь в C #, так что я могу сравнить системную дату пользователя с моей жестко заданной датой, но это ненадежно, потому что оно сравнивает дату с датой компьютера пользователя, которую пользователь может изменить.

  2. Дата выхода в Интернет: я делаю запрос в Интернет, чтобы получить дату, но я не могу полагаться на Интернет, потому что возможно, что пользователь не подключится к Интернету во время использования моего Exe, поэтому я не могу сделать его зависимым от Интернета.

Итак, как безопасно завершить срок действия вашего exe-файла.

(Я не говорю о системе лицензий и т.д., Которую предлагали многие stackoverflow Q / A, Я просто говорю о простом способе сделать это. Если это невозможно, пожалуйста, ответьте также.)

Комментарии:

1. Я не думаю, что вы можете. Даже при подключении к Интернету кто-то может подделать эти данные и привести к сбою вашей программы. Я не знаю ваших требований, но любая информация, взятая с пользовательского устройства, может быть подделана.

2. Спасибо, Стив, я просто хочу ограничить доступ к своему приложению после определенной даты

3. Вы могли бы установить значение реестра (требуется администратор) с указанием даты или с использованием какой-либо кодировки. Вы могли бы сделать веб-запрос, чтобы получить дату из удаленного источника данных. При запуске приложения проверьте ключ, если ключ не существует (т.Е. пользователь удалил его), exe завершается, если закодированная дата прошла, exe завершается. Просто пара идей…

4. Было бы полезно, если бы вы сообщили нам ВСЕ ограничения вашей среды (т. Е. разрешения, удаленный доступ к данным), чтобы мы могли предоставить более точные ответы. Короче говоря, существует более чем несколько способов добиться этого.

5. самый простой способ, добавить дату в качестве константы в exe и проверить ее при загрузке. Но это на 100% может быть взломано любым человеком с минимальными знаниями, простое изменение даты компьютера или его модификация с помощью reflection нарушили бы эту защиту.

Ответ №1:

ну, это немного зависит от того, насколько надежной должна быть система…

конечно, вы всегда можете сказать: код ушел из ваших рук -> с этого момента ничто не является надежным … ваш код может быть изменен, аппаратное обеспечение не под вашим контролем… итак, в конце концов, эта задача не может быть выполнена правильно, если вы рассмотрите все возможности

но вы можете немного усложнить кому-либо вмешательство в систему…

допустим, у вас есть какое-то состояние приложения, которое инициализируется при первом запуске с использованием интернет-службы, которая проверяет, что срок действия программного обеспечения еще не истек … конечно, это должно быть защищено и аутентифицировано с помощью чего-то вроде TLS и встроенного сертификата … (бонусные баллы, если вы используете байты из сертификата в другом месте в качестве констант в вашей программе)

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

например, у вас может быть счетчик, который подсчитывает операции в вашей программе… сделайте что-нибудь, увеличьте счетчик и т. Д

затем состояние счетчика сохраняется вместе с данными, с которыми работает ваша программа, например, в заголовке файла, когда вы что-то пишете

конечно, для этой информации нужен какой-то механизм защиты от несанкционированного доступа… наряду с состоянием счетчика сохраните текущую временную метку и хэш над содержимым файла … затем создайте своего рода подпись над заголовком

при загрузке этого файла проверьте, что подпись, хэш содержимого, временная метка должны быть в прошлом, а текущее состояние счетчика должно быть больше сохраненного состояния счетчика

состояние приложения сохраняется таким же образом через регулярные промежутки времени, и, конечно, вы проверяете состояние при каждом запуске (истек, наибольшая известная временная метка < текущая временная метка, подпись)

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

редактировать: и, конечно, вы можете проверить, доступна ли файловая система для записи в формате NTFS, где вы можете хранить что-то скрытое в альтернативном потоке данных…

у вас также может быть конфигурационный файл, в который вы записываете данные ПОСЛЕ завершения первоначальных проверок программы, и сравните время последней записи этого файла с текущими системными часами, чтобы увидеть, было ли оно сброшено

вы также можете проверить, нет ли на жестком диске файлов, которые новее даты, показываемой системными часами…

Комментарии:

1. Можете ли вы обобщить свой ответ в баллах. каковы возможные решения?

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

3. но где мне на самом деле проверить дату? через пользовательскую системную дату или иначе? следующим этапом является более жесткое вмешательство

4. вы выполняете проверку по системным часам, что затрудняет вмешательство в работу часов… если пользователь сбрасывает часы на предыдущую дату, для этого есть некоторые индикаторы, о которых пользователь а) должен знать и б) также исправить их, чтобы сброс часов оставался незамеченным