起因是与NoOne想围观一下CS47又整了些什么反破解操作,发现TeamServerImage套了个GraalVM。贴一段官网的介绍以及如何看待乎的链接:

Get started with GraalVM – is a high-performance JDK designed to accelerate Java application performance while consuming fewer resources. GraalVM offers two ways to run Java applications: on the HotSpot JVM with Graal just-in-time (JIT) compiler or as an ahead-of-time (AOT) compiled native executable. Besides Java, it provides runtimes for JavaScript, Ruby, Python, and a number of other popular languages. GraalVM’s polyglot capabilities make it possible to mix programming languages in a single application while eliminating any foreign language call costs.

如何评价 GraalVM 这个项目?

性能优化就不说了,关键它支持多种主流语言的JIT和Java的AOT,也就是可以编译成不依赖外部JRE的PE/ELF,大家有没有想起些什么~

精简JRE,打造无依赖的Java-ShellCode-Loader

Mr6师傅通过将精简JRE与JavaShellCodeLoader打包的方式,实现了免杀良好的加载器。GraalVM则是将class编译为了机器码,一般不用再单独打包且性能更好(Elegant, Very elegant

如何整活

  1. 跟着官方文档安装好CE版本corenative-image,也可以从Oracle下EE版本

  2. 准备好需要的编译环境

  3. 正常编写java并编译为class

  4. 通过native-image YourClass编译为PE/ELF

注意上文说了一般,写个Runtime执行命令自然没有问题,但如果用到了反射等动态特性,就得引入它的agent执行class让它分析一下,生成几个后面native-image会用到的配置文件:

Introducing the Tracing Agent: Simplifying GraalVM Native Image Configuration

1
2
mkdir -p META-INF/native-image
$JAVA_HOME/bin/java -agentlib:native-image-agent=config-output-dir=META-INF/native-image HelloReflection foo xyz

不过。。。反正我抄出来的JavaShellCodeLoader这样子干它是分析不出的。。。

在没提供额外配置且用到了反射时,native-image会编译为fallback image,需要把class文件和PE/ELF放一起才可以正常执行。虽然可以用enigmavb打包解决,还是希望会的师傅指点一下我怎么原生编译出来Orz

另一个问题是在Linux编译时默认会依赖libc,出于兼容考虑应该可以在很老的系统上编译,或者跟着文档准备好环境,通过--static --libc=musl参数静态打包。

我因为一些库本来就有或是通过pamac装上了,没完全按步骤走然后报错了,似乎是把-lz参数当成文件:

更新:

Linux升级ld后似乎没问题了,Windows上需要加入VS和SDK的环境变量。找不到tools.jar里的类时需要-cp指定JAR包。动态类加载参考这个PR

最终效果

VT几乎全过,相信我那一个红的是误报(2333

原生shellcode就能过defender,不过瞎捣鼓还是有几率被杀~