閱讀880 返回首頁    go 阿裏雲 go 技術社區[雲棲]


防逆向技術簡史:從代碼混淆到虛擬機保護技術

開發軟件的人都知道這個世界上沒有破解不了的軟件,隻有不值得破解的軟件。換而言之,隻有軟件的破解成本超過Hacker收益,軟件資產才是相對安全的。Android平台以其免費和開源的特性占據了移動應用領域半壁江山,但也因其應用很容易被逆向破解獲取源碼,導致它成為Hacker最喜歡攻擊的一個“靶子”。

image


那麼如何才能保護自己開發APP不被逆向破解呢?在道高一尺魔高一丈的網絡安全攻防對抗中,防逆向保護技術也在不停更新演進,筆者在這裏梳理了幾個關鍵時期的防逆向保護技術,讓大家對APP防護有一個更好理解。

啟蒙階段——防逆向保護始於代碼混淆技術

這個時期最大特點是,從未能登上大雅之堂的代碼混淆技術,搖身一變成為了防逆向保護唯一有效的技術。這要從1995年JAVA語言橫空出世說起,它讓人們在享受跨平台便利運行的同時,由於其天生易反編譯特性,也讓傳統針對機器碼的安全保護一夜之間變得毫無用處。

從此,那個曾經被唾棄的代碼混淆技術開始逐漸被人所重視。從Android 2.3開始,Google在SDK中加入了一款叫ProGuard代碼混淆工具,通過它可混淆JAVA代碼。


image
ProGuard混淆後DEX文件截圖

從上圖就可以看到,代碼混淆之後左側的類名大多都變成了a、b等自定義字母,雖然機器執行起來的邏輯是一樣的,但增加了黑客人為分析的難度和時間成本。從某種程度上來說,代碼混淆技術很好的保護JAVA源代碼,但這種方式也隻是簡單的改變類名或者變量名,黑客隻要找到DEX文件,反編譯也就是時間問題了,就看時間成本是否超過黑客收益。

發展階段——DEX加密技術成為應用防護中流砥柱

隨著Android反編譯技術越來越純熟,即便代碼混淆技術做到native層,也是治標不治本。為了解決代碼混淆技術存在弊端,越來越多的人采用DEX整體隱藏和DEX函數抽取加密來保護自己代碼安全,例如梆梆安全等廠商早期加固產品用的就是這個技術。

1. DEX文件整體加密

對DEX文件進行整體加密,與殼APK進行合並得到新的DEX文件,然後替換殼程序中的DEX文件即可得到新的APK。新APK運行時將加密後DEX 文件在內存中解密,並讓 Dalvik虛擬機動態加載執行。


image


DEX文件整體加密能夠對抗靜態分析,但也存在一定缺陷。該技術對DEX文件進行整體加密、解密操作,運行時在內存中存在連續完整的代碼。通過修改Dalvik虛擬機就有可能通過內存Dump的方式獲得解密後的代碼。雖然開發者可以采取一些 patch 的方法來增加破解難度,例如類加載結束後,抹掉或者混淆內存中 DEX 文件的頭部或尾部信息,但這些方法也無法從根本上解決內存 Dump 的問題。

2. DEX函數抽取加密

為解決DEX文件整體加密可以被內存 Dump這個弱點,DEX函數抽取加密技術對代碼中每個方法抽取進行單獨加密。JAVA 虛擬機在第一次執行某個方法前,才開始加載這個方法的代碼。利用這個機製將解密操作延遲到某個方法在執行之前才對該方法進行解密,並且解密後代碼在內存中是不連續存放。例如通過抽取Dalvik虛擬機運行一個DEX必不可缺少DEXCode中的部分,然後對字節碼指令添加nop,這種方式大大增加代碼安全性。


image
加密前後DEX 文件中的代碼對比

這種加固技術的主要優點在於:

加密粒度變小,加密粒度從DEX 文件級別變為方法級別;

按需解密,解密操作延遲到某個方法在確實要執行之前才觸發,如果方法不被執行,則不被解密;

內存不連續,避免了內存 Dump的問題,極大提高安全性。

巔峰階段——VMP加固成為防逆向保護“終極大招”

DEX函數抽取加密解決了內存被Dump問題,但是本質上這也是一種代碼隱藏技術,最終代碼還是通過Dalvik或者ART 虛擬機進行執行。因此,破解者可以構建一個自己修改過的虛擬機來脫殼。這就需要尋求更加強大、安全的防逆向技術來保證 APK 的安全。虛擬機軟件保護技術(VMP)成為了當下最前沿移動應用安全加固技術。

VMP首先會對被保護的目標程序核心代碼進行“編譯”,將由編譯器生成的本機代碼(Native code)轉換成效果等價的byte-code,然後將控製權交虛擬機,由虛擬機來執行控製。VMP最關鍵技術是需要自定義一套虛擬機指令和與之對應解釋器,然後將標準指令轉換成自己指令,由自定義解釋器解釋執行指令。

這樣即使破解者拿到自定義的字節碼也毫無意義,除非能夠逆向破解自定義的虛擬機解釋引擎。除此之外,VMP 還可以構建多個不同虛擬化解釋引擎,不同的JAVA方法采用不同的虛擬化執行引擎,這就進一步提高了應用的安全性。

雖然現在市場上有相當一部分廠商都發布了針對移動應用VMP保護方案,但其實有很多廠商采用都是代碼混淆或者代碼隱藏技術。筆者認為擁有一套高質量的自定義指令集和解釋器是判斷VMP技術真偽唯一標準。而了解,目前在國內安全廠商中隻有梆梆安全等公司在VMP技術上發展相對成熟。

寫在最後:

任何安全技術變遷都是一部曆史,移動應用安全發展也是如此。從某種程度上來看,Android應用防逆向技術演化史基本等於移動應用安全進化史。例如國內首個提出“應用加固”概念的梆梆安全,其加固技術也是從早期代碼混淆技術演化到當前最先進虛擬機保護技術。

安全的攻與防是一個永恒話題,也是一個動態螺旋式發展過程,開發者需要不斷提高自己安全意識和安全技能,才能更好應對各種層出不窮安全問題。

本文轉自d1net(轉載)

最後更新:2017-08-13 22:48:35

  上一篇:go  二周年雜記
  下一篇:go  做好網站SEO優化的三大布局思路