導語:幾個月前,網易易盾正式推出Java2c加固。它以獨有的“靜態保護”技術,使得應用程式中的程式碼出現“下沉”,達到不可逆的效果,兼顧“冷熱啟動時間”、“CPU”、 “記憶體佔用率”、“體積”等重要指標,保障使用者加固的靈活性。
這種型別的加固是在什麼契機下推出?它到底具備哪些優勢?在實際測試和應用中,它的表現是什麼樣的?網易易盾兩位技術專家為此撰寫了一篇文章做出解讀,希望能夠接觸一些人的疑惑。
網易易盾為什麼會推出Java2c加固?
其實靈感是來自於谷歌的DEX2OAT的理念:
移動應用包可以在安裝期間從Dex包轉化為可執行的ELF格式的包,相當於從Java程式碼轉換成了二進位制程式碼,極大地提高了移動應用的執行速度。
基於這個理念延伸,我們思考:何不把這個轉換過程在加固期間就做掉呢?這樣加固後的移動應用包就是二進位制程式碼的形式,無論是安裝還是執行速度都可以有極大地提升。
而且Android開發天然就支援NDK(簡單來說就是底層提供C++代表編譯成的SO),加固時把Java程式碼轉換成NDK層的二進位制程式碼,這樣就解決了效能和相容性問題。由於二進位制轉換是在加固期間做的,加固後的移動應用包是轉換後的二進位制結果,它是不可逆的,也因此大大地提高了安全強度。
下面我們就來看看具體的測試資料
一、特性說明:
易盾加固Java2c方案作為最新一代Android移動應用Dex檔案保護方案:
1.強度上:以“程式碼下沉”的方式把java層程式碼完全下沉到本地層,大大增大了攻擊者的分析難度,高於以往的加殼以及dexVmp保護。
應用程式經過易盾加固java2c方案加固以後,在執行的過程中不存在像如下圖1所示的一代和二代“殼”保護完以後會在記憶體中出現整體或者部分資料還原,因此強度上遠遠高於早先的程式碼抽取的各種殼。於當下比較流行的三代dex
VMP相比,在dex VMP中攻擊者可以在記憶體中對虛擬直譯器中的指令進行監控,透過對映表進行還原
,對於經過java2c加固以後,Java層程式碼完全的下沉到本地層面,攻擊者的攻擊目標由Java層轉為Native層面,這個時候對於攻擊者而言
,從Native層面還原為Java層面的這個過程是不可逆的,不存在還原,難度會大大的增加。
2. 效能上:以獨有的“靜態保護”技術,沒有執行時的記憶體劫持改變,加固後的執行效能上面優於以往的加殼以及當下流行的dexVmp保護;以下透過加固前後CPU、記憶體佔用率對比、啟動時間對比、測試透過率對比、體積增加對比來說明。
2.1加固前後CPU、記憶體佔用率對比
以下是魅拍APP對其中的四大元件下面所有的類進行java2c加固以後的效能資料對比圖,從以下圖2、3可以看出,加固前後的應用的CPU佔用率、以及記憶體佔比影響不大,並且在實際的加固中會根據每個應用類的特色進行甄選,加固產生的效能影響可以忽略不計。
2.2加固前後啟動時間對比:
如圖4所示為市面上各個型別的應用程式經過加固以後的啟動時間對比圖,從圖中可以看到經過加固以後的程式的啟動時間增加非常小,對於使用者的影響可以忽略不計。
2.3加固前後測試透過率對比:
如圖5所示為同樣型別的應用程式加固以後透過百臺測試機測試的透過率與加固前的對比圖,從圖中可以看出透過率基本上與加固前是一致的。
2.4加固前後體積增加對比:
由於在易盾加固java2c方案中應用加固體積的增加與自身應用的類和方法的複雜性是息息相關的,在某些應用上還會出現加固以後變小的可能。如圖6所示加固處理的預設規則為四大元件下面的所有的類和方法,方法數量在幾百至幾千個,整體大小的增加均在可接受範圍內,由於某些APP本身的方法比較複雜,因此體積增加可能比較明顯,可以透過黑白名單對於一些不重要的類和方法進行過濾處理,達到使用者的需求。
3.相容性上:易盾加固java2c方案不僅加固上支援dex的全指令級以及函式級的細粒度化,從圖7可以看到透過中間狀態的介入再生成各個目標平臺程式碼,相容性上與保護前一樣。
由於易盾加固java2c方案是把待保護APK中的dex檔案中間狀態變換為一個另一種的中間狀態,這個時候還沒有生成底層的各個目標平臺的狀態。如下圖5所示,因此相容性上與保護前的狀態是一樣的。
4.
靈活性上:預設加固當前APK四大元件下面的所有的類和方法,同時透過黑白名單和註解的方式來滿足使用者對於不同類和方法粒度化的加固需求配置。既可以透過黑白名單對預設處理規則以外的類進行控制,同時如下圖8左所示可以透過註解“NEJ2CProtect”對待加固的類和方法進行標記處理;在加固的時候就會只對sub方法進行處理,反編譯的結果如圖8右所示。
二、效果展示:
接下來透過一個簡單的Demo展示加固前後的比較
加固前:
加固後:
反編譯java層程式碼
加固後:
反編譯java層程式碼
加固後:
反編譯java層程式碼
生成的本地層程式碼
從上面的效果圖可以看到保護前的java層程式碼完全下沉到本地層,為了觀察前後的效果沒有增加混淆和so的加殼處理,即便如此也有力的增大了攻擊者的分析難度。
易盾最新一代的Java2C加固方案,以獨有的“靜態保護”技術,使得應用程式中的程式碼出現“下沉”,達到不可逆的效果,兼顧“冷熱啟動時間”、“CPU”、 “記憶體佔用率”、“體積”等重要指標,同時保障使用者加固的靈活性。
作者介紹:
趙貝貝,網易易盾高階客戶端安全工程師。2018年7月加入網易,主要負責安卓移動應用安全加固。
朱星星,網易易盾客戶端安全專家。2011年加入網易,主要負責遊戲反外掛、安卓移動應用安全。