1. 程式人生 > >Java逆向基礎之初識Byteman

Java逆向基礎之初識Byteman

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