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

目录
相关文章
react-Native init初始化项目报错”TypeError: cli.init is not a function“
react-Native init初始化项目报错”TypeError: cli.init is not a function“
699 1
|
6月前
|
Java Scala
idea报错“Static methods in interface require -target:jvm-1.8”
idea报错“Static methods in interface require -target:jvm-1.8”
43 0
|
6月前
|
Python
IDA3.12版本的python,依旧报错IDAPython: error executing init.py.No module named ‘impRefer to the message win
IDA3.12版本的python,依旧报错IDAPython: error executing init.py.No module named ‘impRefer to the message win
|
JavaScript
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
Vue 打包后打开为空白页面 并且控制台报错‘Failed to load resource: net::ERR_FILE_NOT_FOUND’
|
JavaScript
vue报错: ERROR ~/.vuerc may be outdated. Please delete it and re-run vue-cli in manual mode.
vue报错: ERROR ~/.vuerc may be outdated. Please delete it and re-run vue-cli in manual mode.
174 0
vue报错: ERROR ~/.vuerc may be outdated. Please delete it and re-run vue-cli in manual mode.
|
6月前
|
JavaScript
提供一个具体的示例来说明`provide`和`inject`的用法。
提供一个具体的示例来说明`provide`和`inject`的用法。
29 0
|
6月前
|
小程序 API 定位技术
【uni-app报错】选择地址:fail the api need to be declared in the requiredPrivateInfos field in app/ext.json
【uni-app报错】选择地址:fail the api need to be declared in the requiredPrivateInfos field in app/ext.json
550 0
|
开发者
如何使用 ABAP Function Module SEO_CLASS_CREATE_COMPLETE 创建 ABAP class
如何使用 ABAP Function Module SEO_CLASS_CREATE_COMPLETE 创建 ABAP class
|
JavaScript
vue动态加载的菜单报错Cannot find module xxxxxx 与the request of a dependency is an expression 解决方法
vue动态加载的菜单报错Cannot find module xxxxxx 与the request of a dependency is an expression 解决方法
684 0
|
Python
Flask - 解决 app.run() 添加 host、port、debug 参数后运行不生效的问题
Flask - 解决 app.run() 添加 host、port、debug 参数后运行不生效的问题
609 0
Flask - 解决 app.run() 添加 host、port、debug 参数后运行不生效的问题