我想保护一些算法,不要被逆向设计。我知道总有风险,但我想让工作尽可能地复杂化。我知道在Java中有ProGuard和其他混淆器。但最知识不在于应用程序的结构,而在于算法的数字细节。阅读它,让我怀疑算法的保护。
简单地重命名一些变量,不会使反向设计算法变得困难。也许您可以告诉我,哪种方法更适合算法,哪种混淆器可以在算法上做得最好。
目前我正在考虑一些手工操作并将其与工具结合起来。
答案 0 :(得分:1)
假设您的算法应该作为Java字节码执行,在任意JVM上执行。然后人们可以破解他们的JVM以在某处转储字节码,无论你多么混淆类加载过程。获得字节码后,您可以进行控制流分析,即决定从哪里传递哪些信息。
您可以混淆各个指令的顺序,但这不会改变计算。对于那些只想在未经修改的情况下运行算法的人来说,这并没有改变任何东西。重新排序会阻止人们修改算法的程度取决于算法和控制流程的复杂程度。
您可能能够以某种模糊的方式使用反射来混淆控制流,或者通过实现您自己的解释器并使用它来运行算法。但这两种方法都可能会严重损害算法的性能。
在其他语言(如本机x86代码)中,你可以通过引入关于如何将字节分成指令的模糊性来混淆反汇编程序,在一种情况下使用一些字节作为指令的尾部,但是作为一个独特的其他情况下的指示。但是在Java中没有这样的选项,字节码的含义定义得太明了。
可能能够混淆某种东西的一种方法是将算法与程序的其他步骤紧密混合。对于直线程序,这可能会使事情变得更难以跟踪,特别是如果您通过隐形GUI对象或类似奇怪的东西传递数字。但是一旦你需要循环或类似的东西,得到循环界限似乎很难,所以我怀疑这种方法也有很大的潜力。我怀疑有一个现成的混淆器,所以你必须手工做。
答案 1 :(得分:1)
在我的经验中,你可以使用.so文件I.e.使用java实现的本机实现很难用obfsucated代码跟踪,但唯一的缺点就是你必须使用JNI。