標籤:des style blog http java color
先貼出樣本中的代碼:
public class Test{ public static void main(String[] args){ System.out.println("123"); System.out.println("345"); } public void m1(){ System.out.println("m1"); } public void m2(){ System.out.println("m2"); }}
Test2中先後調用了Test的m1,m2方法,此處通過修改位元組碼刪除對m1方法的調用。
public class Test2{ public static void main(String[] args){ System.out.println("test2"); Test t1 = new Test(); t1.m1(); t1.m2(); }}
1、找到相對應的方法調用的位元組碼指令,通過JclassLib或者在命令列通過javap -verbose Test2.class來查看。
此處為16行和17行的aload_1和invokespecial #7,點擊此處#7,可確定調用的方法為Test.m1(),如下所示:
此處控制台內容沒有全部顯示
貼出命令列中未截出的main函數中的方法調用位元組碼指令
2、通過虛擬機器位元組碼指令集去查詢對應的16進位位元組碼為:2B B6 00 07,此處00 07為B6(調用樣本方法)的參數,即為調用Test的m1方法。
3、在UE中選中後右鍵進行選中16進位插入/刪除,刪除對應的位元組碼。此處選擇刪除,要刪除的位元組數即為4
4、在刪除對應的位元組碼後,仍有3處需修改。
4.1 此Code屬性對一個的attribute_length,在原值的基礎上減4
4.2 修改此Code屬性對應的code_length,從19修改為15,同樣見。
43 修改此Code屬性對應的LinerNumberTable中的對應的位元組碼行號,因位元組碼減少了,如不修改會報錯
如所示,將00 18和 00 14此兩次大於所刪除的位元組碼行號(此處為15和16)的兩處行號分別減4。儲存,OK!重新運行java Test2,如所示,上面異常是在沒有修改位元組碼行號記錄表時所報的異常。