直接修改別人jar包里面的class文件 工具:jclasslib


出於某些原因

需要把別人jar包里面的class修改一下信息

配置文件*.properties MANIFEST.MF 這些東西可以直接用記事本打開修改 然后替換掉就OK..

 

在網上游盪了半天,沒有找到合適的方法

開始我是先用jd-gui反編譯 把我需要修改的那個A.class文件反編譯出來把代碼保存到A.Java

然后直接在dos里面用javac A.java編譯

問題來了..

因為A.java引用了很多其他jar下面的方法 而且A.java有package

鼓搗了半天以后 最終結果:編譯無法正常通過 不能達到直接修改替換掉別人的class文件的目的

 

於是又在網上轉悠

看到jclasslib這個東西 於是又鼓搗了一會兒

居然成功了 竊喜 遂記下步驟方法 提供給需要的朋友..

軟件安裝: 把jclasslib 下載下來安裝好 (我下的是3.0的,百度google很多..)

 

 

我這里以我自己寫的一個小工具 POJOTool.jar 為例

 

軟件打開畫面效果如下

 

 

比如我想要修改 不能鏈接數據庫的提示信息 為 "芝麻不開門!"

 

 

步驟如下:

1.用jd-gui打開該jar  怎么打開不用我說了吧?

打開之后找到 要修改提示信息 的class文件 這里找到的是GenEntity

找到對應需要修改的代碼所在的方法名

我這里包含提示信息的這段代碼在方法 getAllDataBase()  如下圖:

 

 

2.用jd-gui或者winrar把GenEntity.class 解壓出來到C盤 (目錄無所謂)

3.雙擊桌面上安裝好了的 jclasslib bytecode viewer ,點擊軟件的 File -- Open Class File 打開你剛解壓出來的class文件

 

4.點擊methods--getAllDataBase--Code

 

methods是表示方法不用說吧

getAllDataBase是剛在jd-gui里面找到的方法名

Code包含了getAllDataBase方法里所有的信息

找到"不能打開數據庫連接,請檢查!"

這里這個工具沒有提供搜索功能

如果這里很多內容 那么你可以點擊 copy to clipboard把這里的內容復制到一個文本文件里面然后再搜索

 

 

 

 

 

 

這里找到的是第82行

 

 

 

5.點擊第 82行后面的 #34 會跳轉到Constant Pool常量池的第34個常量

 

6.再點右邊的 cp info #362 會跳轉到第362個常量

這里能看到String: 不能打開數據庫連接,請檢查! 也就是最后輸出的信息

 

7.找到GenEntity.class的關鍵常量了現在就該修改它了

在eclipse里面新建一個Test來處理GenEntity.class

 

[java]  view plain  copy
 
  1. import java.io.*;     
  2. import org.gjt.jclasslib.io.ClassFileWriter;     
  3. import org.gjt.jclasslib.structures.CPInfo;     
  4. import org.gjt.jclasslib.structures.ClassFile;     
  5. import org.gjt.jclasslib.structures.constants.ConstantUtf8Info;     
  6. public class Test {     
  7.     public static void main(String[] args) throws Exception {     
  8.     
  9.         String filePath = "C:\\GenEntity.class";     
  10.         FileInputStream fis = new FileInputStream(filePath);     
  11.              
  12.         DataInput di = new DataInputStream(fis);     
  13.         ClassFile cf = new ClassFile();     
  14.         cf.read(di);     
  15.         CPInfo[] infos = cf.getConstantPool();     
  16.              
  17.         int count = infos.length;     
  18.         for (int i = 0; i < count; i++) {     
  19.             if (infos[i] != null) {     
  20.                 System.out.print(i);     
  21.                 System.out.print(" = ");     
  22.                 System.out.print(infos[i].getVerbose());     
  23.                 System.out.print(" = ");     
  24.                 System.out.println(infos[i].getTagVerbose());     
  25.                 if(i == 362){     
  26.                     ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];     
  27.                     uInfo.setBytes("芝麻不開門!".getBytes());     
  28.                     infos[i]=uInfo;     
  29.                 }     
  30.             }     
  31.         }     
  32.         cf.setConstantPool(infos);     
  33.         fis.close();     
  34.         File f = new File(filePath);     
  35.         ClassFileWriter.writeToFile(f, cf);     
  36.     }     
  37. }    

 

這里需要注意"C:\\GenEntity.class"是我存放class的目錄

 


if(i == 362) 這里是剛我在第七步找到的常量序號

 


"芝麻不開門!"這里是我想修改的文字信息!

 

運行Test.java 會有如下提示信息 沒有報錯就證明正常的 如果報錯那么就有問題

 

 

9.把C盤剛修改后的GenEntity.class替換掉原來的GenEntity.class

怎么替換不用我說了吧..

用winrar打開.jar 然后把GenEntity.class拖進去覆蓋就行了

 

10.運行效果..

 

大功告成...


免責聲明!

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



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