針對Java易遭受逆向工程攻擊的緣由,今天我將向你們介紹目前市場上關於防止Java免受逆向工程攻擊的集中措施,同時指出這幾種措施在防範逆向工程攻擊的時候存在的不足之處。程序員
首先是板載措施,它並不足以防止逆向工程。大多數虛擬機都包含一些使逆向工程複雜化的功能。Java容許用戶在JAR存檔中提供的每一個類上設置一個數字證書,以確保原始文件沒有被更改。雖然這樣作並沒有害處,但該功能至關容易清除,而且僅針對靜態補丁方法提供保護,而靜態補丁只是攻擊場景中的一小部分。並且,這種方法並不能針對運行時應用於內存的補丁提供保護。算法
Java還經過虛擬機執行字節碼驗證器,該驗證器在執行經過的字節碼以前對其進行自動分析。這能夠防止番茄花園下載執行"奇怪"的代碼,也使字節碼注入變得更加困難。加密
然而,儘管這些措施給攻擊者形成了困難,但對於充分保護知識產權還遠遠不夠。spa
其次是Java封裝技術。開發人員一般用以防止。class文件靜態分析和字節碼反彙編的一種方法是封裝,這種方法經過應用加密/解密完整文件來防止對類文件的分析。經過封裝,開發人員將受保護文件的原始加載器更換爲處理加密/解密的自定義加載器。加密使用將。class文件從標準Java .class格式更改成僅"密鑰"全部者可讀格式的算法來防止對這些文件的分析。然而,.class文件的字節碼在一個內存位置中仍保持可讀,在系統加載器嘗試加載該類以前的時刻,一般可從該位置訪問字節碼。若是黑客可以找到那個內存位置,就能夠訪問原始狀態的該類。內存
最後,防止黑客攻擊該內存位置須要第二種技術,稱爲混淆。混淆可產生一個更加複雜、難於理解而且與原始代碼具備相同行爲方式的代碼版本。有幾種不一樣類型的混淆方法可用於指令集:程序員能夠經過替換二進制代碼中的全部字符串來混淆代碼,這樣就更加難以找到一個好的切入點來開始逆向工程攻擊。他們能夠經過插入指向垃圾代碼的跳轉並返回來迷惑攻擊者,或混淆源代碼或字節碼。開發
開發人員也能夠選擇使用名爲Const2Code轉換的技術來混淆常量。例如,密鑰有時在應用程序中存儲爲一組字節。若是黑客肯定了這些字節的位置,他們就能夠訪問這些字節。爲混淆一個常量(如密鑰),Const2Code算法將常量轉換爲可產生同一常量的多個不一樣的命令。字符串
例如,爲了在源代碼段中隱藏常量cst=0x12345678,能夠將該常量簡單地分爲幾個算術運算,如加、減等等。A = 0x9ABCDF00;B=0x2;C=0x135799E00.如今讓咱們使用這三個變量從新計算出常量0x12345678.咱們的原始常量爲:cst = C/B + A – 0x88888888 – A + 1000= 0x12345678.若是應用程序僅使用該例程來計算常量,攻擊者就必須理解其中的含義,而不是簡單地獲取該常量。get