我们正在尝试使用从我们应用程序的不同位置调用的自定义 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的代码源位置和其余应用程序的代码源是一致的。
这有意义吗?有没有办法用这种方法仍然“破解” LicenseManager?
编辑:我们还使用 Java String ( https://jfxstore.com/stringer/ ) 进行字符串混淆和代码 IntegrityProtection。这使得反编译应用程序变得困难。
此外,对 LicenseManager.verify() 的调用遍布整个应用程序(数百个地方!),因此修改所有这些地方需要做很多工作。