[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调用程序入口并注册特定函数的事件,进行监控/修改参数内容,以及追踪调用轨迹。

相关文章
|
Android开发
【错误记录】Android 可执行权限报错 ( Cannot run program “/data/user/0/cn.e/ffmpeg“: error=13,Permission denied )
【错误记录】Android 可执行权限报错 ( Cannot run program “/data/user/0/cn.e/ffmpeg“: error=13,Permission denied )
2076 0
【错误记录】Android 可执行权限报错 ( Cannot run program “/data/user/0/cn.e/ffmpeg“: error=13,Permission denied )
|
4月前
|
设计模式 存储 SQL
【Java并发】【volatile】适合初学者体质的volatile
当你阅读dalao的框架源码的时候,你是否会见到这样一个关键字 - - - volatie,诶,你是否会好奇,为什么要加它?加了它有什么作用?
131 14
【Java并发】【volatile】适合初学者体质的volatile
|
人工智能 对象存储
【阿里云AI助理】自家产品提供错误答案。阿里云OSS 资源包类型: 下行流量 地域: 中国内地通用 下行流量包规格: 300 GB 套餐: 下行流量包(中国内地) ,包1年。那么这个是每月300GB,1年是3600GB的流量;还是1年只有300GB的流量?
自家产品提供错误答案。阿里云OSS 资源包类型: 下行流量 地域: 中国内地通用 下行流量包规格: 300 GB 套餐: 下行流量包(中国内地) ,包1年。那么这个是每月300GB,1年是3600GB的流量;还是1年只有300GB的流量?
216 1
|
7月前
|
安全 编译器 C++
C++ `noexcept` 关键字的深入解析
`noexcept` 关键字在 C++ 中用于指示函数不会抛出异常,有助于编译器优化和提高程序的可靠性。它可以减少代码大小、提高执行效率,并增强程序的稳定性和可预测性。`noexcept` 还可以影响函数重载和模板特化的决策。使用时需谨慎,确保函数确实不会抛出异常,否则可能导致程序崩溃。通过合理使用 `noexcept`,开发者可以编写出更高效、更可靠的 C++ 代码。
182 1
|
9月前
|
存储
在使用 realloc 函数时,如何避免数据丢失?
在使用 realloc 函数动态调整内存大小时,为避免数据丢失,应先将原指针保存到临时变量中,调用 realloc 后检查返回值是否为 NULL,若为 NULL 则保留原指针,否则更新指针并释放临时变量。
|
11月前
|
算法 数据可视化 机器人
ROS2教程01 ROS2介绍
本文是ROS2(机器人操作系统的下一代)的介绍教程,内容包括ROS2的诞生背景、核心功能、特点、框架以及与ROS1的比较。文章涵盖了ROS2的通信系统、框架和工具、生态系统、全球性社区支持、完全开源、跨平台特性、多机协同能力、实时系统支持和更强的稳定性。此外,还提供了ROS2架构的详细介绍资源链接,适合对ROS2感兴趣的读者学习和了解。
869 1
|
Java 编译器
Java中的return语句深入解析
Java中的return语句深入解析
662 0
|
存储 IDE Java
Java一分钟之变量声明与初始化基础
【5月更文挑战第7天】本文介绍了Java编程中的变量声明与初始化,包括变量的类型和命名规则,以及显式和默认初始化。文章强调了局部变量必须初始化的重要性,并列举了三个常见问题:类型不匹配、未初始化和作用域混淆。为避免这些问题,建议明确类型、主动初始化、注意作用域,并利用IDE辅助。通过示例代码展示了正确使用变量的方法,鼓励读者通过实践加深理解。
233 0
|
存储 Rust 安全
Rust中的变量与常量:定义与使用的深入解析
本文将详细探讨Rust编程语言中变量与常量的定义、特性及其使用场景。我们将从基本概念出发,逐步深入到Rust的内存管理、所有权系统和不变性原则,帮助读者更好地理解和应用这两种基础元素。
|
Ubuntu Windows
双系统下ubuntu系统扩容
双系统下ubuntu系统扩容
341 1
AI助理

你好,我是AI助理

可以解答问题、推荐解决方案等

登录插画

登录以查看您的控制台资源

管理云资源
状态一览
快捷访问