一、java代碼混淆使用場(chǎng)景 - proguard
1.1 混淆使用場(chǎng)景
? ?我們?cè)诠こ虘?yīng)用中經(jīng)常會(huì)遇到核心代碼不希望給別人抄襲,但系統(tǒng)是用java開發(fā)的,無法避免被反編譯的情況,這樣可以用代碼混淆的方式來解決。
? ?調(diào)查了一下主流的第三方混淆工具,發(fā)現(xiàn)只有ProGuard用的最多,而且版本一直在更新維護(hù),功能也比較多,所以打算用這個(gè)來混淆。
1.2 proguard簡(jiǎn)介
? ?ProGuard是Java類文件收縮器,優(yōu)化器,混淆器和預(yù)驗(yàn)證器。這些可以使代碼庫更小,更有效,并且更好地抵御逆向工程。
? ?proguard包括四個(gè)功能:
(1) shrinker - Java類文件收縮器:
???檢測(cè)并移除沒有用到的類,變量,方法和屬性。
(2) optimizer - Java類文件優(yōu)化器:
???分析并優(yōu)化了方法的字節(jié)碼,非入口節(jié)點(diǎn)類會(huì)加上private/static/final, 沒有用到的參數(shù)會(huì)被刪除,一些方法可能會(huì)變成內(nèi)聯(lián)代碼。
(3) obfuscator : 混淆器
???使用短又沒有語義的名字重命名非入口類的類名,變量名,方法名。入口類的名字保持不變。
(4) preverifier : 預(yù)驗(yàn)證器
???預(yù)校驗(yàn)代碼是否符合Java1.6或者更高的規(guī)范(唯一一個(gè)與入口類不相關(guān)的步驟)。
注:如果你的代碼中用到了反射,那需要把反射調(diào)用的類,變量,方法也設(shè)置成入口節(jié)點(diǎn)。只需要加上-keep就可以了。(下面會(huì)講)
除了proguard之外,還有一個(gè)DexGuard,是專門用來優(yōu)化混淆Android應(yīng)用的。它的功能包括資源混淆,字符串加密,類加密和dex文件分割等。它是在android編譯的時(shí)候直接產(chǎn)生Dalvik字節(jié)碼。
1.3 proguard下載
? ?proguard官網(wǎng): https://www.guardsquare.com/proguard.
二、proguard使用示例
注:我這邊使用的是proguard6.1.1版本
下載了proguard6.1.1這個(gè)版本,解壓縮后執(zhí)行proguard6.1.1\bin\proguardgui.bat這個(gè)文件就可以打開軟件
2.1 運(yùn)行
?下圖中標(biāo)紅框的地方是需要特別設(shè)置的,其他地方都可以默認(rèn)
1、點(diǎn)擊next,進(jìn)入下一步
2.2 設(shè)置Input/Output
1、“Add input”:選擇要混淆的jar文件
2、“Add output”:設(shè)置混淆后的文件保存的路徑和名字
(1) 如果混淆后工程名稱不需要改變的話,指定一個(gè)目錄位置,混淆的工程會(huì)自動(dòng)放入指定的目錄:
(2)如果需要改變混淆后工程名稱的話,這里需要?jiǎng)?chuàng)建一個(gè)空的jar文件,指定混淆后導(dǎo)出保存的.
?如何創(chuàng)建一個(gè)空的jar文件?
??window+R
??-> cmd 進(jìn)入命令行界面
??-> e:(進(jìn)入需操作的磁盤)
?? -> cd 待創(chuàng)建文件的目錄
?? -> 輸入命令:jar cf 文件名.jar input-file(s-這里需要空文件,所以設(shè)置為空)
執(zhí)行后,會(huì)出現(xiàn)如下文件:
注:可能還有其他設(shè)置方法
3、下面那個(gè)“Add”:把你這個(gè)工程所有用到的依賴j包全部加進(jìn)來,包括依賴的所有依賴引用和java的依賴
1、如何知道你的工程用到哪些依賴?
(1) java工程或Gwt工程:
右鍵 工程 -> properties -> Java Build Path 可查看依賴工程和引用jar包
(2)maven工程:
在pom.xml文件里加上這一段配置,可以把所有用到的依賴導(dǎo)出到指定目錄里。Maven install后,會(huì)在target\lib目錄下導(dǎo)出所有的依賴,把這些jar包加入到“Add”中:
2、 注意 : java的依賴需要你到Java\jdk1.8.0\jre\lib目錄里Add進(jìn)來
如何找到j(luò)ava的jdk目錄?
–> 命令行輸入:java -verbose
4、點(diǎn)擊next,進(jìn)入下一步
2.3 shrining - 收縮參數(shù)設(shè)置
1、設(shè)置keep
2、點(diǎn)擊next,進(jìn)入下一步
這里主要Keep選項(xiàng),根據(jù)自己情況選擇,例如是應(yīng)用程序就選Application,WEB工程就選Librarys,還有Android等自己根據(jù)情況選擇,然后next
2.4 obfuscating - 配置混淆規(guī)則
1、設(shè)置輸出map日志文件位置:
??map文件為空的.txt文件,程序執(zhí)行時(shí)會(huì)自動(dòng)存儲(chǔ)打印原始名稱到混淆名稱的混淆映射日志數(shù)據(jù)到文件中。
2、根據(jù)自己的需要選擇混淆參數(shù)
參數(shù)說明:
3、點(diǎn)擊next,進(jìn)入下一步
這里我的配置如下:
2.5 optimization - 類文件優(yōu)化
? ?這里暫時(shí)沒有特殊設(shè)置,使用它的默認(rèn)設(shè)置
?如果混淆后程序運(yùn)行不太正常,可以把Optimize選項(xiàng)關(guān)閉。反正我們最關(guān)心的是混淆和防止反編譯,代碼優(yōu)化不優(yōu)化的不是很重要。
點(diǎn)擊next,進(jìn)入下一步
2.6 information
1、設(shè)置java版本 : Target可以選擇JDK版本
2、點(diǎn)擊next,進(jìn)入下一步
注意: Ignore warnings about possibly erronous input,如果混淆的時(shí)候,因?yàn)榫鎸?dǎo)致無法繼續(xù),可以把這個(gè)選項(xiàng)勾上。其它的選默認(rèn)就可以了,然后下一步。
2.7 process
1、點(diǎn)"Save configuration…"按鈕 : .pro的txt文件,將配置文件保存。
2、點(diǎn)擊Process進(jìn)行混淆,看到Processing completed successfully就說明成功了。
成功后的map日志示例如下:
2.8 異常重新操作
??如果process顯示沒有成功或者以后需要進(jìn)行混淆操作,可以將2.7節(jié)保存的.pro文件加載,然后工具會(huì)自動(dòng)設(shè)置混淆參數(shù)。
?? 如果混淆出錯(cuò)了就倒回去查查每項(xiàng)配置是不是有問題,或者懂工具配置項(xiàng)含義的話可以直接修改上面保存的配置文件,然后重新Load configuration使用修改完的配置文件來進(jìn)行混淆操作。
文章來源:http://www.zghlxwxcb.cn/news/detail-408307.html
參考鏈接:https://blog.csdn.net/kouwoo/article/details/106938939文章來源地址http://www.zghlxwxcb.cn/news/detail-408307.html
到了這里,關(guān)于ProGuard詳解 - Java代碼混淆的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!