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

目录
相关文章
|
2天前
|
JavaScript 前端开发
js中的bind,call,apply方法的区别以及用法
JavaScript中,`bind`、`call`和`apply`均可改变函数的`this`指向并传递参数。其中,`bind`返回一个新函数,不立即执行;`call`和`apply`则立即执行,且`apply`的参数以数组形式传递。三者在改变`this`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
|
28天前
|
JavaScript 前端开发
JS高级—call(),apply(),bind()
【10月更文挑战第17天】call()`、`apply()`和`bind()`是 JavaScript 中非常重要的工具,它们为我们提供了灵活控制函数执行和`this`指向的能力。通过合理运用这些方法,可以实现更复杂的编程逻辑和功能,提升代码的质量和可维护性。你在实际开发中可以根据具体需求,选择合适的方法来满足业务需求,并不断探索它们的更多应用场景。
10 1
|
3月前
|
C# C++
【Azure Function】在VS Code中创建Function项目遇见 No .NET worker runtimes found
【Azure Function】在VS Code中创建Function项目遇见 No .NET worker runtimes found
|
6月前
|
前端开发 JavaScript
前端 JS 经典:apply、call、bind
前端 JS 经典:apply、call、bind
94 0
|
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.
178 0
vue报错: ERROR ~/.vuerc may be outdated. Please delete it and re-run vue-cli in manual mode.
|
6月前
|
JavaScript
提供一个具体的示例来说明`provide`和`inject`的用法。
提供一个具体的示例来说明`provide`和`inject`的用法。
32 0
/etc/init.d/functions运用实战配置system服务详解
/etc/init.d/functions运用实战配置system服务详解
|
前端开发
前端学习案例1:apply,call,bind使用1
前端学习案例1:apply,call,bind使用1
80 0
前端学习案例1:apply,call,bind使用1
|
前端开发
前端学习案例2:apply,call,bind使用2
前端学习案例2:apply,call,bind使用2
74 0
前端学习案例2:apply,call,bind使用2