アプリケーションのさまざまな場所から呼び出されるカスタム LicenseManager を使用して、Java アプリケーションを保護しようとしています。
ライセンスマネージャーは次のようになります
public class LicenseManager {
public static void verify() {
// throw Exception in case license is not valid
}
}
もちろん、アプリケーションを「クラック」する簡単な方法は、LicenseManger をこれに置き換えて、クラスパスの先頭に追加することです。
public class LicenseManager {
public static void verify() {
// NEVER throw an Exception!!!
}
}
したがって、LicenseManager にパッチが適用されないようにするために、LicenseManager.verify() を呼び出すアプリケーションのすべての部分に次のコードを追加しました。
if (!LicenseManager.class.getProtectionDomain().getCodeSource().getLocation().sameFile(this.getClass().getProtectionDomain().getCodeSource().getLocation())) {
throw new RuntimeException("Invalid license");
}
これにより、基本的に、LicenseManager のコード ソースの場所と残りのアプリケーションのコード ソースが同じであることを確認できます。
これは理にかなっていますか?このアプローチで LicenseManager を「ハッキング」する方法はありますか?
編集:文字列の難読化とコードの IntegrityProtection にJava String ( https://jfxstore.com/stringer/ )も使用しています。これにより、アプリケーションの逆コンパイルが困難になります。
また、LicenseManager.verify() の呼び出しはアプリケーション全体 (何百もの場所!) に分散しているため、それらすべての場所を変更するのは大変な作業になります。