创建不可反向工作的Java程序

时间:2008-09-29 18:07:53

标签: java jar compilation

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

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

源代码的混淆不计算......它使得理解代码变得更加困难,但不会隐藏它。

相关问题是 How to lock compiled Java classes to prevent decompilation?


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

我关心的是代码中是否有与远程访问相关的信息。应用程序使用用户提供的用户标识和密码连接主机。有没有办法从用户隐藏主机的地址,如果该地址位于源代码内?

14 个答案:

答案 0 :(得分:15)

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

逆向工程是一个过程,并不意味着完全依赖于代码。它基本上试图理解底层机制,然后模仿它们。例如,通过复制Netscape的JavaScript行为,无需访问代码即可从MS实验室中看到JScript。副本非常完美,即使是错误也被复制了。

答案 1 :(得分:11)

您可以使用YGuard对JAR文件进行模糊处理。 它不会混淆您的源代码,而是编译后的类,因此以后维护代码没有问题。

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

答案 2 :(得分:8)

如果您知道要定位的是哪些平台,请获取将Java编译为本机代码的内容,例如Excelsior JETGCJ

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

答案 3 :(得分:7)

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

这意味着有公开的反编译器。所需要的只是一些谷歌搜索,你有一些Java代码与你的相同。只是没有注释和一些变量名称(但函数名称保持不变)。

真的,无论如何,混淆是你可以得到的(虽然反编译的代码已经被轻微混淆了),而不用去C或其他一些完全编译的语言。

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

我很想问你为什么要这样做,但我会留下那个......

我看到的问题是,与CLR一样,JVM需要能够对代码进行内部编译,以便JIT编译并运行它。你可以把它变得更“复杂”,但鉴于字节码的规范有很好的记录,而且存在的水平比x86汇编程序规范要高得多,你不可能“隐藏”流程流,因为它有该计划首先在那里工作。

答案 6 :(得分:1)

无法做到。

任何可以编译的东西都可以解编译。你能做的最好的事情是混淆它的地狱。

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

答案 7 :(得分:1)

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

答案 8 :(得分:1)

将其变为Web服务。那么你就是唯一能看到源代码的人。

答案 9 :(得分:1)

无法做到。这不是Java问题。任何可以编译的语言都可以针对Java进行反编译,这更容易。

你试图向某人展示一张没有真正展示它们的照片。这不可能。即使您隐藏在应用程序级别,也无法隐藏主机。有人仍然可以通过Wireshark或任何其他网络嗅探器来抓取它。

答案 10 :(得分:1)

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

将您的应用程序分离为服务器代码和客户端应用程序,在服务器代码中隐藏算法的重要部分并在云服务器中运行,只需分发仅作为数据获取器和传感器的客户端代码。 / p>

即便如此,您的客户端代码也会被反编译。你没有失去任何东西。

但是,这肯定会降低性能和用户便利性。

我认为这可能不是您正在寻找的答案,而只是为了提出保护源代码的不同想法。

答案 11 :(得分:0)

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

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

因此,您可以静态隐藏它,但如果运行调试器

,则无法在运行时隐藏它

答案 12 :(得分:0)

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

答案 13 :(得分:0)

担心隐藏代码,无论如何我都会运行ProGuard