利用GraalVM实现免杀加载器
起因是与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.
性能优化就不说了,关键它支持多种主流语言的JIT和Java的AOT,也就是可以编译成不依赖外部JRE的PE/ELF,大家有没有想起些什么~
精简JRE,打造无依赖的Java-ShellCode-Loader
Mr6师傅通过将精简JRE与JavaShellCodeLoader打包的方式,实现了免杀良好的加载器。GraalVM则是将class编译为了机器码,一般不用再单独打包且性能更好(Elegant, Very elegant
如何整活
准备好需要的编译环境
正常编写java并编译为class
通过
native-image YourClass
编译为PE/ELF
注意上文说了一般,写个Runtime执行命令自然没有问题,但如果用到了反射等动态特性,就得引入它的agent执行class让它分析一下,生成几个后面native-image
会用到的配置文件:
Introducing the Tracing Agent: Simplifying GraalVM Native Image Configuration
1 | mkdir -p META-INF/native-image |
不过。。。反正我抄出来的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。
1 | C:\Program Files (x86)\Windows Kits\10\Include\10.0.17134.0\um; |
最终效果
VT几乎全过,相信我那一个红的是误报(2333
原生shellcode就能过defender,不过瞎捣鼓还是有几率被杀~