反編譯jar實現的三種方式
工具準備
相同大版本的jdk
idea
fernflower.jar
javassist.jar 或 本地下載地址
jd-gui 或 本地下載地址
三種方式
1.使用fernflower反編譯之後再編譯
把要反編譯的.jar
修改成.zip
java -jar fernflower.jar classes.zip zzCode/
即可得到全為java的jar文件,用壓縮軟件解壓後導入idea即可
2.使用javassist動態修改class
import javassist.ClassPool; import javassist.CtClass; import javassist.CtMethod; import java.util.Map; import javassist.NotFoundException; public class main { public static void main(String[] args) throws Exception { try { ClassPool pool = ClassPool.getDefault(); //指定class所在的路徑 pool.insertClassPath("C:\\rike.jar"); //指定引入的包,這裡不需要,所以註釋掉 //pool.importPackage("dialog.DialogUtils"); //pool.importPackage("common.ListenerUtils"); //pool.importPackage("java.util.Map"); //指定要修改class的完整類名 CtClass cc = pool.get("aggressor.dialogs.WindowsExecutableDialog"); //設置要修改的方法需要的參數,沒有參數可以不設置 CtClass[] param = new CtClass[5]; param[0] = pool.get("java.util.Map"); param[1] = pool.get("dialog.DialogUtils"); param[2] = pool.get("common.ListenerUtils"); //指定要修改的類方法 CtMethod m = cc.getDeclaredMethod("dialogAction"); //如果需要修改參數,使用下面這個 //CtMethod m = cc.getDeclaredMethod("dialogAction",param); //插入新的代碼到最前面 //m.insertBefore("{if(true) return ;}"); //重新設置方法體 m.setBody("{System.out.println(\"hi class1\");}"); //保存到文件裡,文件會保持到該工程下 cc.writeFile(); } catch (Exception e) { e.printStackTrace(); } } }
會生成一個class文件,直接復制到jar包就可以
註意,在setBody
包裡面,用$0
代表this
$1
代表第一個參數 $2
代表第二個參數
3.通過引入原來的jar包,修改代碼(推薦)
我在測試的時候,因為jar文件比較復雜,前面的方式都會有很多報錯,所以使用這種方法
在你要修改的class文件對應目錄下建立文件夾,例如在idea中,項目的src文件夾下
在裡面修改代碼,之後在idea
中使用快捷鍵ctrl
+alt
+shift
+s
引入完整的jar包
在加號處引入即可
新建生成jar
點擊build
生成即可
或者將生成的class文件,直接在jar包中修改
在項目的out\production\文件夾下有生成的class文件,直接拖到原始jar中修改即可
總結
這就是前面的幾種采坑總結,之前沒怎麼接觸過java,確實是比php難太多…
到此這篇關於反編譯jar實現的三種方式的文章就介紹到這瞭,更多相關反編譯jar內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- 詳解Java中Javassist的使用
- Java字節碼增強技術知識點詳解
- 詳解JVM基礎之字節碼的增強技術
- Java Agent 動態修改字節碼詳情
- Java實現Excel文件轉PDF(無水印無限制)