我想保护某些算法不被逆向工程。我知道总是有风险,但我想让工作尽可能复杂。我知道在 Java 中有 ProGuard 和其他混淆器。但最多的知识不在应用程序的结构中,而是在算法的数字细节中。阅读它,让我对算法的保护产生了怀疑。
简单地重命名一些变量,不会使逆向工程算法变得足够困难。也许你可以告诉我,哪些方法更适合算法,哪些混淆器可能在算法上做得最好。
目前我正在考虑一些手工并将其与工具结合起来。
最佳答案
假设您的算法应作为 Java 字节码在任意 JVM 上执行。然后人们可以破解他们的 JVM 以将字节码转储到某个地方,无论您如何混淆类加载过程。一旦你有了字节码,你就可以进行控制流分析,即决定哪些信息从哪里传递到哪里。
您可以混淆各个指令的顺序,但这不会改变计算。对于只想不加修改地运行您的算法的人来说,这不会改变任何东西。重新排序将在多大程度上阻止人们修改您的算法,这在很大程度上取决于算法和控制流的复杂性。
您可能能够以某种晦涩的方式使用反射来混淆控制流,或者通过实现您自己的解释器并使用它来运行算法。但这两种方法都可能会严重影响算法的性能。
在其他语言(如原生 x86 代码)中,您可能会通过引入关于如何将字节拆分为指令的歧义来混淆反汇编器,在一种情况下使用一些字节作为指令的尾部,但作为一个独特的其他情况下的指导。但是在Java中没有这样的选择,字节码的含义定义得太明确了。
您可能能够稍微混淆事物的一种方法是将算法与程序的其他步骤紧密混合。对于直线程序,这可能会使事情变得更难跟踪,特别是如果您通过不可见的 GUI 对象或类似奇怪的东西传递数字。但是一旦你需要循环或类似的东西,让循环边界排列起来似乎非常困难,所以我怀疑这种方法是否有很大的潜力。而且我怀疑是否有现成的混淆器可用于此目的,因此您必须手动操作。
关于java - Java 算法的混淆器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12283955/