Java逆向基礎之初識Byteman
阿新 • • 發佈:2018-05-02
java逆向bytemanByteman的是由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