• 正文
    • Part 01●??為什么要進(jìn)行加固??●
    • Part 02●??Apk加固的原理?●
    • Part 03●? 加固發(fā)展過程?●
    • Part 04●?結(jié)束語?●
  • 推薦器件
  • 相關(guān)推薦
申請(qǐng)入駐 產(chǎn)業(yè)圖譜

五分鐘技術(shù)趣談 | Android應(yīng)用加固的那點(diǎn)事

2024/01/01
5775
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點(diǎn)資訊討論

作者:蔣曉燕,單位:中國(guó)移動(dòng)智慧家庭運(yùn)營(yíng)中心成都業(yè)務(wù)支持中心

隨著人們對(duì)智能手機(jī)依賴的程度越來越高,因智能手機(jī)軟件安全導(dǎo)致用戶信息泄露、財(cái)產(chǎn)損失事件頻發(fā),人們開始越來越關(guān)注App安全這個(gè)領(lǐng)域。從開發(fā)的角度來講則是App源代碼安全問題,基于代碼審計(jì)層次的;從軟件保護(hù)角度來講app安全則是對(duì)源代碼的代碼混淆,資源加密,邏輯加固;從用戶的角度來講就是App本身的安全性,是否會(huì)對(duì)個(gè)人隱私財(cái)產(chǎn)造成損失。

Part 01●??為什么要進(jìn)行加固??

Android操作系統(tǒng)全部開源,可以對(duì)Android應(yīng)用程序Apk進(jìn)行解包,對(duì)DEX文件進(jìn)行逆向工程,就可以獲取到原始的源代碼和應(yīng)用程序邏輯。通過逆向工程可以竊取應(yīng)用程序的核心代碼、攻破程序邏輯限制、篡改應(yīng)用程序或注入惡意代碼、嗅探應(yīng)用服務(wù)器API接口。

通過應(yīng)用加固可以增加軟件的逆向成本,保護(hù)軟件的利益不受損壞,保護(hù)軟件版權(quán),防止應(yīng)用被破解,保護(hù)應(yīng)用程序的關(guān)鍵信息不被竊取。

Part 02●??Apk加固的原理?

應(yīng)用程序Apk的關(guān)鍵信息都保存在DEX文件中,加固重點(diǎn)是保護(hù)DEX文件不被逆向。常用思路就是打包時(shí)使用私有算法改變DEX文件結(jié)構(gòu),無法使用常規(guī)手段讀取DEX文件內(nèi)容;由于DEX文件結(jié)構(gòu)發(fā)生了變化,宿主機(jī)也無法讀取識(shí)別DEX文件,就需要應(yīng)用程序提供自定義的加載程序,完成DEX文件的解密與加載。

Apk加固后主DEX文件已經(jīng)是看不到原碼,這樣就達(dá)到了加固的效果,但是這樣做會(huì)導(dǎo)致主App的Application已經(jīng)是沒有效了,可以通過自定義Application生命周期里的創(chuàng)建函數(shù)attachBaseContext和onCreate函數(shù),在attachBaseContext中將解密出來的DEX交給系統(tǒng)處理,onCreate的時(shí)候要將主App的Application創(chuàng)建出來,并替換系統(tǒng)中的Application引用,這樣就可以保證Activity順利加載執(zhí)行。

Part 03●? 加固發(fā)展過程?

Apk加固技術(shù),前后經(jīng)歷了四代技術(shù)變更,保護(hù)級(jí)別在每一代都有所提升。

3.1 第一代加固:動(dòng)態(tài)加載

原理? 第一代加固技術(shù)用于保護(hù)應(yīng)用的邏輯不被逆向與分析,主要基于Java虛擬機(jī)提供的動(dòng)態(tài)加載技術(shù)。開發(fā)階段中將程序切分成加載(Loader)與關(guān)鍵邏輯(Payload)兩部分,并分別打包;運(yùn)行時(shí)加載部分(Loader)會(huì)先運(yùn)行,釋放出關(guān)鍵邏輯(Payload),然后使用Java的動(dòng)態(tài)加載技術(shù)進(jìn)行加載,并轉(zhuǎn)交控制權(quán)。

缺陷:第一代加固技術(shù)的缺陷是動(dòng)態(tài)加載機(jī)制要求其關(guān)鍵邏輯(Payload)部分必須解壓,并且釋放到文件系統(tǒng),這就給了攻擊者機(jī)會(huì)去獲取對(duì)應(yīng)的文件。攻擊者可以通過自定義虛擬機(jī),攔截動(dòng)態(tài)加載機(jī)制所使用的關(guān)鍵函數(shù),在這個(gè)函數(shù)內(nèi)部,復(fù)制文件系統(tǒng)中的關(guān)鍵邏輯(Payload)文件。

3.2 第二代加固:不落地加載

原理? 第二代加固技術(shù)主要為了解決解密后的Payload需要寫入文件系統(tǒng)被竊取的問題,由代碼接管Application對(duì)象的創(chuàng)建,主要流程:

1)Loader被系統(tǒng)加載。

2)系統(tǒng)初始化Loader內(nèi)的StubApplication。

3)StubApplication解密并且加載原始的DEX文件(Payload)。

4)StubApplication從原始的DEX文件(Payload)中找到原始的Application對(duì)象,創(chuàng)建并初始化。

5)借助Java反射機(jī)制,將系統(tǒng)內(nèi)所有對(duì)StubApplication對(duì)象的引用使用替換成原始Application。

6)由Android系統(tǒng)進(jìn)行其他組件的正常生命周期管理。

缺陷:第二代加固技術(shù)不會(huì)將解密后的DEX存儲(chǔ)到文件系統(tǒng),但是在應(yīng)用啟動(dòng)時(shí)要處理大量的加解密加載操作,會(huì)造成應(yīng)用長(zhǎng)時(shí)間假死(黑屏),用戶體驗(yàn)差。相對(duì)于第一代技術(shù)沒有本質(zhì)區(qū)別,雖然能防止第一代加固技術(shù)文件必須落地被復(fù)制的缺陷,但是逆向工作者也可以從內(nèi)存中找到DEX文件,通過GDB等調(diào)試工具,相對(duì)于第一代加固提高了DEX獲取的成本。

3.3 第三代加固:指令抽離

原理? 由于前兩代加固技術(shù)均是對(duì)文件級(jí)別進(jìn)行加密,DEX文件在內(nèi)存中的Payload是連續(xù)的,可以被攻擊者輕易獲取。第三代加固技術(shù)保護(hù)級(jí)別深入到了函數(shù)級(jí)別。發(fā)布階段將原始DEX內(nèi)的函數(shù)內(nèi)容(Code Item)清除,單獨(dú)寫入到一個(gè)文件中,App啟動(dòng)后,在運(yùn)行階段將函數(shù)內(nèi)容重新恢復(fù)到對(duì)應(yīng)的函數(shù)體。

缺陷:指令抽離技術(shù)使用了大量的虛擬內(nèi)部結(jié)構(gòu)與未被文檔公開的特性,再加上Android復(fù)雜的廠商定制,給DEX文件竊取帶來了很大的難度。但是指令抽離技術(shù)的某些方案與虛擬機(jī)的JIT性能優(yōu)化沖突,無法達(dá)到最佳的運(yùn)行性能。攻擊者可以通過自定義Android虛擬機(jī),在解釋器的代碼上記錄每一個(gè)函數(shù)的內(nèi)容(CodeItem),通過遍歷觸發(fā)所有函數(shù),從而獲取到全部的函數(shù)內(nèi)容,最終重新組裝成一個(gè)完整的DEX文件。目前已經(jīng)有自動(dòng)化工具可以指令抽離技術(shù)中脫殼。

3.4 第四代加固:指令轉(zhuǎn)換

原理? 第四代加固技術(shù)提供了函數(shù)級(jí)別的級(jí)別的保護(hù),但是攻擊者借助Android虛擬機(jī)內(nèi)的解釋器執(zhí)行代碼,依然可以獲取到DEX文件,第四代加固技術(shù)使用自定義的的解釋器來替代標(biāo)準(zhǔn)解釋器,由于自定義的解釋器無法對(duì)Android系統(tǒng)內(nèi)的其他函數(shù)進(jìn)行直接調(diào)用,必須使用JAVA的JNI接口進(jìn)行調(diào)用。

缺陷:指令轉(zhuǎn)換技術(shù)必須通過虛擬機(jī)提供的JNI接口與虛擬機(jī)進(jìn)行交互,攻擊者可以直接將指令轉(zhuǎn)換/VMP加固方案當(dāng)作黑盒,通過自定義的JNI接口對(duì)象,對(duì)黑盒內(nèi)部進(jìn)行探測(cè)、記錄和分析,進(jìn)而得到完整DEX程序。

3.5 下一代加固:虛擬機(jī)源碼保護(hù)

原理? 虛機(jī)源碼保護(hù)加固是用虛機(jī)技術(shù)保護(hù)所有的代碼,包括Java,Kotlin,C/C++,Objective-C,Swift等多種代碼,具備極高的兼容性;使App得到更高安全級(jí)別的保護(hù),運(yùn)行更加穩(wěn)定。虛機(jī)源碼保護(hù)在App內(nèi)部隔離出獨(dú)立的執(zhí)行環(huán)境,該核心代碼的運(yùn)行程序在此獨(dú)立的執(zhí)行環(huán)境里運(yùn)行。即便App本身被破解,這部分核心代碼仍然不可見。

虛機(jī)源碼保護(hù)擁有獨(dú)特的可變指令集,極大的提高了指令跟蹤、逆向分析的難度。同時(shí),虛機(jī)源碼保護(hù)還提供了反調(diào)試能力和監(jiān)控能力。虛機(jī)源碼保護(hù)可以通過自身的探針感知到環(huán)境的變化,實(shí)時(shí)探測(cè)到外界對(duì)本環(huán)境的調(diào)試、注入等非正常執(zhí)行流程變化,將調(diào)試動(dòng)作引入程序陷阱,并發(fā)出警報(bào),進(jìn)而進(jìn)行實(shí)時(shí)更新,提高安全強(qiáng)度。虛機(jī)源碼保護(hù)加固作為當(dāng)前領(lǐng)先的加固技術(shù),在未來很長(zhǎng)一段時(shí)間,能夠?yàn)锳pp提供足夠強(qiáng)度的保護(hù)。

Part 04●?結(jié)束語?

Apk加固是一把雙刃劍,一方面可以保護(hù)App的核心代碼算法,提高破解/盜版/二次打包的難度,緩解通過代碼注入/動(dòng)態(tài)調(diào)試/內(nèi)存注入等形式攻擊;另一方面加固是改變標(biāo)準(zhǔn)執(zhí)行流程,增加了許多防護(hù)機(jī)制,會(huì)影響兼容性,影響程序運(yùn)行效率,增加App維護(hù)難度,部分應(yīng)用市場(chǎng)會(huì)拒絕加殼后的應(yīng)用上架。因此我們需要選擇一個(gè)平衡點(diǎn),不要追求一味的安全,也不要過于開放,要保護(hù)好自身的數(shù)據(jù)與知識(shí)產(chǎn)權(quán)。

參考文獻(xiàn)

[1]?簡(jiǎn)書:DEX文件格式淺析,https://www.jianshu.com/p/55e107acd202,2022年10月24日.

[2]? CSDN:Android APK加固原理,https://blog.csdn.net/kingwjh/article/details/128814421,2023年3月23日.

推薦器件

更多器件
器件型號(hào) 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊(cè) ECAD模型 風(fēng)險(xiǎn)等級(jí) 參考價(jià)格 更多信息
KSZ8567RTXI-TR 1 Microchip Technology Inc IC ETHERNET SWITCH 7PORT 128TQFP

ECAD模型

下載ECAD模型
$10.96 查看
DP83848CVVX/NOPB 1 Texas Instruments Commercial temperature, 10/100-Mbps Ethernet PHY transceiver with SNI interface & JTAG support 48-LQFP 0 to 70

ECAD模型

下載ECAD模型
$4.35 查看
TLE9271QXXUMA1 1 Infineon Technologies AG Interface Circuit, PQCC48, VQFN-48
暫無數(shù)據(jù) 查看

相關(guān)推薦

  • 3種系統(tǒng)加持,RK3576核心板Linux、Android、桌面系統(tǒng)全兼容
    文章
    697
    04/02 16:40
  • 安卓系統(tǒng)開源時(shí)代終結(jié),影響幾何?
  • Android系統(tǒng)主板應(yīng)用配置默認(rèn)獲取管理所有文件權(quán)限方法
    文章
    894
    03/12 15:00
  • 瑞芯微開發(fā)板/主板Android調(diào)試串口配置為普通串口方法
    文章
    1217
    02/11 13:56
  • 安卓手機(jī)如何打開開發(fā)者模式?用scrcpy將安卓手機(jī)投屏到電腦
    文章
    1594
    02/06 13:31
  • 登錄即可解鎖
    • 海量技術(shù)文章
    • 設(shè)計(jì)資源下載
    • 產(chǎn)業(yè)鏈客戶資源
    • 寫文章/發(fā)需求
    立即登錄

    移動(dòng)Labs是中國(guó)移動(dòng)的社交化新媒體平臺(tái),是面向外部行業(yè)及產(chǎn)業(yè)鏈合作伙伴的信息發(fā)布、業(yè)務(wù)發(fā)展和產(chǎn)業(yè)推進(jìn)門戶。