1. 程式人生 > >【Java】修改jar包class文件小記

【Java】修改jar包class文件小記

加密 返回 .cn 代碼 要求 ges 命令 文件 定位

今天被瑤瑤要求幫忙了

他現在用的軟件裏有一個bug,因為是外國的開發者,所以要求修改是很麻煩的事。要改的東西很簡單,就是將一個函數裏錯誤的返回值修改。

拿到手的有軟件直接能運行的jar包。

一開始的想法比較簡單,就想直接反編譯代碼,然後修改後重新打包,使用的是一直比較鐘愛的jd-gui。

不過之後發現沒有那麽簡單,由於這個軟件功能比較多,代碼比較繁瑣,反編譯之後代碼依賴關系大量的報錯,想要將所有報錯都修改好再重新打包幾乎是不可能的,只能放棄。

然後瑤瑤告訴我,他之前已經定位到了有bug的方法,只要修改一下某個方法的返回值就可以了。

按照他說的位置我找到了那個方法,的確只是一個返回值要修改。

於是開始在網上尋找修改class文件的方法,在很多文章中找到了使用jclasslib查看變量在class內位置然後修改字節碼的方法。

打開要修改的文件,定位到那個方法:

技術分享

要將bipush的返回值從17修改成18 。

不過麻煩來了,文章中都是修改變量的,比如1行的#131這種,而這個位置是方法內直接返回int數值,需要直接修改方法的定義

在查看org.gjt.jclasslib的API無果後(很可能是我自己沒有找到),開始找class文件結構,想定位到相應method定義的位置。

最後通過搜索返回值“17”的16進制值和bipush操作碼的對應id找到了對應的位置。將【11】修改為【12】。

技術分享

bipush的對應數值是0x10,ireturn的對應數值是0xAC,再繼續對比前後的位置碼都能對應上,於是將10後的11修改為12後,保存。

(截圖是修改後的文件)

保存後將class覆蓋回jar包,發現雙擊無法運行。

在命令行運行java -jar xxx.jar,發現報錯"java.lang.securityexception",繼續到網上搜索解決辦法,需要刪除META-INF中,除了MANIFEST.MF和SERVER.RSA的內容。

打開MANIFEST.MF發現裏面是所有類的SHA-256加密後的串,因為那個類文件被我修改導致串對不上才會報錯。

將MANIFEST.MF內Main-Class: xxx.xxx.xxx.Main下面的內容刪除(需要留一個空行,否則會提示“沒有主清單屬性!”)。

再次運行jar包,成功!

把jar包發給瑤瑤,得到的反饋是可以運行,bug改好了,完成!

【Java】修改jar包class文件小記