【发布时间】:2019-01-16 03:18:06
【问题描述】:
我正在为 Java 应用程序编写插件。我可以混淆插件,但它仍然很容易被逆向工程。
我相信,如果我可以将此插件编译为一个共享库,该库大量使用 JNI 与主应用程序通信,那么逆向工程将更加困难。我愿意为 JNI 牺牲一些性能,而我正在编写的应用程序确实支持共享库加载。唯一的问题是我不知道有什么工具可以完成这项工作:gcj 似乎依赖于它自己的运行时和 IKVM.NET - on .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 与在 JVM 中运行时总是表现不同时)以及您自己的时间,以换取很少的“收益”和非常劣质的产品。 现在放弃,虽然您还没有在混淆方面投入太多时间,以至于您觉得自己只是必须像这样发布产品...
-
也许你应该把你的应用移植到 Perl ;-)
-
我认为,如果这种方法很容易实现自动化和成功,那么早就有人将其变成商业混淆产品了。 :)
标签: java java-native-interface native