我可以使用本机编译作为Java模糊处理吗

我可以使用本机编译作为Java模糊处理吗,java,java-native-interface,native,Java,Java Native Interface,Native,我正在为Java应用程序编写一个插件。我可以混淆插件,但它仍然很容易反向工程 我相信,如果我能将这个插件编译成一个共享库,它大量使用JNI与主应用程序通信,那么逆向工程就会困难得多。我愿意为JNI牺牲一些性能,我所编写的应用程序确实支持共享库加载。唯一的问题是,我不知道有什么工具可以完成这项工作:gcj似乎依赖于自己的运行时和.NET上的IKVM.NET 准确地说: public class PluginImpl implements Plugin { @Override pu

我正在为Java应用程序编写一个插件。我可以混淆插件,但它仍然很容易反向工程

我相信,如果我能将这个插件编译成一个共享库,它大量使用JNI与主应用程序通信,那么逆向工程就会困难得多。我愿意为JNI牺牲一些性能,我所编写的应用程序确实支持共享库加载。唯一的问题是,我不知道有什么工具可以完成这项工作:gcj似乎依赖于自己的运行时和.NET上的IKVM.NET

准确地说:


public class PluginImpl implements Plugin {
    @Override
    public void startPlugin(PluginContext ctx) {
       ctx.helloWorld();
    }  
}
应转换为


public class PluginImpl implements Plugin {
    @Override
    public native void startPlugin(PluginContext ctx);
}
我的startPlugin方法的主体被编译到一个共享库中


(嗯,是的,我知道,我本来可以用C写这个插件的)

我想你有充分的理由去进行本机编译。您可以检查的一个选项是,这是一个经过认证的Java解决方案

你可以让你的插件通过网络提供服务。这样,插件将是一个应用程序,可以编译为本机代码

如果您以任何形式分发可执行代码,就不能真正使用任何东西进行代码混淆。任何可执行代码都可以进行反向工程。这是一个业务问题,而不是技术问题,它是通过业务手段解决的:许可协议、价格、上市时间,或者很可能是对风险和价值的更现实的评估,也就是说,承认你的代码没有那么有价值。或者,将您的产品作为服务而不是可执行文件交付。

为什么您说模糊字节码可以很容易地进行反向工程?任何有时间和耐心对您的字节码进行模糊处理的人,只要有更多的时间,都可以对本机代码进行同样的处理。您牺牲了性能、调试能力、可靠性(当编译成本机Java的行为总是与在JVM中运行的行为不同时)和您自己的时间,只为了很少的“收益”和极为低劣的产品。现在就放弃吧,因为你没有在模糊处理上投入太多时间,以至于你觉得你只需要像这样发布产品……也许你应该将你的应用程序移植到Perl;-)我认为,如果这种方法易于自动化和实现,那么可能已经有人将其转化为一种商业模糊处理产品很好,谢谢。我怀疑进程外RMI会对性能造成太大的损失,但我可能会尝试一下。额外的好处是我可以使用gcj。我希望我所写的API对序列化更友好。它仍然运行自己的运行时:“生成的可执行文件需要Excelsior JET运行时来运行,但不需要Sun JRE。”()好吧,+1是一个非常有趣的产品。任何Java应用程序都需要一个带有垃圾收集器、上下文隔离的Java运行时(无论是JNI、CNI还是其他),等等。Excelsior JET只是将字节码预编译为优化的本机代码。它仍然有一个JIT编译器,用于处理未预编译的类-动态代理、第三方插件等。混淆不是为了“防止”逆向工程,只是为了增加难度。只要你意识到,如果你分发可执行代码,实际上不可能完全阻止逆向工程,使用模糊处理作为威慑并没有什么错。这是一个明确的成本和可能的好处。这是一个商业决策。你也可以这样说任何软件产品的y特性。决定是否实现该特性是一项业务决策。设计和实现是一项技术工作。同样,决定是否使用模糊处理也是一个业务问题。模糊处理本身是一个技术主题。@Grodriguez:模糊处理使逆向工程更加耗时-正确{但不太多},也为开发人员的亲属祈祷,但最终一事无成。@bestsss:你说的是“破坏许可证”。这与我的论点无关。我从来没有说过模糊处理有助于防止复制保护。我说它使反向工程变得更加困难。确实如此。