创建非反向工程的Java程序

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

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

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

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


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

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

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

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

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

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

如果您知道要定位的平台,那么可以将Java编译为本机代码,例如Excelsior JET或GCJ 。

除此之外,你永远无法隐藏源代码,因为用户总是拥有你的字节码并且可以对它进行Jad 。

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

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

实际上,无论如何,混淆是你可以得到的所有东西(虽然反编译的代码已经被轻微混淆了),而没有使用C或其他一些完全编译的语言。

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

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

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

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

它无法完成。

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

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

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

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

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

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

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

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

因此,您可以静态隐藏它,但如果运行调试器,则无法在运行时隐藏它

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

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

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

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

甚至您的客户端代码也会被反编译。 你没有失去任何东西。

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

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