[Stupidly Simple VM ]SSVM #2 使用方法 & HelloWorld

简介: 主要类的介绍与获取方法

SSVM目录


0x1 前言

本文主要简单介绍SSVM常用类的获取方法


0x2 InstanceJavaClass

  • 如何获取InstanceJavaClass的实例?

我们使用System类来作例子

例子1:

InstanceJavaClass systemClazz = vm.getSymbols().java_lang_System();

例子2:

InstanceJavaClass systemClazz = (InstanceJavaClass) vm.findBootstrapClass("java/lang/System");

0x3 JavaMethod 与 JavaField

// JavaMethod 
JavaMethod printlnMethod = runtime.getMethod("println","(Ljava/lang/String;)V");
// JavaField
JavaField outField = system.getStaticField("out","Ljava/io/PrintStream;");

0x04 VMInterface

类似注册事件,管理调用
主要的函数

  • setInvoker
  • registerMethodEnter
  • registerMethodExit
  • registerInstructionInterceptor 能处理字节码
    例子:
            vmi.setInvoker(printlnMethod,ctx -> {
   
                //  instance
                System.out.println("this "+ ctx.getLocals().load(0));

                //  method first param is load(1)
                System.out.println("text "+ vm.getHelper().readUtf8(ctx.getLocals().load(1)));
                return Result.ABORT;
            });

0x05 简单的HelloWorld

    public static void main(String[] args2) throws Exception {
   
        VirtualMachine vm = new VirtualMachine();
        //虚拟机启动
        vm.bootstrap();

        try {
   
            // 获取Runtime & System的实例
            InstanceJavaClass system = vm.getSymbols().java_lang_System();
            InstanceJavaClass runtime = (InstanceJavaClass) vm.findBootstrapClass("java/io/PrintStream");

            // 读取out获取Runtime返回的实例
            // 用于执行println
            Value outInstance = vm.getOperations().getStaticField(system,"out","Ljava/io/PrintStream;");

            JavaMethod printlnMethod = runtime.getMethod("println","(Ljava/lang/String;)V");
            //创建Locals 
            Locals locals = vm.getThreadStorage().newLocals(printlnMethod);
            // 实例
            locals.set(0,outInstance);
            // 这是第一个参数.
            locals.set(1,vm.getHelper().newUtf8("Hello World1"));
            //用于调节 配置 虚拟机使用的
            VMInterface vmi = vm.getInterface();
            // 注册调用钩子
            vmi.setInvoker(printlnMethod,ctx -> {
   
                // instance
                System.out.println("this "+ ctx.getLocals().load(0));

                //  method first param is load(1)
                System.out.println("text "+ vm.getHelper().readUtf8(ctx.getLocals().load(1)));
                // 中止调用进行

                return Result.ABORT /*Result.CONTINUE*/;
            });

            // 调用函数
            vm.getHelper().invoke(printlnMethod,locals);
        }catch (VMException e)
        {
   
            // 处理内部虚拟机的产生的异常
            throw new Exception(vm.getHelper().toJavaException(e.getOop()));
        }
    }

运行结果:

f683d3098ed7ca2b41fcd24b1df5bf4d 拷贝.png

0x06 总结

用法上和java自带反射类似。
此外本文章进行监控的为个人编写的代码调用,实则上还可以通过URLClassPath中addURL函数加载计算机内的jar文件,使用vm.getHelper().invoke调用程序入口并注册特定函数的事件,进行监控/修改参数内容,以及追踪调用轨迹。

相关文章
|
XML Android开发 数据安全/隐私保护
10. 【Android教程】网格布局 GridLayout
10. 【Android教程】网格布局 GridLayout
861 1
|
运维 Java 应用服务中间件
BIMserver入门安装部署 - 环境搭建、数据导入及预览
BIMserver入门安装部署 - 环境搭建、数据导入及预览
2626 0
|
缓存 Kubernetes Docker
GitLab Runner 全面解析:Kubernetes 环境下的应用
GitLab Runner 是 GitLab CI/CD 的核心组件,负责执行由 `.gitlab-ci.yml` 定义的任务。它支持多种执行方式(如 Shell、Docker、Kubernetes),可在不同环境中运行作业。本文详细介绍了 GitLab Runner 的基本概念、功能特点及使用方法,重点探讨了流水线缓存(以 Python 项目为例)和构建镜像的应用,特别是在 Kubernetes 环境中的配置与优化。通过合理配置缓存和镜像构建,能够显著提升 CI/CD 流水线的效率和可靠性,助力开发团队实现持续集成与交付的目标。
|
程序员 数据安全/隐私保护 Python
1行Python代码,实现PDF的加密、解密
程序员晚枫分享使用python-office库实现PDF批量加密与解密的新方法。只需一行代码,即可完成单个或多个PDF文件的加密、解密操作,支持文件路径与正则筛选,适合自动化办公需求。更新至最新版,适配性更佳,操作更简单。
504 8
1行Python代码,实现PDF的加密、解密
|
数据可视化 数据挖掘 区块链
《区块链公链数据分析简易速速上手小册》第4章:交易数据分析(2024 最新版)(上)
《区块链公链数据分析简易速速上手小册》第4章:交易数据分析(2024 最新版)(上)
828 0
|
存储 人工智能 算法
清晰价值始于关系的建立
本文提出“关系理性”范式,重构人工智能从“工具理性”向“伙伴型AI”转变的理论与路径。通过情感共鸣、边界感知与协同进化三维模型,结合语义记忆、动态规则与反馈闭环技术,推动AI从功能服务转向有温度的人机关系构建。
731 0
|
存储 人工智能 安全
使用‘消除’技术绕过LLM的安全机制,不用训练就可以创建自己的nsfw模型
本文探讨了一种名为“abliteration”的技术,该技术能够在不重新训练大型语言模型(LLM)的情况下移除其内置的安全审查机制。通常,LLM在接收到潜在有害输入时会拒绝执行,但这一安全特性牺牲了模型的灵活性。通过对模型残差流的分析,研究人员发现可以识别并消除导致拒绝行为的特定方向,从而允许模型响应所有类型的提示。
3624 1
|
消息中间件 分布式计算 网络协议
服务搭建篇(六) 搭建基于Kafka + Zookeeper的集群
用来解决分布式集群中应用系统的一致性问题。Zookeeper 的设计目标是将那些复杂且容 易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的 接口提供给用户使用。
998 0

热门文章

最新文章