0

我们正在尝试使用从我们应用程序的不同位置调用的自定义 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() 的调用遍布整个应用程序(数百个地方!),因此修改所有这些地方需要做很多工作。

4

0 回答 0