Java逆向基础之初识Byteman

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Java逆向基础之初识Byteman相关的知识,希望对你有一定的参考价值。

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

技术分享图片


看一个例子

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编译,逆向中用不了




以上是关于Java逆向基础之初识Byteman的主要内容,如果未能解决你的问题,请参考以下文章

Java逆向基础之Byteman的运行后注入

Java逆向基础之初识javaagent

iOS逆向之初识汇编的基础理论

初识Frida--Android逆向之Java层hook

Java逆向基础之JDB动态调试

201555332盛照宗—网络对抗实验1—逆向与bof基础