面試官:如何防止 Java 源碼被反編譯??我:有點(diǎn)懵~
來源:https://www.cnblogs.com/dartagnan/
面試官:如何防止 Java 源碼被反編譯?
java作為解釋型的語言,其高度抽象的特性意味其很容易被反編譯,容易被反編譯,自然有防止反編譯措施存在。今天就拜讀了一篇相關(guān)的文章,受益匪淺,知彼知己嘛!!
之所以會對java的反編譯感興趣,那是因?yàn)樽约涸趯W(xué)習(xí)的過程中,常常需要借鑒一下別人的成果(你懂的...)。或許反編譯別人的代碼不怎么道德,這個(gè)嘛......
廢話不多說,正文如下:

對Class文件進(jìn)行加密


圖4 代碼混淆示意圖

以上幾種技術(shù)都有不同的應(yīng)用環(huán)境,各自都有自己的弱點(diǎn),表1是相關(guān)特點(diǎn)的比較。

符號混淆
數(shù)據(jù)混淆
圖5 改變數(shù)據(jù)訪問

控制混淆
控制混淆就是對程序的控制流進(jìn)行混淆,使得程序的控制流更加難以反編譯,通常控制流的改變需要增加一些額外的計(jì)算和控制流,因此在性能上會給程序帶來一定的負(fù)面影響。有時(shí),需要在程序的性能和混淆程度之間進(jìn)行權(quán)衡。控制混淆的技術(shù)最為復(fù)雜,技巧也最多。這些技術(shù)可以分為如下幾類:
增加混淆控制通過增加額外的、復(fù)雜的控制流,可以將程序原來的語義隱藏起來。例如,對于按次序執(zhí)行的兩個(gè)語句A、B,我們可以增加一個(gè)控制條件,以決定B的執(zhí)行。通過這種方式加大反匯編的難度。但是所有的干擾控制都不應(yīng)該影響B(tài)的執(zhí)行。圖6就給出三種方式,為這個(gè)例子增加混淆控制。
圖6 增加混淆控制的三種方式

控制流重組重組控制流也是重要的混淆方法。例如,程序調(diào)用一個(gè)方法,在混淆后,可以將該方法代碼嵌入到調(diào)用程序當(dāng)中。反過來,程序中的一段代碼也可以轉(zhuǎn)變?yōu)橐粋€(gè)函數(shù)調(diào)用。另外,對于一個(gè)循環(huán)的控制流,為可以拆分多個(gè)循環(huán)的控制流,或者將循環(huán)轉(zhuǎn)化成一個(gè)遞歸過程。這種方法最為復(fù)雜,研究的人員也非常多。
預(yù)防性混淆
這種混淆通常是針對一些專用的反編譯器而設(shè)計(jì)的,一般來說,這些技術(shù)利用反編譯器的弱點(diǎn)或者Bug來設(shè)計(jì)混淆方案。例如,有些反編譯器對于 Return后面的指令不進(jìn)行反編譯,而有些混淆方案恰恰將代碼放在Return語句后面。這種混淆的有效性對于不同反編譯器的作用也不太相同的。一個(gè)好的混淆工具,通常會綜合使用這些混淆技術(shù)。
案例分析
在實(shí)踐當(dāng)中,保護(hù)一個(gè)大型Java程序經(jīng)常需要綜合使用這些方法,而不是單一使用某一種方法。這是因?yàn)槊糠N方法都有其弱點(diǎn)和應(yīng)用環(huán)境。綜合使用這些方法使得Java程序的保護(hù)更加有效。另外,我們經(jīng)常還需要使用其它的相關(guān)安全技術(shù),例如安全認(rèn)證、數(shù)字簽名、PKI等。
本文給出的例子是一個(gè)Java應(yīng)用程序,它是一個(gè)SCJP(Sun Certificate Java Programmer)的模擬考試軟件。該應(yīng)用程序帶有大量的模擬題目,所有的題目都被加密后存儲在文件中。由于它所帶的題庫是該軟件的核心部分,所以關(guān)于題庫的存取和訪問就成為非常核心的類。一旦這些相關(guān)的類被反編譯,則所有的題庫將被破解。現(xiàn)在,我們來考慮如何保護(hù)這些題庫及相關(guān)的類。
在這個(gè)例子中,我們考慮使用綜合保護(hù)技術(shù),其中包括本地代碼和混淆技術(shù)。因?yàn)樵撥浖饕l(fā)布在Windows上,因此轉(zhuǎn)換成本地代碼后,僅僅需要維護(hù)一個(gè)版本的本地代碼。另外,混淆對Java程序也是非常有效的,適用于這種獨(dú)立發(fā)布的應(yīng)用系統(tǒng)。
在具體的方案中,我們將程序分為兩個(gè)部分,一個(gè)是由本地代碼編寫的題庫訪問的模塊,另外一個(gè)是由Java開發(fā)的其它模塊。這樣可以更高程度地保護(hù)題目管理模塊不被反編譯。對于Java開發(fā)的模塊,我們?nèi)匀灰褂没煜夹g(shù)。該方案的示意圖參見圖7。
圖7 SCJP保護(hù)技術(shù)方案圖

對于題目管理模塊,由于程序主要在Windows下使用,所以使用C++開發(fā)題庫訪問模塊,并且提供了一定的訪問接口。為了保護(hù)題庫訪問的接口,我們還增加了一個(gè)初始化接口,用于每次使用題庫訪問接口之前的初始化工作。它的接口主要分為兩類:
1. 初始化接口
在使用題庫模塊之前,我們必須先調(diào)用初始化接口。在調(diào)用該接口時(shí),客戶端需要提供一個(gè)隨機(jī)數(shù)作為參數(shù)。題庫管理模塊和客戶端通過這個(gè)隨機(jī)數(shù),按一定的算法同時(shí)生成相同的SessionKey,用于加密以后輸入和輸出的所有數(shù)據(jù)。
通過這種方式,只有授權(quán)(有效)的客戶端才能夠連接正確的連接,生成正確的 SessionKey,用于訪問題庫信息。非法的客戶很難生成正確的SessionKey,因此無法獲得題庫的信息。如果需要建立更高的保密級別,也可以采用雙向認(rèn)證技術(shù)。
2. 數(shù)據(jù)訪問接口
認(rèn)證完成之后,客戶端就可以正常的訪問題庫數(shù)據(jù)。但是,輸入和輸出的數(shù)據(jù)都是由SessionKey所加密的數(shù)據(jù)。因此,只有正確的題庫管理模塊才能夠使用題庫管理模塊。圖8時(shí)序圖表示了題庫管理模塊和其它部分的交互過程。

感謝您的閱讀,也歡迎您發(fā)表關(guān)于這篇文章的任何建議,關(guān)注我,技術(shù)不迷茫!小編到你上高速。
正文結(jié)束
1.不認(rèn)命,從10年流水線工人,到谷歌上班的程序媛,一位湖南妹子的勵(lì)志故事
3.從零開始搭建創(chuàng)業(yè)公司后臺技術(shù)棧
5.37歲程序員被裁,120天沒找到工作,無奈去小公司,結(jié)果懵了...
6.IntelliJ IDEA 2019.3 首個(gè)最新訪問版本發(fā)布,新特性搶先看
一個(gè)人學(xué)習(xí)、工作很迷茫?
點(diǎn)擊「閱讀原文」加入我們的小圈子!

