2011-03-26 140 views
1

有点像这样的问题How to lock compiled Java classes to prevent decompilation?,但我很清楚如何反编译应用程序,并试图理解它,即使它被混淆了,但有一件事我不太确定是同样的过程会如何如果应用程序使用jni加载C库(.so文件),则工作。例如,如果有一个计算器,如果这个计算器是用纯java构建的,那么就有可能进入并弄乱平方根按钮,这样当你通过2时它会返回2^3而不是然后2^2。Java反编译和JNI

现在如果这个应用程序使用JNI来完成所有这些数学命令(所以它将2传递给一个本地方法),你将如何进入C,改变它以便返回2^3而不是2^2?

回答

2

反编译比字节码旧。几乎所有的都可以反编译。这肯定比较难(反编译和理解/修改结果),并且保留了零元数据,但却是可能的。当然,你需要一个不同的反编译器,并且 - 正如之前所暗示的那样 - 它会更难一些,但事实(顺便说一下,所有DRM工具都不完美)“如果他们的CPU运行它,他们可以修改它” ,对于任何字节码,本地代码都是一样的。

+0

每个人的答案都是现货。感谢大家。 – 2011-04-09 22:40:16

3

只需找出C函数签名并编译自己的实现该签名的对象文件即可。

几年前,我在一家大型机商店工作,我的老板做了他自己的系统日期功能版本,并重新连接了我们正在使用的商业应用程序,因此他不必更新有时限的许可证。这是非法的,但它工作。

1

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

1

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

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

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

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