创建不可逆工程的Java程序

时间:2020-03-06 14:53:17  来源:igfitidea点击:

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

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

对源代码的混淆不算在内……这使理解代码变得更加困难,但并没有将其隐藏。

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

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

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

解决方案

我们可以使用YGuard混淆JAR文件。它不会混淆源代码,但会混淆已编译的类,因此以后维护代码没有问题。

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

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

我看到的问题是,像CLR一样,JVM需要能够对代码进行整编,以便JIT编译并运行它。我们可以使其更加"复杂",但是鉴于字节码的规范已被很好地记录下来,并且比x86汇编器规范的水平更高,因此我们不太可能"隐藏"流程,因为它已经该程序首先要在那里工作。

我们所使用的语言是内省作为核心语言的一部分。它生成其规范众所周知的.class文件(从而使其他供应商能够生成Java编译器和解释器的洁净室实现)。

这意味着有公开可用的反编译器。只需进行几次Google搜索,即可获得与Java代码功能相同的Java代码。只是没有注释,还有一些变量名(但函数名保持不变)。

确实,混淆几乎是我们所能获得的(尽管反编译的代码已经被稍微混淆了),无论如何都无需使用C或者其他完全编译的语言。

如果知道目标平台,则可以将Java编译为本地代码,例如Excelsior JET或者GCJ。

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

不能做

可以编译的任何东西都可以反编译。我们能做的最好的事情就是将它弄糊涂了。

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

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

逆向工程是一个过程,并不意味着完全不看代码。基本上,它是在试图了解潜在的机制,然后模仿它们。例如,通过复制Netscape的JavaScript行为而无需访问代码,JScript就是这样在MS实验室中出现的。该副本非常完美,甚至可以复制错误。

不使用翻译语言吗?我们到底想保护什么?如果它足够有价值,那么任何东西都可以进行反向工程。有人足够照顾以对大多数项目进行逆向工程的机会很小。混淆至少提供了最小的障碍。

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

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

使其成为Web服务。然后,我们是唯一可以看到源代码的人。

在某种程度上,任何解释都必须"明文"处理。一旦代码通过JAD运行,该字符串将清晰地显示为一天。我们可以在应用程序中部署加密密钥,或者执行基本的ceasar密码来加密主机连接信息并在运行时解密...

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

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

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

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

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

考虑到隐藏代码,我还是要运行ProGuard。