Byteman的是由Jboss发明主要是为了支持多线程和多JVM测试的自动化。

Byteman规则语言提供了一组标准的内置操作,这些操作支持特定的上述类别中的任务

为了简化测试自动化,Byteman已经与两种流行的测试框架JUnit和TestNG集成

在逆向中,我们也可以利用Byteman来帮助我们分析方法的调用


Byteman下载地址:http://byteman.jboss.org/downloads.html

环境变量配置

BYTEMAN_HOME = C:\byteman-download-4.0.2

PATH添加%BYTEMAN_HOME%\bin


安装验证

bmcheck

QQ截图20180502083044.png


看一个例子

HelloWorld.java

//HelloWorld.java
public class HelloWorld {
	public static void main(String[] argv) {
		System.out.println("Hello, world!");
	}
}


规则文件appmain.btm

#appmain.btm
RULE trace main entry
CLASS HelloWorld
METHOD main
AT ENTRY
IF true
DO traceln("entering main")
ENDRULE

RULE trace main exit
CLASS HelloWorld
METHOD main
AT EXIT
IF true
DO traceln("exiting main")
ENDRULE


编译

javac HelloWorld.java

运行

java HelloWorld

规则检查

bmcheck -cp . -v appmain.btm

Byteman运行

java -javaagent:%BYTEMAN_HOME%\lib\byteman.jar=script:appmain.btm HelloWorld

运行结果

QQ截图20180502084108.png


规则文件定义

# 规则骨架
RULE <规则名>
CLASS <类名>
METHOD <方法名>
BIND <绑定事件>
IF <条件>
DO <动作>
ENDRULE

在脚本中我们使用了traceln语句,那么这个调用的其实是Byteman的org.jboss.byteman.rule.helper.Helper类的方法,这些方法都是已经内置的,可以直接在脚本中调用。我们也可以扩展Helper类进行调用。

从上面我们可以看出Byteman的使用方法:1.写规则文件,2.写Helper类的扩展方法(可选),3.指定脚本文件调用


再看一个例子

输出参数和返回值

Main.java

package com.vvvtimes;

public class Main {

	public int add(int x, int y) {
		return x + y;
	}

	public int add(int x, int y, int z) {
		return x + y + z;
	}

	public static void main(String[] argv) {
		Main m = new Main();
		System.out.println(m.add(1, 2));
		System.out.println(m.add(1, 2, 3));
	}
}

规则文件appmain.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
RULE trace arg2
CLASS com.vvvtimes.Main
METHOD add(int,int,int)
AT ENTRY
IF true
DO traceln("arg1=" + $1 + " arg2=" + $2 + " arg3=" + $3)
ENDRULE
RULE trace return value2
CLASS com.vvvtimes.Main
METHOD add(int,int,int)
AT EXIT
IF true
DO traceln("Return value: " +$!)
ENDRULE


编译

javac com/vvvtimes/Main.java

运行

java com.vvvtimes.Main

规则检查

bmcheck -cp . -v scripts/appmain.btm

byteman运行

java -javaagent:%BYTEMAN_HOME%\lib\byteman.jar=script:scripts/appmain.btm com.vvvtimes.Main


运行结果

QQ截图20180502110959.png

这里的$0指的是当前对象。$1指的是当前方法的第一个参数,如果有多个参数,数字依次增长。$!指返回值,AT与AFTER同义

需要注意的是,RULE的语法规则中的CLASS METHOD都不支持通配符模式,逆向中如果用这个规则去写会很麻烦,官方建议用批量脚本去生成。。。

所以如果同名方法很多,还是用前面的AspectJ去找吧

更多内容可参考docs/byteman-programmers-guide.pdf

网上有个追踪局部变量的没啥用。需要-g编译,逆向中用不了