Java反编译和JNI

时间:2011-03-26 19:08:46

标签: java c java-native-interface

有点像这个问题How to lock compiled Java classes to prevent decompilation?,但是我很清楚如何对应用程序进行反编译并尝试理解它,即使它被混淆了但有一点我不太确定是同一个进程会如何如果应用程序使用jni加载C库(.so文件),则可以正常工作。

例如说如果有一个计算器,如果这个计算器是用纯java构建的,那么就可以进入并弄乱平方根按钮,这样当你传入2时它会返回2 ^ 3而不是2 ^ 2。

现在,如果此应用程序使用JNI执行所有这些数学命令(因此它将2传递给本机方法),您将如何进入C,更改它以使其返回2 ^ 3而不是2 ^ 2

4 个答案:

答案 0 :(得分:3)

只需找出C函数签名并编译自己的实现该签名的目标文件。

多年前,在大型机商店工作,我的老板制作了他自己的系统日期功能版本并重新链接了我们正在使用的商业应用程序,因此他不需要续订有时间限制的许可证。这是非法的,但它确实有效。

答案 1 :(得分:2)

反编译比字节码旧。几乎所有都可以被反编译。使用经过修改的优化机器代码并保留零元数据肯定更难(无论是反编译还是理解/修改结果),但仍然可行。当然你需要一个不同的反编译器,并且 - 如前所述 - 它会更难,但事实(这使得所有DRM工具都不完美,顺便说一句)“如果他们的CPU运行它,他们可以修改它” ,保留本机代码和任何字节码。

答案 2 :(得分:1)

一种选择是使用反汇编程序。一个更简单的选择是用你自己的库替换库。我几乎每天都将它用于测试目的。

答案 3 :(得分:1)

您可以使用调试器进入C代码。

你可以拆卸它。 IDA(交互式反汇编程序)是一个很好的例子,它可以生成高质量的反汇编代码(交叉引用,文档,调用中的系统/ lib函数名称,......)。

然后可以修补二进制文件(可能以某种方式受到保护)。

如果您担心的是您不希望使用您的应用程序的人查看代码甚至更改代码,您是否可以考虑让它作为Web或客户端/服务器应用程序运行,而用户没有访问服务器?这样可以解决问题。