Как создать пробную версию Java-программы

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

Итак, как сделать его условно-бесплатным или пробным, также можем ли мы заблокировать доступ к .class в файле jar?

Спасибо


person Eddinho    schedule 04.05.2010    source источник


Ответы (10)


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

Его можно найти по адресу http://Rampartlicensing.com.

person Joe    schedule 11.12.2010
comment
Ссылка не работает. Кто-нибудь может это исправить? - person Rajkumar R; 15.04.2016
comment
Ссылка не работает, обновите - person Shersha Fn; 30.05.2016

Вот идея:

  1. Создайте общедоступную базу данных (например, базу данных SQL Server) в Интернете. Он будет хранить список лицензионных ключей «пробной версии». Вы можете использовать ту же систему для лицензионных ключей полной версии при покупке продукта.

  2. При первом запуске вашего программного обеспечения Java будет создана пробная лицензия, которая будет храниться в базе данных.

  3. Программное обеспечение Java проверяет наличие действительной лицензии при каждом запуске. Дата создания лицензии хранится в базе данных, поэтому не имеет значения, на какое время настроены часы клиента.

  4. Программное обеспечение перестает работать, когда срок действия лицензии истек

Стандартное программное обеспечение Windows может искать идентификатор ЦП и использовать его как часть лицензии, поэтому каждый компьютер может запускать пробную версию только один раз. Кто-нибудь знает, есть ли какой-нибудь "JVM ID", который можно использовать для этой цели?

Может быть, уже есть бесплатный или открытый исходный код, связанный с лицензией?

person Jon Onstott    schedule 04.05.2010
comment
@Jon, очень интересная идея, спасибо - person Eddinho; 05.05.2010

Почему бы просто не запрограммировать дату истечения срока действия в пробной программе, чтобы вам не нужно было продолжать ее поддерживать? Вы можете поместить это в 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 распространяет свои крупномасштабные бета-версии программного обеспечения. Они просто дают ему срок годности.

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

person Marcus Adams    schedule 04.05.2010
comment
И если пользователь переводит свои системные часы назад, это обманывает вашу систему. - person Paul Tomblin; 05.05.2010
comment
@ Пол, это правда, но это просто, и, по крайней мере, я не буду это поддерживать. - person Marcus Adams; 05.05.2010
comment
спасибо, это хорошая идея, но, как сказал @Paul, системные часы можно изменить :( - person Eddinho; 05.05.2010

Я бы просто сделал что-то очень простое и достаточно сложное, чтобы непрограммисты не смогли в этом разобраться.

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

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

person Pyrolistical    schedule 04.05.2010
comment
+1 за проблему с бизнес-моделью. - person Paul Tomblin; 05.05.2010
comment
@Pyrolistical: можете ли вы объяснить мне, почему у Blizzard есть проблема с бизнес-моделью, поскольку они фактически сделали Battle.net неуязвимым? В этот день и в мире повсеместного подключения к Интернету люди постепенно начинают понимать, что, когда на стороне сервера происходит достаточное количество вычислений, программное обеспечение становится практически невозможно взломать (если не считать его переписывания). - person SyntaxT3rr0r; 05.05.2010
comment
@WizardOfOdds: Если бы все использовали ваш метод, общее потребление энергии в мире увеличилось бы на 200%, и каждая интернет-линия была бы перегружена 24/7. Пожалуйста, это не окончательное решение. Что делать, если вы продаете продукт, который не имеет ничего общего с Интернетом? Зачем мне когда-либо покупать что-то, что для правильной работы требует подключения к Интернету, даже если домен продукта не имеет ничего общего с Интернетом. .. Я бы сначала подумал про себя, почему это связывается с Интернетом, чтобы делать вычисления, много трояна?. - person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x; 05.05.2010
comment
@WizardOfOdds Очевидно, что OP не предоставляла услуги через Интернет, и ваша точка зрения подтвердила мою точку зрения. Если OP нуждалась в большей защите, то их текущая бизнес-модель продажи программного обеспечения ошибочна, и поэтому им необходимо рассмотреть другие модели, такие как Blizzard, предлагающие услуги через Интернет. Модель Blizzard отличается от OP - person Pyrolistical; 05.05.2010
comment
Не в каждом домене возможно заставить вашего клиента всегда быть подключенным к Интернету при использовании вашего программного обеспечения. Существуют законы, запрещающие это в некоторых отраслях и корпоративных сетях. - person alwi; 11.08.2017

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

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

person Paul Tomblin    schedule 04.05.2010
comment
@Paul Tomblin: ах ах, я такой парень ;) Место для хранения файла, который пользователь не может найти, находится на стороне сервера, на вашем собственном сервере :) Тогда ваш коллега и я должны повторно создать образ / повторно использовать / скопировать чистую установку, скажем, Windows, подделав MAC-адрес, и переустановить новую 30-дневную оценку копии :) Обратите внимание, что я делаю это только для того, чтобы понять взлом попытки (см. мой ответ), чтобы лучше защитить наше программное обеспечение :) - person SyntaxT3rr0r; 05.05.2010
comment
Если вы сохраните дату в MySQL, у вас не будет никаких шансов на этот трюк. - person Apopei Andrei Ionut; 19.04.2013
comment
О чем ты говоришь @ApopeiAndreiIonut? Вы можете просто зайти в командную строку MySQL и изменить любое значение в любой таблице. - person Paul Tomblin; 19.04.2013

Я работаю над коммерческим программным обеспечением Java, и оно защищено.

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

заставить значительную часть вычислений выполняться на стороне сервера

Злоумышленник ничего не может противопоставить этому, кроме:

  • перепишите ту часть вашего ПО, которая происходит на стороне сервера

  • пиратство вашего сервера

Если наши потенциальные пользователи недовольны тем фактом, что наше программное обеспечение требует постоянного подключения к Интернету, они могут либо купить, либо украсть один из худших продуктов нашего конкурента.

Подумайте об этом так: никому еще не удавалось играть на Battle.net от Blizzard, используя поддельные/сгенерированные лицензионные ключи.

Конечно, пират может попытаться подделать весь Battle.net, но тогда пиратская версия не позволит людям играть, скажем, в реальной экономике WoW, соревноваться в реальном рейтинге Starcraft и т. д.

Почему никому не удалось это сделать: потому что Blizzard сделала значительную часть вычислений на стороне сервера.

Достаточная часть вычислений, происходящих на стороне сервера, фактически означает: "хорошие пиратские игры".

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

person SyntaxT3rr0r    schedule 04.05.2010
comment
Пожалуйста, ради бога, если вы используете этот метод, подписывайте цифровой подписью все данные, полученные с сервера. В противном случае вы просто сделаете клиента уязвимым для собственной выгоды, и когда какой-нибудь хакер разоблачит это, вы будете выглядеть действительно, действительно плохо. - person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x; 05.05.2010
comment
Что произойдет, если (на самом деле, когда) ваша компания обанкротится? - person Kevin Brock; 05.05.2010
comment
@Kevin Brock: довольно просто: вы выпускаете исходный код для серверной части (или просто делаете одну окончательную сборку, в которой вы не ставите защиту от копирования и выпускаете ее как бесплатное обновление) ... Кстати, обратите внимание, что есть компании в бизнесе на протяжении десятилетий, которые всегда продавали программное обеспечение со сверхограничительной защитой от копирования (например, аппаратные ключи) в некоторых конкретных областях. Некоторым компаниям 150 лет, кстати ;) - person SyntaxT3rr0r; 05.05.2010
comment
@Longpoke: вы просто делаете клиента уязвимым для собственной выгоды Можно мне кое-что из того, что вы курите? - person SyntaxT3rr0r; 05.05.2010
comment
@WizardOfOdds: но тогда пиратская версия не позволит людям, скажем, участвовать в реальной экономике WoW или соревноваться в реальной лестнице Starcraft. Это совершенно другая концепция, вы решаете, что кто-то может' не играй на твоём сервере. Ничто не мешает ему играть на собственном сервере. Это то, что происходит во многих многопользовательских играх, люди создают свои собственные пиратские серверы, и они обычно не так хороши и/или распространены, как законные серверы, поэтому у вас есть некоторый уровень семантической защиты вашего продукта. Этот метод работает только для игр. - person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x; 05.05.2010
comment
@WizardOfOdds: Можно мне немного того, что ты куришь? Разве вы не видите здесь изъяна в безопасности? Ваша программа будет действовать по произвольной логике, продиктованной сервером, простой атаки «человек посередине» теперь становится достаточно, чтобы скомпрометировать любого клиента. Если вы подписываете логические ответы сервера цифровой подписью, это предотвращается. - person L̲̳o̲̳̳n̲̳̳g̲̳̳p̲̳o&#x; 05.05.2010
comment
для моего случая это не будет хорошо, я буду продавать годовые лицензии, так что идея @Jon лучше для моего случая - person Eddinho; 05.05.2010

Я проверяю дату, с которой сервер атомарного времени пришлет мне в начале кода. Затем я сравню эту дату с конкретной датой. Если атомное время меньше, то 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();
        }
    }
}
person Caesar    schedule 13.03.2012
comment
Что, если они не исправят дату на своем компьютере? и вы в конечном итоге даете им больше испытаний или меньше? или еще хуже: что, если они поймут это и вручную изменят дату, чтобы никогда не использовать настоящую версию. - person Gherbi Hicham; 24.09.2016

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

person Eyal Schneider    schedule 04.05.2010

В прошлом я успешно использовал True License. Есть поддержка пробного периода. Используйте его в сочетании с инструментом запутывания, таким как ProGuard, и это, безусловно, сделает взлом нетривиальным.

person Cogsy    schedule 04.05.2010

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

person Community    schedule 11.05.2010