溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

反編譯jar實現的方式有哪些

發(fā)布時間:2021-12-07 11:14:14 來源:億速云 閱讀:175 作者:iii 欄目:開發(fā)技術

這篇文章主要介紹“反編譯jar實現的方式有哪些”,在日常操作中,相信很多人在反編譯jar實現的方式有哪些問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”反編譯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動態(tài)修改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文件夾下

    反編譯jar實現的方式有哪些

    在里面修改代碼,之后在idea中使用快捷鍵ctrl+alt+shift+s引入完整的jar包

    反編譯jar實現的方式有哪些

    在加號處引入即可
    新建生成jar

    反編譯jar實現的方式有哪些

    點擊build

    反編譯jar實現的方式有哪些

    反編譯jar實現的方式有哪些

    生成即可

    反編譯jar實現的方式有哪些

    或者將生成的class文件,直接在jar包中修改
    在項目的out\production\文件夾下有生成的class文件,直接拖到原始jar中修改即可

    到此,關于“反編譯jar實現的方式有哪些”的學習就結束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關知識,請繼續(xù)關注億速云網站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

    向AI問一下細節(jié)

    免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    jar
    AI