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