1. 程式人生 > >如何利用JClassLib修改.class檔案

如何利用JClassLib修改.class檔案

最近在學習逆向分析和反編譯,無意之中瞭解到了JClassLib。JClassLib不但是一個位元組碼閱讀器而且還包含一個類庫允許開發者讀取,修改,寫入Java Class檔案與位元組碼。其他的用途我就不說了,先看一下效果。

第一步、準備下載工具,一個是jd-gui,閱讀jar包和.class原始碼的工具,jclasslib就修改.class檔案的包 下載地址 第二步、示範 1、比如說這個就是原來的java檔案,很簡單就是輸出 google 這個字串
package com.qx;

public class Main {
	public static void main(String[] args) {
		print();
	}
	
	static void print() {
		System.out.println("google");
	}
}
2、編譯之後,控制檯執行結果為 google,為什麼用 javac -d . Main.java 去編譯java檔案,這個我就不解釋了,不懂的話去惡補一下

3、找到Main.class檔案,並用 jd-gui開啟,效果如下


4、在這裡很明顯看到原始碼,可惜不能修改呀,現在就準備修改工具,搞定它。解壓jclasslib,目錄如下
5、在eclipse裡面建立一個java工程,然後把src檔案覆蓋到工程目錄下,並且執行BrowserApplication.java,得到一個工具叫做Bytecode viewer,如下圖
6、現在咱們可以利用工具找到我們修改的部分,我們就是要修改Main.class檔案中google,修改成 baidu。
結構目錄很清楚,methods就是方法,print是列印google字串的方法,main是主函式,在這裡我們找到print並開啟
7、開啟code,我們會看到第二行 lbc #4 <google>,這時我們點選#4
8、這個效果如下,通過這個,我們知道google字串的地址在哪裡了,在#21, 這個時候 點選 cp info #21
9、這時,我們看到的google字元是在[21]這個位置,並且CONSTANT_Utf-8_info,這些資訊待會修改的時候 很有用。
10、現在我們可以用程式碼去把 google 修改成 baidu。首先建立一個工程,把剛剛下載jclasslib資料夾下bin目錄下jclasslib.jar引入,如下圖

11、Main.java函式程式碼如下
package cc.cc.c;

import java.io.*;
import org.gjt.jclasslib.io.ClassFileWriter;
import org.gjt.jclasslib.structures.CPInfo;
import org.gjt.jclasslib.structures.ClassFile;
import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;

public class Main {
	public static void main(String[] args) throws Exception {

		String filePath = "C:\\Main.class";
		FileInputStream fis = new FileInputStream(filePath);
		DataInput di = new DataInputStream(fis);
		ClassFile cf = new ClassFile();
		cf.read(di);
		CPInfo[] infos = cf.getConstantPool();

		int count = infos.length;
		for (int i = 0; i < count; i++) {
			if (infos[i] != null) {
				System.out.print(i);
				System.out.print(" = ");
				System.out.print(infos[i].getVerbose());
				System.out.print(" = ");
				System.out.println(infos[i].getTagVerbose());
				if (i == 21) {//剛剛找到的是21位置
					ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //剛剛那裡是CONSTANT_Utf-8_info所以這裡要用這個
					uInfo.setBytes("baidu".getBytes());
					infos[i] = uInfo;
				}
			}
		}
		//這種方式也可以,一樣的
/*		if(infos[count] != null) {
			ConstantUtf8Info uInfo = (ConstantUtf8Info) infos[i]; //剛剛那裡是CONSTANT_Utf-8_info所以這裡要用這個
			uInfo.setBytes("baidu".getBytes());
			infos[count] = uInfo;
		}*/
		
		cf.setConstantPool(infos);
		fis.close();
		File f = new File(filePath);
		ClassFileWriter.writeToFile(f, cf);
	}
}
12、不報錯,就代表成功了,然後再執行Main.class檔案

這個時候,我們就把class檔案中google修改成baidu了,怎麼用這個工具就看你怎麼玩了,有什麼問題請隨時留言。