我们正在尝试使用从我们的应用程序中的不同位置调用的自定义LicenseManager来保护Java应用程序。
LicenseManager看起来像这样
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的代码源位置和剩余应用程序的代码源是相同的。
这有意义吗?有没有办法静止" hack"使用这种方法的LicenseManager?
编辑: 我们还使用Java String(https://jfxstore.com/stringer/)进行字符串混淆和代码IntegrityProtection。这使得很难对应用程序进行反编译。
此外,对LicenseManager.verify()的调用遍布整个应用程序(数百个地方!),因此修改所有这些地方将需要做很多工作。