1

我想保护一些算法,以免被逆向工程。我知道总是有风险,但我想让工作尽可能复杂。我知道在 Java 中有 ProGuard 和其他混淆器。但最了解的不是应用程序的结构,而是算法的数值细节。阅读它,让我对算法的保护产生了怀疑。

简单地重命名一些变量,不会使逆向工程算法变得足够困难。也许你可以告诉我,哪些方法更适合算法,哪些混淆器可能在算法上做得最好。

目前我正在考虑一些手工并将其与工具结合起来。

4

2 回答 2

1

假设您的算法应该在任意 JVM 上作为 Java 字节码执行。然后人们可以破解他们的 JVM 以将字节码转储到某个地方,无论您对类加载过程进行了多少混淆。一旦有了字节码,就可以进行控制流分析,即决定哪些信息从哪里传递到哪里。

您可以混淆各个指令的顺序,但这不会改变计算。对于只想在未修改的情况下运行您的算法的人来说,这不会改变任何事情。重新排序会在多大程度上阻止人们修改您的算法,这在很大程度上取决于算法和控制流的复杂性。

您可能能够以某种模糊的方式使用反射来混淆控制流,或者通过实现自己的解释器并使用它来运行算法。但是这两种方法都可能会对算法的性能造成严重影响。

在其他语言(如本机 x86 代码)中,您可能会通过引入关于如何将字节拆分为指令的歧义来混淆反汇编程序,在一种情况下使用某些字节作为指令的尾部部分,但在另一种情况下作为不同的指令案例。但是在Java中没有这样的选项,字节码的含义定义得太清楚了。

可能能够在某种程度上混淆事物的一种方法是将算法与程序的其他步骤紧密混合。对于直线程序,这可能会使事情变得更难跟踪,特别是如果您通过不可见的 GUI 对象或类似的奇怪东西传递数字。但是一旦你需要循环或类似的东西,让循环边界排列起来似乎非常困难,所以我怀疑这种方法也有很大的潜力。而且我怀疑是否有一个现成的混淆器可以解决这个问题,所以你必须手动完成。

于 2012-09-05T15:10:42.360 回答
1

在我的经验中,您可以使用 .so 文件,即本机实现和 java 实现,使用模糊代码很难跟踪,但唯一的缺点是您必须为此使用 JNI。

于 2012-09-05T18:17:37.177 回答