Как создать пробную версию Java-программы
Я пишу программное обеспечение на Java, и я почти закончил, я хотел бы знать, как мы можем создать пробную версию, которая работает, например, в течение 30 дней, потому что я хочу отправить ее некоторым компаниям
Так как сделать это как условно-бесплатное или пробное ПО, также мы можем заблокировать доступ к.class в файле jar?
Спасибо
10 ответов
Существует продукт под названием Rampart, который позволяет вам сделать пробную версию для вашего Java-приложения. Это займет всего пару минут и работает довольно хорошо.
Вы можете найти его на http://rampartlicensing.com/
Вот идея:
Создайте базу данных (например, базу данных SQL Server), которая будет общедоступна в Интернете. Будет храниться список лицензионных ключей "пробной версии". Вы можете использовать ту же систему для лицензионных ключей полной версии, когда ваш продукт приобретен.
При первом запуске программного обеспечения Java будет создана пробная лицензия, которая будет сохранена в базе данных.
Программное обеспечение Java проверяет действительную лицензию при каждом запуске. Дата создания лицензии сохраняется в базе данных, поэтому не имеет значения, на что установлены клиентские часы.
Программное обеспечение перестает функционировать после истечения срока действия лицензии
Стандартное программное обеспечение Windows может искать идентификатор процессора и использовать его как часть лицензии, так что на каждом компьютере пробная версия программного обеспечения может запускаться только один раз. Кто-нибудь знает, есть ли какой-нибудь "JVM ID", который можно использовать для этой цели?
Может быть, уже есть свободный или лицензионный код с открытым исходным кодом?
Почему бы просто не прописать дату окончания срока действия в пробную программу, чтобы вам больше не приходилось ее поддерживать? Вы можете поместить это в main().
// Die after October 1, 2010
Calendar expireDate = Calendar.getInstance();
// January is 0 (y, m, d)
expireDate.set(2010, 9, 1);
// Get current date and compare
if (Calendar.getInstance().after(expireDate)) {
// Die
System.exit(0);
}
Вот как Microsoft распространяет их крупномасштабное бета-программное обеспечение. Они просто дают ему срок годности.
Если вы говорите о предотвращении реверс-инжиниринга или модификации кода, вы не можете. Вы могли бы запутать скомпилированную программу, но это не остановит людей, которые все равно будут пересматривать ваш код.
Я бы просто сделал что-то действительно простое и достаточно сложное, чтобы непрограммисты не могли этого понять.
Я хотел бы что-то вроде записи в файл количество миллисекунд, когда программа впервые была установлена в 64-битной длины в двоичном формате в файл. И пусть ваш основной класс проверит и установит ограничение по времени. Да, люди могут изменить свои часы, чтобы обойти это, но на самом деле вы не хотите продавать этим людям в любом случае. Также убедитесь, что текущее время строго в течение 30 дней с момента установки. Большинство пользователей просто переводят свои часы назад на один год, и это работает с большинством программ, потому что они просто выполнили проверку меньше разницы. Также следует проверить, что разница в количестве дней от текущей до установки также больше 0.
Если вам кажется, что вам нужно больше защиты, тогда у вас проблема с бизнес-моделью больше, чем с программной. По сути, сделать его непригодным для использования невозможно, тем более что вы можете просто извлечь и разобрать файлы классов.
Я работаю над коммерческим программным обеспечением Java, и оно защищено.
Является ли обязательным подключение к Интернету в вашем случае? В нашем случае наше программное обеспечение имеет смысл только при наличии подключения к Интернету, и, следовательно, мы можем сделать обратный инжиниринг невозможным, просто следуя этой мантре:
сделать достаточную часть вычислений на стороне сервера
Злоумышленник ничего не может сделать, кроме этого:
переписать часть вашего программного обеспечения, которая происходит на стороне сервера
пиратский сервер
Если наши потенциальные пользователи недовольны тем фактом, что наше программное обеспечение требует постоянного подключения к Интернету, они могут либо купить, либо присвоить один из продуктов нашего конкурента.
Подумайте об этом так: никому никогда не удавалось сыграть на Blizzard's battle.net, используя поддельные / сгенерированные лицензионные ключи.
Несомненно, пират может попытаться подделать весь сайт Battle.net, но тогда пиратская версия не позволит людям играть, скажем, в реальной экономике WoW, ни конкурировать на реальной лестнице Starcraft, и т.д.
Почему никому не удалось это сделать: потому что Blizzard обеспечила выполнение достаточной части вычислений на стороне сервера.
Достаточная часть вычислений, происходящих на стороне сервера, фактически означает: "пираты хороших игр".
Чем больше мы движемся к постоянно подключенному миру, тем легче защищать приложения от пиратства. То же самое для контента (DRM), к лучшему или к худшему.
Проблема с попыткой ограничить даты состоит в том, что наивное решение простой проверки даты легко обмануть, если человек сбрасывает свои системные часы. Я работал с парнем, который держал виртуальную коробку VMWare только для запуска ограниченного по времени программного обеспечения. Лучшим подходом было бы записать время последнего запуска, и если время когда-либо пойдет до этого времени, вы знаете, что часы были сброшены, и вы можете прервать их. Проблема состоит в том, чтобы выяснить, как спрятать этот файл где-нибудь, где пользователь не может найти его, перезаписать его. Опять же, в среде VMWare или VirtualBox пользователь может просто вернуться к более раннему снимку.
Другими словами, вы можете ограничивать некоторых людей время от времени, но не всех людей постоянно.
Я проверяю дату от того, что сервер атомного времени отправит мне в начале в коде. Затем я сравню эту дату с конкретной датой. Если атомное время меньше, тогда System.exit(0).
public static GregorianCalendar getAtomicTime() throws IOException {
BufferedReader in = null;
try {
URLConnection conn = new URL("http://64.90.182.55:13").openConnection();
GregorianCalendar calendar = new GregorianCalendar();
conn.setConnectTimeout(1000);
in = new BufferedReader(new InputStreamReader(conn.getInputStream()));
String atomicTime;
while (true) {
if ((atomicTime = in.readLine()).indexOf("*") > -1) {
break;
}
}
//System.out.println("DEBUG : " + atomicTime);
String[] fields = atomicTime.split(" ");
String[] date = fields[1].split("-");
calendar.set(Calendar.YEAR, 2000 + Integer.parseInt(date[0]));
calendar.set(Calendar.MONTH, Integer.parseInt(date[1]) - 1);
calendar.set(Calendar.DATE, Integer.parseInt(date[2]));
// deals with the timezone and the daylight-saving-time
TimeZone tz = TimeZone.getDefault();
int gmt = (tz.getRawOffset() + tz.getDSTSavings()) / 3600000;
//System.out.println("DEBUG : " + gmt);
String[] time = fields[2].split(":");
calendar.set(Calendar.HOUR_OF_DAY, Integer.parseInt(time[0]) + gmt);
calendar.set(Calendar.MINUTE, Integer.parseInt(time[1]));
calendar.set(Calendar.SECOND, Integer.parseInt(time[2]));
return calendar;
} catch (IOException e) {
throw e;
} finally {
if (in != null) {
in.close();
}
}
}
Что касается файлов классов, вы не можете заблокировать доступ к ним, но вы можете сделать их некомпилированную версию полностью нечитаемой путем запутывания.
Я имел успех, используя True License в прошлом. Он имеет поддержку на испытательный срок. Используйте его в сочетании с инструментом для запутывания, таким как ProGuard, и это, безусловно, сделает его нетривиальным для взлома.
Я рекомендую функциональные ограничения. У меня есть небольшая программа для заметок. Программа работает полностью, но вы можете создавать только 10 заметок в незарегистрированном режиме. Поэтому я стараюсь быть добрым к пользователю. Никаких ограничений по срокам, надрывных экранов или какого-то еще зла. Только маленькая строка состояния, которая имеет ограничение текста и кнопку регистрации.