[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`指向及传参上功能相似,但在执行时机和参数传递方式上有所区别。
29 1
|
3月前
|
JavaScript 前端开发
JS高级—call(),apply(),bind()
【10月更文挑战第17天】call()`、`apply()`和`bind()`是 JavaScript 中非常重要的工具,它们为我们提供了灵活控制函数执行和`this`指向的能力。通过合理运用这些方法,可以实现更复杂的编程逻辑和功能,提升代码的质量和可维护性。你在实际开发中可以根据具体需求,选择合适的方法来满足业务需求,并不断探索它们的更多应用场景。
14 1
|
5月前
|
设计模式 开发框架 .NET
分享一个 .NET Core Console 项目使用依赖注入的详细例子
分享一个 .NET Core Console 项目使用依赖注入的详细例子
106 0
|
5月前
|
Oracle Java 关系型数据库
简单记录在Linux上安装JDK环境的步骤,以及解决运行Java程序时出现Error Could not find or load main class XXX问题
本文记录了在Linux系统上安装JDK环境的步骤,并提供了解决运行Java程序时出现的"Error Could not find or load main class XXX"问题的方案,主要是通过重新配置和刷新JDK环境变量来解决。
170 0
|
8月前
|
JavaScript 前端开发 Linux
vue3在Linux下无法正常启动:esbuild-linux-64、cantnot start service :host version “0.13.15“,esbuild EACCESS
vue3在Linux下无法正常启动:esbuild-linux-64、cantnot start service :host version “0.13.15“,esbuild EACCESS
529 0
/etc/init.d/functions运用实战配置system服务详解
/etc/init.d/functions运用实战配置system服务详解
|
API
【.NET 6】使用.NET 6开发minimal api以及依赖注入的实现、VS2022热重载和自动反编译功能的演示
.net 6 LTS版本发布已经有若干天了。此处做一个关于使用.net 6 开发精简版webapi(minimal api)的入门教程,以及VS2022 上面的两个强大的新技能(热重载、代码自动反编译)的顺带演示。
415 0
【.NET 6】使用.NET 6开发minimal api以及依赖注入的实现、VS2022热重载和自动反编译功能的演示
|
JavaScript 前端开发
浅谈JS中call()和apply()的区别和用途?
前言: 在JavaScript中,this指向问题一直是一个老生常谈的问题。很多小伙伴应该都知道在js中,this指向哪里通常是在函数调用的时候才确定的,简单来说就是谁调用了函数则this指向谁,当然,这只是狭义的,更加详细的介绍大家可以去看《你不知道的Javascript》这本书。 call()和apply()这两个方法的作用可以简单归纳为改变this指向,从而让我们的this指向不在是谁调用了函数就指向谁。
165 1
浅谈JS中call()和apply()的区别和用途?
|
PHP
TP5.1命令行创建controller修改创建模板(php think make:controller app\admin\controller\Login)
TP5.1命令行创建controller修改创建模板(php think make:controller app\admin\controller\Login)
364 0
TP5.1命令行创建controller修改创建模板(php think make:controller app\admin\controller\Login)
winserver的consul部署实践与.net core客户端使用(附demo源码)(二)
winserver的consul部署实践与.net core客户端使用(附demo源码)(二)
240 0
winserver的consul部署实践与.net core客户端使用(附demo源码)(二)