Byteman可以在目标程序运行后进行注入,命令如下

运行后注入

1.查看java进程,找到目标进程的pid

jps

2.安装pid

bminstall <pid>

3.装载规则脚本

bmsubmit -l tracing.btm

//指定监听端口默认是9091

//bmsubmit -p <port> -l tracing.btm

4.卸载规则脚本

bmsubmit -u tracing.btm

//指定监听端口

//bmsubmit -p <port> -u tracing.btm


规则文件如果用到了自定义的扩展Helper类,需要先加载扩展类的jar包

1.装载jar包

bmsubmit -s helpers.jar

2.装载规则脚本

bmsubmit -l tracing.btm



看一个例子

Main.java

//Main.java
package com.vvvtimes;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) {
        try {
			BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(System.in));
			System.out.println("please input the first param:");
			String p1 = bufferedReader.readLine();
			System.out.println("please input the first param:");
			String p2 = bufferedReader.readLine();
			System.out.println("result is " + add(Integer.parseInt(p1), Integer.parseInt(p2)));
			System.out.println("press ENTER TO EXIT ...");
			bufferedReader.readLine();
		} catch (Exception e) {
			e.printStackTrace();
		}
    }

    public static int add(int a, int b) {
        return a + b;
    }
}

tracing.btm

RULE trace arg1
CLASS com.vvvtimes.Main
METHOD add(int, int)
AT ENTRY
IF true
DO traceln("arg1=" + $1 + " arg2=" + $2)
ENDRULE


RULE trace return value1
CLASS com.vvvtimes.Main
METHOD add(int, int)
AT EXIT
IF true
DO traceln("Return value: " +$!)
ENDRULE


编译

javac com/vvvtimes/Main.java

运行

java com.vvvtimes.Main

新开窗口查看注入到Main进程

查看进程

jps

安装pid

bminstall 6852

规则检查

bmcheck -cp . -v scripts/tracing.btm

装载规则脚本

bmsubmit -l scripts/tracing.btm

之后回到Main窗口输入参数


运行结果如下

QQ截图20180509110435.png

QQ截图20180509110550.png