直接修改別人jar包裡面的class檔案 工具:jclasslib

來源:互聯網
上載者:User

出於某些原因

需要把別人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

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 Test {       public static void main(String[] args) throws Exception {             String filePath = "C:\\GenEntity.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 == 362){                       ConstantUtf8Info uInfo = (ConstantUtf8Info)infos[i];                       uInfo.setBytes("芝麻不開門!".getBytes());                       infos[i]=uInfo;                   }               }           }           cf.setConstantPool(infos);           fis.close();           File f = new File(filePath);           ClassFileWriter.writeToFile(f, cf);       }   }  

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

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

"芝麻不開門!"這裡是我想修改的文字資訊!

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

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

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

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

10.運行效果..

大功告成...

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.