`
Kingson_Wu
  • 浏览: 119643 次
文章分类
社区版块
存档分类
最新评论

BTrace原理之 -- VM Attach API

 
阅读更多

原文:http://ivanzhangwb.github.io/btrace-vm-attach-api/


BTrace的特点之一就是可以动态Attach到一个运行的JVM进程上,然后根据BTrace脚本来对目标JVM进行相应的操作。
这篇文章主要关注JVM Attach API,JVM的 Attach有两种方式:

  • 指定javaagent参数
  • 运行时动态attach

指定参数

这种方式的特点就是在目标JVM启动时,就确定好了要加载什么样的代理对象。
比如命令形式:java -javaagent:xxxx.jar MainClass
用一个例子来说明下:

一个普通程序入口
  1. public class TestMain {
  2. public static void main(String[] args) throws InterruptedException {
  3. System.out.println("Hello");
  4. }
  5. }
Agent对象
  1. import java.lang.instrument.Instrumentation;
  2. import java.io.*;
  3. public class TestAgent {
  4. public static void agentmain(String args, Instrumentation inst)
  5. throws Exception {
  6. System.out.println("Args:" + args);
  7. }
  8. public static void premain(String args, Instrumentation inst)
  9. throws Exception {
  10. System.out.println("Pre Args:" + args);
  11. Class[] classes = inst.getAllLoadedClasses();
  12. for (Class clazz : classes) {
  13. System.out.println(clazz.getName());
  14. }
  15. }
  16. }

这个类比较简单,最终它会在目标类的Main方法执行之前,执行premain方法,其主要动作是将以及加载的类答疑in出来。 我们需要将这个类打包成jar文件,以便在目标JVM启动时候,以参数形式指定给它。打成jar的同时,设定MANIFEST.MF文件的内容。 告知目标JVM该如何处理.

Agent-Class: TestAgent
Premain-Class: TestAgent
Can-Redine-Classes: true
Can-Retransform-Classes: true

最终用jar命令将其打包。 比如jar cvmf MANIFEST.MF xxx.jar TestAgent

使用方法:

java -javaagent:xxx.jar TestMain

####动态Attach,并load对应的Agent

这种方式与之前指定参数的不同在于,其可以在JVM已经运行的情况下,动态的附着上去,并可以动态加载agent。

同样我们也来看下一个例子: 目标JVM运行的类, 这个类会隔一秒钟打印一句话。 JVM会一直运行(模拟已经运行的JVM进程)

  1. public class TestMain {
  2. public static void main(String[] args) throws InterruptedException {
  3. while(true){
  4. Thread.sleep(10000);
  5. new Thread(new WaitThread()).start();
  6. }
  7. }
  8. static class WaitThread implements Runnable {
  9. @Override
  10. public void run() {
  11. System.out.println("Hello");
  12. }
  13. }
  14. }
Agent对象
  1. import java.lang.instrument.Instrumentation;
  2. import java.io.*;
  3. public class TestAgent {
  4. public static void agentmain(String args, Instrumentation inst)
  5. throws Exception {
  6. System.out.println("Args:" + args);
  7. }
  8. public static void premain(String args, Instrumentation inst)
  9. throws Exception {
  10. System.out.println("Pre Args:" + args);
  11. Class[] classes = inst.getAllLoadedClasses();
  12. for (Class clazz : classes) {
  13. System.out.println(clazz.getName());
  14. }
  15. }
  16. }

代码同上,不同的是,动态加载agent的情况下,被调用的是agentmain方法, 其会在JVMload的时候,被调用。 为了简单示例,只打印了传递给Agent的参数。

同样的,这个类也需要打包成jar。

Agent-Class: TestAgent
Premain-Class: TestAgent
Can-Redine-Classes: true
Can-Retransform-Classes: true

使用方式

动态附着到对应的JVM需要使用到JDK的Attach API

  1. import com.sun.tools.attach.VirtualMachine;
  2. public class Main {
  3. public static void main(String[] args) throws Exception{
  4. VirtualMachine vm =null;
  5. String agentjarpath = "/home/ivanzhangwb/test.jar"; //agentjar路径
  6. vm = VirtualMachine.attach("9730");//目标JVM的进程ID(PID)
  7. vm.loadAgent(agentjarpath, "This is Args to the Agent.");
  8. vm.detach();
  9. }
  10. }

最终我们一旦运行这个Main方法, 其就会动态的附着到我们对应的JVM进程中,并为目标JVM加载我们指定的Agent,以达到我们想做的事情, 比如BTrace就为在附着到目标JVM后,开启一个ServerSocket,以便达到与目标进程通讯的目的。


分享到:
评论

相关推荐

    MK-Unlocker-VM15.5

    《MK-Unlocker-VM15.5:解锁VMware Workstation Pro的黑苹果之旅》 在虚拟化技术领域,VMware Workstation Pro一直以其强大的功能和稳定的性能深受用户喜爱。然而,对于苹果操作系统的爱好者来说,由于Apple的严格...

    Ax86_8.1-R2-VM-32bit.7z

    标题中的"Ax86_8.1-R2-VM-32bit.7z"指的是一个基于Android x86的32位操作系统镜像,它已经以7z压缩格式打包。"8.1-R2"表示这个版本是Android 8.1的第二个修订版,通常意味着它修复了一些上一版本的问题并可能包含了...

    PAN-OS 10.0 VM 下载,全球首个基于机器学习的新一代防火墙.rar

    描述中提到的"PA-VM-ESX-10.0.0.ova"和"Panorama-ESX-10.0.0.ova"是两个OVA(Open Virtual Appliance)文件,这是VMware平台上的虚拟设备格式。这些文件包含预配置的PAN-OS 10.0虚拟防火墙和可能的Panorama管理平台...

    Android代码-Maxine-VM

    Maxine VM: A Metacircular VM for Java in Java Releases (See CHANGELOG for more) 2018-12-05: Maxine VM 2.6.0 Release 2018-10-16: Maxine VM 2.5.2 Release 2018-10-16: Maxine VM 2.5.1 Release 2018-08-27:...

    cloudera-quickstart-vm-5.13.0-0 书签

    cloudera-quickstart-vm-5.13.0-0- 相关书签。

    kali-linux-1.0.9-vm-i486.7z²

    因为版本的原因镜像在kali官网上已经删除,下载好后直接使用vm打开,登陆账号,密码即可进入使用。

    PyPI 官网下载 | opal-azure-cli-vm-2.2.23.tar.gz

    **PyPI 官网下载 | opal-azure-cli-vm-2.2.23.tar.gz** 这个资源是PyPI(Python Package Index)官方提供的一个软件包,名为`opal-azure-cli-vm`,版本号为2.2.23。PyPI是Python开发者发布和分享他们编写的开源...

    Ax86-8.1_R2-VM-64bit.7z

    Ax86_8.1-R2-VM-64bit,android x86 64bit 8.1-r2 vmware 虚拟机,解压后,使用vmware15(至少)新建虚拟机,选择其他 64位-》在导入硬盘处选择此vmdk文件。

    Go-Lua5.2VM的一个纯Go实现

    Go-Lua5.2VM是基于Google的Go编程语言实现的一个完整的Lua 5.2虚拟机。这个项目旨在为Go程序提供一种内嵌Lua脚本的能力,使得开发者可以在Go程序中利用Lua的灵活性和易读性来编写部分业务逻辑或者扩展功能。下面将...

    Go-go.vm一个简单的虚拟机-编译器和解释器-用golang编写

    为了更好地理解这个项目,我们可以查看压缩包内的“skx-go.vm-0276dfc”文件。这个文件可能是项目的某个版本或者是编译后的字节码文件。通过反编译或调试工具,我们可以分析它的结构,进一步了解虚拟机的指令集和...

    SMC VM 目录

    基本式 驱动器 通口数 配管形式 驱动器 型号 备注 聚乙醛滚轮 硬钢滚轮 2通口3通口2通口3通口 VM120-01-00 VM121-01-00 VM130-01-00 VM131-01-00 ...VM-08B VM-07BS VM-07B VM-06BS VM-06B VM-05B ...VM-30AR 红

    PyPI 官网下载 | tencentcloud-sdk-python-vm-3.0.355.tar.gz

    《PyPI官网下载:tencentcloud-sdk-python-vm-3.0.355.tar.gz——腾讯云Python SDK深度解析》 在Python的世界里,PyPI(Python Package Index)是开发者们的重要资源库,它提供了丰富的第三方库,使得开发者能够...

    xampp-osx-8.0.2-0-vm.dmg.bz2

    Mac版本 官网上下载XAMPP简直都下载不下来,后来通过别的渠道下载下来了,所以决定上传到CSDN中,希望可以帮助到需要的同学。 XAMPP(X-系统,A-Apache,M-Mysql,P-php,P-Phpmyadmin/Perl)这个缩写名称说明了XAMPP...

    Python库 | tencentcloud-sdk-python-vm-3.0.531.tar.gz

    《Python库 Tencentcloud-sdk-python-vm-3.0.531详解》 在Python的开发环境中,库扮演着至关重要的角色,它们提供了丰富的功能,让开发者能够更高效地完成任务。本文将深入探讨名为"Tencentcloud-sdk-python-vm-3.0...

    open-vm-tools

    "libpython3.10-stdlib_3.10.6-1~22.04_i386.deb"则是Python 3.10标准库的一部分,这可能包含了一些用于open-vm-tools的内置功能和API。 在安装这个包时,系统会自动处理这些依赖关系,确保所有必要的库和语言环境...

    欧姆龙微小光点/标识(放大器分离) E3C-VS/VM.pdf

    欧姆龙微小光点/标识(放大器分离) E3C-VS/VMpdf,欧姆龙微小光点/标识(放大器分离) E3C-VS/VM:微小光点,最适合微小物体和标记的检测,最适合检测微小物体与细微的色差。接缝检测。200μ的极线检测。微小段差检测...

    PA-VM-ESX-7.1.0.zip

    标题 "PA-VM-ESX-7.1.0.zip" 暗示这是一个与 VMware ESXi 7.1.0 相关的压缩包,其中可能包含了与更新、安装或配置 ESXi 7.1.0 版本有关的文件。VMware ESXi 是一款业界领先的虚拟化平台,它允许在单一硬件上运行多个...

    SG6000-VM虚拟防火墙安装手册.pdf

    SG6000-VM虚拟防火墙安装手册.pdf

    SG6000镜像.zip

    SG6000镜像文件包含SG6000-CloudEdge-VM01-5.5R2.iso与SG6000-CloudEdge-VM02-5.5R2.iso 可用于hillstone防火墙实验

    PyPI 官网下载 | tencentcloud-sdk-python-vm-3.0.529.tar.gz

    首先,`tencentcloud-sdk-python-vm-3.0.529.tar.gz`是该SDK在PyPI官网上的一个压缩包文件,包含了 Tencentcloud-sdk-python 的虚拟机(VM)模块。PyPI,全称Python Package Index,是Python软件的官方仓库,提供...

Global site tag (gtag.js) - Google Analytics