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
看一个例子
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
运行结果
规则文件定义
# 规则骨架 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
运行结果
这里的$0指的是当前对象。$1指的是当前方法的第一个参数,如果有多个参数,数字依次增长。$!指返回值,AT与AFTER同义
需要注意的是,RULE的语法规则中的CLASS METHOD都不支持通配符模式,逆向中如果用这个规则去写会很麻烦,官方建议用批量脚本去生成。。。
所以如果同名方法很多,还是用前面的AspectJ去找吧
更多内容可参考docs/byteman-programmers-guide.pdf
网上有个追踪局部变量的没啥用。需要-g编译,逆向中用不了
原文地址:http://blog.51cto.com/7317859/2110615