1. 程式人生 > >使用JBE(Java Bytecode Editor)修改Java位元組碼

使用JBE(Java Bytecode Editor)修改Java位元組碼




JBE

JBE(Java Bytecode Editor)是一個Java位元組碼編輯工具,而且是開源的,該專案是基於jclasslib ej-technologies(
https://github.com/ingokegel/jclasslib)位元組碼檢視工具和Apache Jakarta專案。JBE下載地址:
http://set.ee/jbe/


下載完成後解壓即可使用 




點選jbe. bat(Windows)或jbe.sh(Linux)即可執行JBE。src目錄下的是JBE的原始碼。

使用示例

測試環境說明 

Java環境:jdk1.8 

使用工具:IDEA、JBE

1.新建一個Test原始碼如下:

public class Test {

    public void a(){
        System.out.println("run Test a function");
    }

    public static void main(String[] args) {
        new Test().a();
    }

}


2.按Ctrl+Shift+F9編譯Test.java,IDEA會把.class檔案生成在out目錄下 



3.用JBE開啟(File——Open class file)Test.class 



在左邊可以看到該類的常量池(Constant Pool)、欄位(Fields)、方法(Method)等資訊。點選XXX方法,選擇[0] Code檢視該方法的位元組碼。在右邊可以看到方法的位元組碼,點選Code Editor可編輯位元組碼.

4.修改方法位元組碼(位元組碼看不懂?不會寫怎麼辦?這裡分享個方法,我們可以通過IDEA、Eclipse編寫java原始碼,編譯成.class,通過JBE開啟就可以得到想要的位元組碼了,再把位元組碼拷貝、貼上到要修改的地方就好了)。


比如:我這裡要把new Test().a();位元組碼改成Test2.a()。

Test2.java原始碼:

public class Test2 {

    public static void a(){
        System.out.println("run Test2 a function");
    }
}


(1)首先我新建一個Demo類,並編寫了我想要的原始碼並編譯。 



(2)這裡用的是IDEA,.class就在out目錄下。通過JBE開啟out目錄下的Demo.class 




紅框中的就是我想要的位元組碼

(3)然後把得到的位元組碼拷貝替換掉new Test().a();的位元組碼。最後點Save method儲存修改的位元組碼。 


new Test().a();的位元組碼: 




修改後: 



5.最後,測試是否修改成功,開啟命令列工具,執行java Test,輸出如果是”run Test2 a function”,而不是”run Test a function”就成功了。 



如果是修改jar檔案中的.class檔案。因為jar其實也是個zip檔案,所以把修改後的.class替換掉原來jar中的.class,然後重新壓縮並修改後綴為jar就好了。