5

有没有办法以不可逆向工程的格式部署 Java 程序?

我知道如何将我的应用程序转换为可执行的 JAR 文件,但我想确保代码不能被逆向工程,或者至少不容易被逆向工程。

源代码的混淆不算……它使代码更难理解,但不会隐藏它。

一个相关的问题是如何锁定已编译的 Java 类以防止反编译?


完成程序后,我仍然可以访问原始源,因此维护应用程序不会成为问题。如果应用程序是分布式的,我不希望任何用户能够反编译它。混淆并不能实现这一点,因为用户仍然可以反编译它,虽然他们很难遵循操作流程,但他们将能够看到代码,并可能从中获取信息。

我担心的是代码中是否有与远程访问相关的任何信息。应用程序使用用户提供的用户 ID 和密码连接到一个主机。如果该地址位于源代码中,有没有办法向用户隐藏主机地址?

4

14 回答 14

15

简短的回答是“不,它不存在”。

逆向工程是一个根本不需要查看代码的过程。它基本上是试图理解底层机制,然后模仿它们。例如,这就是 JScript 从 MS 实验室中出现的方式,通过复制 Netscape 的 JavaScript 行为,而无需访问代码。副本是如此完美,以至于连错误都被复制了。

于 2008-09-29T18:15:16.983 回答
12

您可以使用YGuard混淆您的 JAR 文件。它不会混淆你的源代码,而是编译的类,所以以后维护代码没有问题。

如果你想隐藏一些字符串,你可以加密它,使得通过查看源代码更难得到它(如果你混淆 JAR 文件会更好)。

于 2008-09-29T18:10:33.780 回答
8

如果您知道您的目标平台是什么,请获取将您的 Java 编译为本机代码的工具,例如Excelsior JETGCJ

除此之外,您永远无法隐藏源代码,因为用户始终拥有您的字节码并且可以对其进行Jad

于 2008-09-29T18:14:34.927 回答
7

您正在使用一种将内省作为核心语言的一部分的语言进行写作。它生成.class规范广为人知的文件(从而使其他供应商能够生产 Java 编译器和解释器的洁净室实现)。

这意味着有公开可用的反编译器。所需要的只是一些 Google 搜索,并且您有一些 Java 代码与您的代码执行相同的操作。只是没有注释和一些变量名(但函数名保持不变)。

真的,混淆是你能得到的所有东西(尽管反编译的代码已经被稍微混淆了),而无需使用 C 或其他一些完全编译的语言,无论如何。

于 2008-09-29T18:13:31.823 回答
3

不要使用解释性语言?你到底想保护什么?如果它足够有价值,任何东西都可以被逆向工程。有人足够关心对大多数项目进行逆向工程的可能性很小。混淆至少提供了一个最小的障碍。

确保您的知识产权(IP) 通过其他机制得到保护。特别是对于安全代码,重要的是人们能够检查实现,以便安全在算法中,而不是在源代码中。

于 2008-09-29T18:16:46.340 回答
2

我很想问你为什么要这样做,但我会不理会它......

我看到的问题是 JVM 和 CLR 一样,需要能够解释您的代码,以便 JIT 编译和运行它。你可以让它更“复杂”,但考虑到字节码的规范是相当有据可查的,并且比 x86 汇编器规范存在更高的层次,你不太可能“隐藏”流程,因为它有在那里让程序首先工作。

于 2008-09-29T18:12:22.043 回答
1

这是不可能的。

任何可以编译的东西都可以反编译。你能做的最好的事情就是把它搞糊涂。

话虽如此,量子密码学中发生了一些有趣的事情。本质上,任何阅读消息的尝试都会改变它。我不知道这是否可以应用于源代码。

于 2008-09-29T18:15:08.327 回答
1

即使您将代码编译成本地机器语言,也有各种各样的程序可以让您从本质上将其反编译成汇编语言并遵循流程(OlyDbg,IDA Pro)。

于 2008-09-29T19:06:57.593 回答
1

把它变成一个网络服务。那么你是唯一可以看到源代码的人。

于 2008-09-29T19:43:29.783 回答
1

这是不可能的。这不是 Java 问题。任何可以编译的语言都可以为Java反编译,这更容易。

您正在尝试向某人展示图片而不实际展示他们。这不可能。即使您隐藏在应用程序级别,您也无法隐藏您的主机。仍然有人可以通过Wireshark或任何其他网络嗅探器捕获它。

于 2008-09-30T11:14:33.180 回答
1

正如上面有人所说,逆向工程总是可以反编译您的可执行文件。保护您的源代码(或算法)的唯一方法是不分发您的可执行文件。

separate your application into a server code and a client app, hide the important part of your algorithm in your server code and run it in a cloud server, just distribute the client code which works only as a data getter and senter.

By this even your client code is decompiled. You are not losing anything.

But for sure this will decrease the performance and user convenience.

I think this may not be the answer you are looking for, but just to raise different idea of protecting source code.

于 2015-02-22T22:05:18.230 回答
0

在某些时候任何解释的东西都必须“以明确的方式”处理。一旦代码通过 JAD 运行,该字符串将清楚地显示为 day。您可以使用您的应用程序部署加密密钥,或者使用基本的 ceasar 密码来加密主机连接信息并在运行时解密......

但是在处理过程中的某些时候,必须明确主机连接信息,以便您的应用程序连接到主机......

所以你可以静态隐藏它,但如果他们运行调试器,你不能在运行时隐藏它

于 2008-09-29T20:19:27.620 回答
0

这是不可能的。CPU 必须执行您的程序,即您的程序必须采用 CPU 可以理解的格式。CPU 比人类笨得多。因此,如果 CPU 可以理解您的程序,那么人类也可以。

于 2008-09-29T23:06:51.463 回答
0

由于担心隐藏代码,我还是会运行ProGuard

于 2008-12-03T06:56:57.277 回答