.class 字節碼文件修改


有個.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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM