使用 GraalVM Native Image 代替混淆

Posted

技术标签:

【中文标题】使用 GraalVM Native Image 代替混淆【英文标题】:Using GraalVM Native Image instead of obfuscation 【发布时间】:2021-12-05 00:20:42 【问题描述】:

我一直在为不同的目的开发后端平台,有时客户希望将此产品作为本地软件安装在他们的数据中心中。 所以为了防止逆向工程,我使用了混淆工具。

我想知道使用GraalVM Native Image 技术编译可部署应用程序是否是防止逆向工程的替代解决方案。

我知道原生镜像不能被反编译,所以逆向工程是不可能的。

【问题讨论】:

【参考方案1】:

一般来说,任何软件都可以进行逆向工程,因此这样做需要权衡取舍和复杂性。

GraalVM 原生镜像确实会生成原生可执行文件或共享库,并且对逻辑进行逆向工程的工作量比使用普通 jar 文件要高。

但是,人们需要始终小心他们的目标和潜在的威胁媒介。例如,本机映像构建过程可以将字符串保存在二进制文件中。例如,我有一个原生镜像构建二进制 primes-serial。运行类似:

strings primes-serial | grep com.oracle.svm.core.VM
Ocom.oracle.svm.core.VM
com.oracle.svm.core.VM.Target.Libraries=stdc++|pthread|dl|z|rt
com.oracle.svm.core.VM=GraalVM 20.2.0 Java 11 EE
com.oracle.svm.core.VM.Target.StaticLibraries=liblibchelper.a|libnet.a|libffi.a|libextnet.a|libnio.a|libjava.a|libfdlibm.a|libsunec.a|libzip.a|libjvm.a
com.oracle.svm.core.VM.Target.LibC=com.oracle.svm.core.posix.linux.libc.GLibC
com.oracle.svm.core.VM.Target.Platform=org.graalvm.nativeimage.Platform$LINUX_AMD64
com.oracle.svm.core.VM.Target.CCompiler=gcc|redhat|x86_64|4.8.5

您可以看到二进制文件中保留了一些信息。

因此,最初运行混淆器然后构建本机映像可能会很有趣。

但通常二进制文件可以像任何本机可执行文件一样被反汇编。

【讨论】:

以上是关于使用 GraalVM Native Image 代替混淆的主要内容,如果未能解决你的问题,请参考以下文章

GraalVM Native Image 在 Springdoc 依赖上失败

在spring boot3中使用native image

Spring Boot 3的AOT(GraalVM Native Image)应用开发

Spring Boot 3的AOT(GraalVM Native Image)应用开发

基于 docker 构建 graalvm native 应用程序

基于 docker 构建 graalvm native 应用程序