2

我有一个非常复杂的项目要从 C++ (Linux) 迁移到 Java 目前,C++ 版本作为共享库 (.so) 分发,然后是顶级接口头类。实现细节对最终用户完全隐藏。

这个问题不是关于将 C++ 代码移植到 Java,而是关于创建类似的分发包。

假设我在 C++ 中有一个非常简单的“公共”类topapi.h

class TopApi
{ 
public:
  void do( const string& v );
}

实际的实现对 API 用户是隐藏的。实际项目可能包含另外 100 个文件/类 do() 将调用。

该发行版将包含 2 个文件:topapi.so 和 topapi.h

用户将#include "topapi.h"在他们的代码中,并将他们的应用程序与topapi.so.

问题是:1.如何在Java中实现类似的效果(隐藏IP相关代码)2.如何向用户显示公共方法(与代码保护无关,只是上面的头文件的java版本)

4

2 回答 2

2

查看proguard。它至少会混淆 jar 文件,否则它基本上是人类可读的。逆向工程并不是绝对安全的,但我想so文件也不是。

我不是 Java 专家,但这是我们过去为保护实现所做的工作。

我不知道 Java 移植的确切动机是什么,但如果只是为了支持 Java 最终用户,您可以考虑使用 JNI 包装器。我想这可能不是这种情况,但我想我会提到它。

就向用户公开接口代码而言,您可以编写一个 Java 接口类(如纯虚拟抽象 C++ 类)而根本不保护该类。

于 2017-03-31T20:09:33.323 回答
1

回答如何向用户显示公共方法的问题。这通常是通过在没有访问修饰符的情况下声明内部类的组合来完成的,这使得它们只能从同一个包中访问,而不是记录它们。不要依赖前者,它很容易绕过,但它会向用户发送这些类是内部的消息。

Java 9 添加了允许您封装整个包的模块,但它还没有出现,您仍然可以绕过封装。

提前编译(通常是 C++ 的情况)的一个副作用是分布式代码已经优化,并且不包含元数据,因此更难进行逆向工程。Java 以中间语言分发,但实际的机器代码是在运行时生成的(JIT 编译)。中间语言实际上是未经优化的,因此更容易进行逆向工程。Java 还融合了头文件和源文件的想法,其中.class文件将包含您使用它所需的所有元数据。

于 2017-03-31T20:52:56.833 回答