class文件直接修改_反編譯修改class文件變量


今天筆者同事遇到一個問題,客戶同事的數據庫連接信息直接寫在代碼中,連接的密碼改了,但是又沒有源代碼,所以只能直接修改Java class文件。

記錄一下修改步驟:

1.下載JClassLib_windows(后面用到),下載jd-gui-1.4.0.jar,用來反編譯class文件的,IDEA也可以反編譯class文件;

     

找到需要修改文件的變量,我這里是Admin。

2.第二步把class文件,備份待用,把工程文件存一份,方法如下圖所示:

 

3.安裝JClassLib,安裝完成之后用JClassLib打開需要修改的class文件,我這里是Client.class,找到需要修改的函數方法位置,我這里是main函數,然后點菜單的code,查看右側的Bytecode,找到需要修改的變量Admin,然后點擊#173,會跳到變量區,如下面二張圖說明:

  圖1

圖2

4.鼠標點擊cp_info#174會跳轉到174這行變量,如下圖所示:

4.替換變量

   寫一個Java程序,替換指定變量的值,filePath變量存在需要替換的class文件路徑,174是需要替換的位置,Admin123是希望替換的變量,如果替換成中文需要注意目標編碼(不然會用JVM默認編碼),如下圖所示:

圖1

圖2 中文編碼設置

4.上面的Java程序完整代碼如下,特別需要注意的是:程序依賴JClasslib包下的jclasslib-library.jar包,所以可以進到JClasslib安裝路徑下拷貝一個jclasslib-library.jar包文件放到build path內,我的路徑和jar包文件如下:

完整代碼,你們替換三處,文件路徑、變量位置、修改后目標變量

import java.io.DataInput;
import java.io.DataInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

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

public class Client
{
     @SuppressWarnings("deprecation")
    public static void main(String[] args){   
         String filePath = "C:\\Users\\zw\\Desktop\\Client.class";
            FileInputStream fis = null;
            try {
                fis = new FileInputStream(filePath);
            } catch (FileNotFoundException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
               
            DataInput di = new DataInputStream(fis);   
            ClassFile cf = new ClassFile();   
            try {
                cf.read(di);
            } catch (InvalidByteCodeException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            } catch (IOException e1) {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }   
            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(" = ");   
                    try {
                        System.out.print(infos[i].getVerbose());
                    } catch (InvalidByteCodeException e) {
                        // TODO Auto-generated catch block
                        e.printStackTrace();
                    }   
                    System.out.print(" = ");   
                    System.out.println(infos[i].getTagVerbose());   
                    if(i == 174){   
                        ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];   
                        uInfo.setBytes("Admin123".getBytes());   
                        infos[i]=uInfo;   
                    }   
                }   
            }   
            cf.setConstantPool(infos);   
            try {
                fis.close();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
            File f = new File(filePath);   
            try {
                ClassFileWriter.writeToFile(f, cf);
            } catch (InvalidByteCodeException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }   
        }   
}

另外我把工程


免責聲明!

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



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