0

我正在编写一个桌面 java 应用程序。该程序从客户的服务器接收 XML 文件。几个标签中的数据是整数类型,并使用一些数学公式“加密”。当我的程序解析 XML 文件时,我需要解密这些标签。解密公式如下:
int decrypted = (int) Math.ceil(Math.pow ((idProduct + 1) / 3, 1.5));
解密后的数据然后保存到 H2 数据库,该数据库使用 AES-128 加密。

我需要的是以某种方式隐藏这些公式以防止反编译。

我的尝试:
1. 为了隐藏我尝试使用混淆器的公式,但我没有发现任何与公式有关的东西。这是一段被 ProGuard 4.8 混淆并被 JAD 反编译的代码:

private String d(String paramString) {
   long l = Long.valueOf(paramString).longValue();
   int i = (int)Math.ceil(Math.pow((l + 1L) / 3L, 1.5D));
   String str = String.valueOf(i);

   return str;
}

正如你所看到的,ProGuard 没有对公式做任何事情。我们不能使用像 Zelix KlassMaster 这样的商业混淆器。
2. 我想试试 JET Excelsior(但似乎还不支持 java 7 应用程序)。此外,我认为我的老板不会欣赏它。
3.我也想过用一些像launch4j这样的包装器,但不知道提取.jar是否难。
4.然后我想用C写一个外部lib并使用JNI。但似乎竞争对手只能使用该库。
5. IMO 的好解决方案是在 ASM 中编写解密函数并将其直接粘贴到 java 代码中,就像我们可以这样做是 C。不幸的是,这是不可能的。
6.类的加密没用.
我知道一切都可以反编译/反汇编,我只是想让它比只运行 JAD 并立即获取它更难一点。

请给我提意见

4

2 回答 2

2

当您考虑在 asm/c/c++ 中编写公式然后通过 JNI 访问它时,这意味着在不同的指令集中表示公式。您可以发明自己的指令集,而不是使用硬件指令集,并将解释器嵌入到您的代码中。这有性能较差的缺点,但有使用不常见指令集的优势,因此竞争对手应该首先从解释器的字节码重构您的自制指令集。您可以将指令集设计为比 x86 更难理解。

然后,您可以递归地应用这个想法:在另一个解释指令集中编写解释器等。

于 2013-01-17T10:10:24.607 回答
0

您无法向决心找到它的人隐藏公式。

混淆 Java 代码没有任何作用,因为 .class 文件可以被反编译并且算法相对容易提取。

您可以做的最好的事情是在 C/C++ 中实现公式并通过 JNI 链接它。但即使采用这种方法,也有人可以反编译 C++ 并通过一些努力对过程进行逆向工程。

如果您的应用程序具有提供这样做的机会的结构,您可以通过将其分散在几个必须在处理期间都调用的不相关方法中来隐藏它。

于 2013-01-17T08:48:15.117 回答