首页 > 系统相关 >GraalVM 打包 Java ShellcodeLoader 为可执行文件

GraalVM 打包 Java ShellcodeLoader 为可执行文件

时间:2023-09-04 09:23:27浏览次数:95  
标签:exe Java image jar ShellcodeLoader 打包 GraalVM

GraalVM 打包 Java ShellcodeLoader 为可执行文件


url: https://app.yinxiang.com/fx/a6667249-7c5e-40dd-8bf6-e474fc844163
title: GraalVM 打包 Java ShellcodeLoader 为可执行文件
date: 2023-03-02 12:37:26


打包成 Jar 包

先上项目地址:https://github.com/yzddmr6/Java-Shellcode-Loader

下载后用 IDEA 打开,在项目结构里把 lib 目录添加到依赖库里面。

之后构建 Artifacts,打包成 jar 包。

安装 GraalVM

接下来开始把 jar 包打包成 exe 可执行文件。按照这篇文章里面的方法,我这里选择下载 Oracle 企业版的 GraalVM(貌似企业版的运行快一点?)链接如下:
https://www.oracle.com/downloads/graalvm-downloads.html
总共需要下载两个文件,第一个是 GraalVM 本体,下载后解压就能用。第二个 native image 就是用来打包 exe 的插件,下载后是个 jar 包。

2023年8月8日更新:GraalVM JDK 20 之后的版本已经自带 native-image 插件,不需要额外下载了。

下载之后,参考官方教程离线安装 native image 插件,网速好的话也可以在线安装。

graalvm-ee-java11-22.3.1\bin\gu.cmd -L install native-image-installable-svm-svmee-java11-windows-amd64-22.3.1.jar

安装完成后 bin 目录下面会多出来 native-image 的一些 cmd 脚本,后面打包成 exe 就需要用到这些脚本。

到了这一步,就能够用 native-image 打包一些简单的 java 项目了,但是由于 ShellcodeLoader 的依赖库 tinyjna.jar 用到了不少反射相关的技术,直接打包的话 GraalVM 是不知道要把哪些动态加载的类打包进去的,直接打包的话会提示由于使用了反射且未指定配置文件,无法生成 stand-alone 形式的 image,而是会生成一个 fallback 的 image。

因此需要帮助 GraalVM 找到需要在运行时动态加载的类。这里的步骤参考 Build a Native Executable with Reflection,通过运行时加载 agent 的方式监控反射用到的类,然后把这些类的名称保存到一个配置文件中,打包的时候再根据配置文件将这些类打包到 exe 里面。

在 ShellcodeLoader 的同级目录新建文件夹META-INF\native-image,然后运行 ShellcodeLoader,这里的 shellcode 可以随便填,比如我填的 abcdef,执行不了也无妨,只是为了让 agent 知道反射调用了哪些类。

graalvm-ee-java11-22.3.1/bin/java -agentlib:native-image-agent=config-output-dir=META-INF/native-image -jar ShellcodeLoader.jar abcdef

运行之后就会在上面新建的目录里面生成配置文件。

接下来就是通过加载配置文件打包成 exe 了,在此之前需要注意一下,由于打包成 exe 需要使用 msvc 生成工具,否则会提示找不到 cl.exe。所以需要安装 msvc 并且通过开始菜单启动专用的控制台。

PS: 第一次打包我没用专用控制台,而是把 msvc 的 bin 目录加到环境变量里面,虽然找到了 cl.exe 但后续还是报错了。

2023年8月8日更新: GraalVM JDK 20 之后的版本可以在 Windows 上可以自动设置构建环境,不再需要在 x64 Native Tools Command Prompt 中运行。但是打包的时候需要添加额外参数-H:-CheckToolchain

GraalVM JDK 20 更新日志

启动专用控制台之后切换到 ShellcodeLoader.jar 所在的目录,执行打包命令,这里必需添加 -cp . 参数,表示将当前目录添加到 classpath,否则会找不到配置文件。

graalvm-ee-java11-22.3.1/bin/native-image.cmd -jar ShellcodeLoader.jar -cp .

如果使用  GraalVM JDK 20 以上版本,且不在x64 Native Tools Command Prompt 中运行,则需要添加额外参数:

graalvm-ee-java11-22.3.1/bin/native-image.cmd -jar ShellcodeLoader.jar -H:-CheckToolchain -cp .

打包完成后会生成如下三个文件,那个 dll 不知道有什么用,删除了也不影响 exe 正常运行。

--------------------------------------------------------------
Produced artifacts:
 D:\Java-Shellcode-Loader\out\artifacts\ShellcodeLoader_jar\ShellcodeLoader.build_artifacts.txt (txt)
 D:\Java-Shellcode-Loader\out\artifacts\ShellcodeLoader_jar\ShellcodeLoader.exe (executable)
 D:\Java-Shellcode-Loader\out\artifacts\ShellcodeLoader_jar\sunmscapi.dll (jdk_lib)
=====================================
Finished generating 'ShellcodeLoader' in 45.8s.

免杀效果还是不错的,VT 全过,就是生成的 exe 太大了,足足 15M,甚至比精简过的 JRE 还大。

还试了下将 msf 的java/meterpreter/reverse_tcp生成的 jar 包转 exe,结果也是 15M 的大小,而且还运行报错

Meterpreter session 4 is not valid and will be closed

后续或许可以参考精简 JRE 的思路把 GraalVM 的几个 jar 包也精简一下。
Oracle 官方也提供了减少镜像大小的一种方式:https://docs.oracle.com/en/graalvm/enterprise/22/docs/reference-manual/native-image/guides/use-graalvm-dashboard/

参考:
https://blog.csdn.net/xianzhan_/article/details/108181095
https://github.com/yzddmr6/Java-Shellcode-Loader
精简JRE,打造无依赖的Java-ShellCode-Loader

标签:exe,Java,image,jar,ShellcodeLoader,打包,GraalVM
From: https://www.cnblogs.com/lovelyjuice/p/graalvm-package-java-shellcodeloader-is-executable-f

相关文章

  • Failed to start bean 'documentationPluginsBootstrapper'; nested exception is jav
    2023-09-0322:53:53.622WARN20788---[main]ConfigServletWebServerApplicationContext:Exceptionencounteredduringcontextinitialization-cancellingrefreshattempt:org.springframework.context.ApplicationContextException:Failedtostartbean......
  • Java泛型
    Java泛型1.泛型概述泛型的本质是为了参数化类型(即限制参数类型为我们指定泛型类型)如这样:给list集合指定类型String//比如给List集合指定一个泛型(String),那么存入List集合中的元素必须要是String类型List<String>list=newArrayList<String>();2.泛型的优点限制变量的类......
  • 【面试题精讲】Java Stream排序的实现方式
    首发博客地址系列文章地址如何使用JavaStream进行排序在Java中,使用Stream进行排序可以通过sorted()方法来实现。sorted()方法用于对Stream中的元素进行排序操作。具体实现如下:对基本类型元素的排序:使用sorted()方法对Stream进行排序,默认是按照自然顺序进行排序。例如,对......
  • Java项目日常开发中使用BigDecimal常见问题总结
    Java项目中有计算精度要求高的场景(如金额计算)会使用BigDecimal类型来代替Double、Float。本文整理了一些日常开发中使用BigDecimal值得注意的问题和代码实例。BigDecimal初始化时入参应使用String类型例1:BigDecimalx=newBigDecimal(3.33);BigDecimaly=newBigDecima......
  • Java线程池面试题集
    以面试官视角万字解读线程池10大经典面试题!(这个链接里难的要命)线程池面试连环炮,你能抗住几题?(这个链接里比较正常)什么是线程池?为什么要使用线程池?线程池就是采用池化思想管理线程的工具。JUC为我们提供了ThreadPoolExecutor体系类来帮助我们管理线程、并行执行任务。顶级接......
  • Java智慧工地源码:进度、质量、 成本、安全尽在掌握
    智慧工地是一种崭新的工程全生命周期管理理念。智慧工地是智慧城市在建筑施工领域的延伸,是智慧城市的“基石”。随着工程信息化管理技术的发展,移动互联网、物联网、AI、大数据等新技术与施工现场业务场景深度融合,智慧工地已成为建筑工地信息化建设和创新的热点。智慧工地将更多人......
  • java语言B/S医院HIS系统【springboot】
     医院云HIS全称为基于云计算的医疗卫生信息系统(Cloud-BasedHealthcareInformationSystem),是运用云计算、大数据、物联网等新兴信息技术,按照现代医疗卫生管理要求,在一定区域范围内以数字化形式提供医疗卫生行业数据收集、存储、传递、处理的业务和技术平台,实现区域内医疗卫生......
  • 基于JavaWeb实现智慧菜市场系统的设计与实现程序
    作者主页:编程指南针作者简介:Java领域优质创作者、阿里云博客专家、51CTO特邀作者、多年架构师设计经验、腾讯课堂常驻讲师主要内容:Java项目、Python项目、前端项目、人工智能与大数据、简历模板、学习资料、面试题库、技术互助收藏点赞不迷路 关注作者有好处目录一,环境介绍二,项目......
  • Java垃圾回收全过程
    JVM中一次完整的垃圾回收(GC)过程。这里以HotSpot虚拟机为例,并将参考其中的一种常用的垃圾回收器:G1(Garbage-First)。堆的划分在HotSpotJVM中,堆(Heap)通常被划分为以下几个部分:年轻代(YoungGeneration):这部分进一步分为Eden区和两个Survivor区(S0和S1)。老年代(OldGeneration):存放长时间......
  • 《Java编程思想第四版》学习笔记22
    注意下面这两句话:1、针对g()和main(),Throwable类必须在违例规格中出现,因为fillInStackTrace()会生成一个Throwable对象的句柄。由于Throwable是Exception的一个基础类,所以有可能获得一个能够“掷”出的对象(具有Throwable属性),但却并非一个Exception(违例)。因此,在main()......