有個.class文件,用XJad反編譯如下:
public String int() { String s = null; try { List list = c.if(a).getNeighboringCellInfo(); if (list != null && !list.isEmpty()) { ....... } }
}
......
現在想把它改成下面這樣:
public String int() { String s = null; try { List list = Support.getNeighboringCellInfo(); if (list != null && !list.isEmpty()) { ........ } } }
也就是getNeighboringCellInfo函數返回值從Support類的靜態方法getNeighboringCellInfo里面獲取。
Support類如下:
package com.iGod;
public class Support { ...... public static List getNeighboringCellInfo() { Log.i("com.iLocation", "Support.getNeighboringCellInfo!!!"); return new ArrayList(); }
}
我們先看之前代碼這一段的字節碼文件,使用JavaBite工具查看int函數如下所示:
特別注意000C這個編號的指令astore_2。
修改后的字節碼文件是這樣的:
在0002指令處我們做了很多修改,之后編譯一直報錯,原因就是000C以后的指令(沒有修改)的index和之前不一樣了(跳轉語句根據index跳會亂掉)。所以我們要補齊nop指令,一直補到和原來的000C后面的指令相同。比如原來goto 01c處執行,結果刪一條指令后,原01c處指令集體向前移動1個字節,就亂了。
看一下字節碼對比
圖中一串00 就是我們填入的 nop指令。01 是aconst_null,4C是astore_1,B8 00 DA是調用Support里面的靜態函數。
附:
工具沒找到靠譜的,java Bytecode Editor 也可以用,但都不好用。還是UE關鍵時刻能頂住。
JavaBite 查看Methods的時候,如果兩個方法同名,它只顯示第一個方法的代碼。這時候可以用java Bytecode Editor把要修改的方法前面的同名方法刪掉,再用javaBite修改代碼,修改完了再把刪的方法還原回來。不知道有沒有好的辦法解決這些問題。
XJad反編譯的時候最給力,修改完的.class文件可以在XJad里面反編譯,看一下效果是不是預期。但是它不能編輯。
參考文獻:
Class文件解析 :字段、方法和屬性
http://www.liuliqiang.com/post-181.html
http://www.liuliqiang.com/post-182.html