17

私はJavaでソフトウェアをコーディングしていますが、ほぼ完成しました。一部の企業に送信するため、たとえば30日間動作する試用版を作成する方法を知りたいです。

それで、シェアウェアやトライアルウェアのようにする方法、また、jarファイルの.classへのアクセスをブロックできますか?

ありがとうございました

4

10 に答える 10

10

ここにアイデアがあります:

  1. Web 上で公開されているデータベース (SQL Server データベースなど) を作成します。「試用版」のライセンス キーのリストが保持されます。製品の購入時に、製品版のライセンス キーに同じシステムを使用できます。

  2. Java ソフトウェアを初めて実行すると、試用ライセンスが作成され、データベースに保存されます。

  3. Java ソフトウェアは、実行されるたびに有効なライセンスをチェックします。ライセンスが作成された日付はデータベースに保存されるため、クライアントの時計がいつ設定されても問題ありません。

  4. ライセンスの有効期限が切れると、ソフトウェアが機能しなくなります

標準の Windows ソフトウェアは、CPU ID を検索してライセンスの一部として使用できるため、各コンピューターで試用版ソフトウェアを 1 回だけ実行できます。 この目的に使用できる何らかの「JVM ID」があるかどうかは誰にもわかりませんか?

無料またはオープンソースのライセンス関連のコードがすでに出回っているのではないでしょうか?

于 2010-05-04T23:43:27.310 に答える
6

サポートを継続する必要がないように、試用版プログラムに有効期限をハードコーディングしてみませんか? これを 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 が大規模なベータ版ソフトウェアを配布する方法です。彼らはそれに有効期限を与えるだけです。

リバース エンジニアリングの防止やコードの変更について話しているのであれば、それはできません。コンパイルされたプログラムを難読化することはできますが、コードをリバース エンジニアリングしようとする人々を止めることはできません。

于 2010-05-04T22:39:11.423 に答える
4

私は商用の Java ソフトウェアに取り組んでおり、それは保護されています。

あなたの場合、インターネット接続を強制することは受け入れられますか? 私たちの場合、私たちのソフトウェアはインターネット接続がある場合にのみ意味をなすので、次のマントラに従うだけでリバース エンジニアリングを不可能にすることができます。

計算の十分な部分をサーバー側で行う

これに対して攻撃者ができることは他にありません:

  • サーバー側で発生しているソフトウェアの一部を書き直す

  • サーバーの海賊版

当社の潜在的なユーザーが、当社のソフトウェアがインターネット接続の常時接続を義務付けているという事実に満足していない場合、競合他社の粗悪な製品を購入または海賊版にすることができます。

このように考えてみてください: 偽の/生成されたライセンス キーを使用して、ブリザードの Battle.net でのプレイに成功した人は誰もいません。

確かに、海賊はbattle.net全体を偽造しようとする可能性がありますが、海賊版では、人々が実際のWoW経済でプレーしたり、実際のスタークラフトのはしごで競争したりすることはできません.

なぜ誰もそれを行うことができなかったのか: Blizzard が計算の十分な部分をサーバー側で行うようにしたため.

サーバー側で行われる計算の十分な部分は、事実上、「良いゲームの海賊」を意味します。

常時接続された世界に移行すればするほど、アプリを著作権侵害から保護することがより簡単になります。良くも悪くも、コンテンツ (DRM) についても同じです。

于 2010-05-04T23:30:20.743 に答える
4

私は、プログラマーでない人がそれを理解できないように、本当に単純で十分に難しいことをするだけです。

プログラムが最初に64ビット長のバイナリでファイルにインストールされたときのミリ秒数をファイルに書きたいと思います。そして、メインクラスに時間制限をチェックして強制させます。はい、人々はこれを回避するために時計を変更できますが、とにかくそれらの人々に売りたくありません。また、現在の時刻が厳密にインストールから 30 日以内であることを確認してください。ほとんどのユーザーは、クロックを 1 年戻すだけで、ほとんどのプログラムで機能します。これは、違いのチェックよりも単純なチェックを行っただけだからです。また、現在からインストールまでの日数の差も 0 より大きいことを確認する必要があります。

それ以上の保護が必要だと感じる場合は、ソフトウェアの問題よりもビジネス モデルの問題が大きいということです。特にクラスファイルを抽出して逆アセンブルできるため、ハッキングできないようにすることは基本的に不可能です。

于 2010-05-04T22:39:49.343 に答える
4

日付を制限しようとすることの問題点は、日付をチェックするだけの単純な解決策は、ユーザーがシステム クロックを元に戻した場合に簡単に騙されてしまうことです。私は、時間制限のあるソフトウェアを実行するためだけに VMWare 仮想ボックスを保持している男と仕事をしました。より良いアプローチは、最後に実行された時刻を記録することです。時刻がその時刻より前になった場合は、時計が戻されたことがわかるので、中止できます。問題は、そのファイルをユーザーが見つけられない場所に隠して上書きする方法を考え出すことです。ここでも、VMWare または VirtualBox 環境では、ユーザーは以前のスナップショットにロールバックすることができました。

言い換えれば、一部の人を時々制限することはできますが、常にすべての人を制限することはできません。

于 2010-05-04T22:43:21.210 に答える
4

コードの最初で、アトミック タイム サーバーから送信される日付を確認します。次に、その日付を特定の日付と比較します。原子時間がそれよりも短い場合は、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();
        }
    }
}
于 2012-03-13T15:21:17.987 に答える
3

クラスファイルに関しては、それらへのアクセスをブロックすることはできませんが、難読化によって逆コンパイルされたバージョンを完全に読み取れないようにすることができます。

于 2010-05-04T22:48:31.120 に答える
2

Java アプリの試用版を作成できる Rampart という製品があります。数分しかかからず、かなりうまく機能します。

http://Rampartlicensing.comで見つけることができます。

于 2010-12-11T03:50:59.847 に答える
2

機能制限をお勧めします。ポストイットノートプログラムはほとんどありません。プログラムは完全に機能しますが、未登録モードでは 10 個のメモしか作成できません。だから私はユーザーに優しくしようとします。日付の制限、しつこい画面、その他の悪はありません。制限テキストと登録ボタンがある小さなステータス ラインのみ。

于 2010-05-11T22:13:18.020 に答える
2

以前、 True Licenseを使用して成功したことがあります。試用期間中のサポートがあります。ProGuardなどの難読化ツールと組み合わせて使用​​すると、クラックするのは簡単ではありません。

于 2010-05-04T23:49:44.563 に答える