直接修改別人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
- 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.執行效果..
大功告成...
相關文章
- linux替換jar裡面的class檔案LinuxJAR
- ClassPlaceholder外掛:動態修改jar包class檔案JAR
- 修改jar包內的classJAR
- JN專案-如何修改jar裡面的程式碼JAR
- 自定義一個gradle外掛動態修改jar包Class檔案GradleJAR
- Java中getResourceAsStream的用法,讀取jar裡面的檔案JavaJAR
- java加密保護jar包及class檔案,防止反編譯Java加密JAR編譯
- Java 如何打增量 jar 包【修改部分檔案不需全部打包】JavaJAR
- java修改jar包JavaJAR
- jar檔案could not find the main class解決JARAI
- Android 程式設計下如何修改 jar 檔案的包名Android程式設計JAR
- javabean 如何打包到jar檔案裡JavaBeanJAR
- 更改jar包中的一個classJAR
- ftp上直接修改檔案內容FTP
- 開啟別人Xamarin專案找不到android.jar檔案AndroidJAR
- IDEA匯入Tomcat的jar包後javax這個檔案裡面的內容顯示不出來怎麼辦IdeaTomcatJARJava
- 曹工雜談:Linux伺服器上,Spring Boot 原地修改 jar 包配置檔案/替換class檔案,免去重複上傳的麻煩Linux伺服器Spring BootJAR
- 手工清理ASM裡面的垃圾檔案ASM
- 深入Jar包:Gradle構建可執行jar包與訪問jar包中資料夾與檔案JARGradle
- Nexus網頁直接上傳jar包網頁JAR
- Xamarin中開啟別人專案找不到android.jar檔案AndroidJAR
- Jar 包執行時修改配置JAR
- 將ASM裡面的檔案copy到檔案系統ASM
- java web專案中classes資料夾下的class和WEB-INF/lib中jar裡的class檔案載入順序JavaWebJAR
- J2SE - Java命令執行class和jar檔案JavaJAR
- k8s Java 專案替換 jar 中的 class 檔案K8SJavaJAR
- 在pom檔案中新增jar包的方法JAR
- 遞迴修改資料夾下面所有檔案裡面的的abc為abcde遞迴
- 你知道怎麼從jar包裡獲取一個檔案的內容嗎JAR
- 聊聊Go裡面的閉包Go
- Springboot 獲取jar包中的檔案Spring BootJAR
- 如何程式讀入jar包中的任何檔案。JAR
- git將工作區修改檔案直接提交倉庫Git
- 如何修改 node_modules 裡的檔案
- Spark2 檔案處理和jar包執行SparkJAR
- Maven專案打jar包MavenJAR
- jar檔案打包JAR
- Androidstudio中jar包重複或jar包裡的類重複問題AndroidJAR