斯進(jìn) 楊雪 裴洪卿 岑嘉俊
摘? 要: 為解決智能手機(jī)應(yīng)用程序加固后無(wú)法獲得代碼運(yùn)行邏輯及敏感數(shù)據(jù)的問(wèn)題,研究了加殼、代碼加密、結(jié)構(gòu)加固、資源混淆等APK常見(jiàn)加固技術(shù)的基本原理。通過(guò)脫殼查看核心功能代碼、修復(fù)魔數(shù)頭、根據(jù)ZIP文件結(jié)構(gòu)去除垃圾內(nèi)容、破解加密算法等方法,對(duì)APK進(jìn)行加固破解。該方法基于大量APK實(shí)例總結(jié)提煉而來(lái),具有一定的普適性,可為取證人員開展涉案APK分析取證提供支持。
關(guān)鍵詞: 手機(jī)應(yīng)用程序; 逆向分析; APK加固技術(shù); App加固破解
中圖分類號(hào):TP399? ? ? ? ? 文獻(xiàn)標(biāo)識(shí)碼:A? ? ?文章編號(hào):1006-8228(2023)09-29-03
Research on cracking methods of APK reinforcement technology
Si Jin1, Yang Xue1, Pei Hongqin2, Chen Jiajun2
(1. Zhejiang Police College, Hangzhou, Zhejiang 310053, China; 2. Hangzhou Pinghang Technology Co., Ltd)
Abstract: To solve the problem that the code running logic and sensitive data cannot be obtained after the smart phone application is reinforced, the basic principles of common APK reinforcement techniques such as shelling, code encryption, structure reinforcement and resource obfuscation are studied. The reinforced APK is cracked by some methods such as shelling to view the core function code, repairing the magic number header, removing the garbage content according to the ZIP file structure, and cracking the encryption algorithm. These methods are based on the summary and extraction of a large number of APK cases, and have a certain degree of universality, which can provide support for forensics personnel to conduct APK analysis and evidence collection.
Key words: mobile application; reverse analysis; APK reinforcement technology; App cracking technology
0 引言
隨著智能手機(jī)在我國(guó)的普及,人們的上網(wǎng)方式也隨之發(fā)生改變?!兜?0次中國(guó)互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告》顯示,截至2022年6月,我國(guó)網(wǎng)民規(guī)模為10.51億,其中手機(jī)網(wǎng)民規(guī)模為10.47億,占全體網(wǎng)民的99.6%[1]。手機(jī)用戶的高速增長(zhǎng)促進(jìn)了移動(dòng)支付技術(shù)廣泛應(yīng)用,各類智能手機(jī)應(yīng)用程序(以下簡(jiǎn)稱APP)APP迅速覆蓋了人們?nèi)粘3鲂小①?gòu)物娛樂(lè)、金融理財(cái)?shù)雀鱾€(gè)領(lǐng)域,其中安卓系統(tǒng)的應(yīng)用程序占有較高比例,為確保手機(jī)端應(yīng)用程序安全,開發(fā)者使用加殼、代碼加密、資源混淆等加固技術(shù),來(lái)保護(hù)安卓應(yīng)用程序的安裝包(AndroidPackage,簡(jiǎn)稱APK),這種方法在解決手機(jī)應(yīng)用安全問(wèn)題的同時(shí),也給APK取證分析帶來(lái)了困擾。本文對(duì)APK常見(jiàn)加固技術(shù)進(jìn)行分析研究,提出基于靜態(tài)分析的破解方法,為公安機(jī)關(guān)開展APK分析取證提供思路和方法。
1 常見(jiàn)APK加固技術(shù)
通常情況下,為應(yīng)對(duì)目前移動(dòng)應(yīng)用市場(chǎng)領(lǐng)域的破解、反編譯、盜版等現(xiàn)象,企業(yè)在開發(fā)手機(jī)應(yīng)用時(shí)會(huì)對(duì)APK加固以實(shí)現(xiàn)代碼加密。APK加固的目的是保護(hù)APK代碼邏輯,其原理是將APK文件進(jìn)行隱藏、混淆、加密等操作,使反編譯無(wú)法獲取APK內(nèi)的項(xiàng)目源碼和資源。加固后的APK最明顯特征是反編譯后無(wú)法直觀地查看APK中的Java代碼,部分APK無(wú)法通過(guò)正常解包或反編譯得到資源文件,甚至AndroidManifest.xml文件中的特征也被隱藏起來(lái)。
常見(jiàn)APK應(yīng)用加固方法主要有整體型加固、函數(shù)抽取加固和虛擬機(jī)源碼保護(hù)三類。具體特點(diǎn)如表1所示。
隨著APK開發(fā)流程的逐步細(xì)化,開發(fā)者主要通過(guò)從市場(chǎng)上購(gòu)買加殼服務(wù)來(lái)實(shí)現(xiàn)對(duì)APK的加固,因此常使用的方式是整體型加固。整體加固需要源程序、加密工具和解殼程序三要素共同參與實(shí)現(xiàn)對(duì)原APK的dex文件進(jìn)行加密,啟動(dòng)應(yīng)用時(shí)對(duì)dex解密,通過(guò)DexClassLoader進(jìn)行加載,具體流程如圖1所示[2]。
源程序:需要被加殼保護(hù)的Android應(yīng)用程序的代碼,可以是Android應(yīng)用的apk也可以是Android應(yīng)用的dex文件和so庫(kù)文件。
加密工具:對(duì)源程序進(jìn)行加密的工具,即對(duì)Android應(yīng)用的APK或者Android應(yīng)用的dex文件和so庫(kù)文件進(jìn)行加密的工具,為解殼程序提供源程序的解殼數(shù)據(jù),語(yǔ)言和平臺(tái)不限,加密處理方式根據(jù)加殼的需求來(lái)處理。
殼dex文件:實(shí)現(xiàn)解密解殼數(shù)據(jù)并通過(guò)DexClassLoader動(dòng)態(tài)加載和運(yùn)行源程序的代碼,實(shí)現(xiàn)Android解殼程序與Android源程序的無(wú)縫替換,Android源程序APK得到執(zhí)行[3]。
2 實(shí)例分析
如上文所述,整體加固實(shí)現(xiàn)對(duì)APK的加密、混淆、加殼處理,因此,破解工作并非一蹴而就,市場(chǎng)上主流軟件也難以實(shí)現(xiàn)自動(dòng)化處理[4]。本文將結(jié)合實(shí)例逐一演示加固技術(shù)破解方法。
2.1 加殼處理
要解決APK加殼問(wèn)題,首先需要了解加殼的原理和類型,以便能夠正確識(shí)別APK的殼。APK加殼就是通過(guò)在二進(jìn)制的程序中植入一段代碼,使其在運(yùn)行時(shí)優(yōu)先取得程序的控制權(quán),以達(dá)到完成一些額外功能的目的。APK被加殼時(shí),會(huì)將源dex文件進(jìn)行加密拼接寫入殼dex文件中,同時(shí)記錄位置以方便殼知道從哪里開始加載源dex文件內(nèi)容。這意味著新的dex文件內(nèi)容由殼dex文件和加密后的源dex文件組成。
⑴ 基于Xposed類工具的安卓端脫殼方法[5]
該方法原理是針對(duì)加載已解密dex內(nèi)容的com.Android.dex.Dex類對(duì)象內(nèi)容進(jìn)行提取,進(jìn)而得到源dex文件。脫殼時(shí),需要準(zhǔn)備一個(gè)具有root權(quán)限的安卓設(shè)備,或者使用具有root權(quán)限的安卓模擬器安裝Xposed框架和脫殼工具進(jìn)行APK脫殼,并且需要通過(guò)adb命令導(dǎo)出脫殼后的源dex文件。
⑵ 利用Frida工具暴力提取 dex文件
該方法原理是先使用具有root權(quán)限的安卓設(shè)備(手機(jī)/模擬器)安裝運(yùn)行加固APK,再將加載到安卓設(shè)備內(nèi)存中的源dex文件提取到計(jì)算機(jī)本地。dex文件具有一定結(jié)構(gòu)特征,如文件頭為“dex 035”,對(duì)應(yīng)hex值為6465780A303335,在APP運(yùn)行時(shí),通過(guò)手工操作可以把內(nèi)存中的dex文件“dump”到取證工作站。圖2展示dex文件頭的結(jié)構(gòu)。
2.2 AndroidManifest.xml文件混淆修復(fù)
APK常采用文件頭結(jié)構(gòu)修改、文件編碼修改等復(fù)合混淆方式,對(duì)AndroidManifest.xml文件進(jìn)行混淆,導(dǎo)致文件內(nèi)容無(wú)法查看。
⑴ 文件頭結(jié)構(gòu)修改
分析AndroidManifest.xml文件的結(jié)構(gòu)發(fā)現(xiàn),其文件頭標(biāo)識(shí)被修改成“0x0000”,此外,可以發(fā)現(xiàn)16位和32位處有異常的“F”位,被修改的三個(gè)地方分別對(duì)應(yīng)AndroidManifest.xml文件的魔數(shù)頭、字符總數(shù)和樣式符偏移,如圖3所示。AndroidManifest.xml正常的文件頭標(biāo)識(shí)為“0x0300”,因此,修復(fù)被篡改文件頭方法非常簡(jiǎn)單,只需將前兩位“0x0000”改回“0x0300”即可正常反編譯。
修復(fù)AndroidManifest.xml的文件頭后文件格式恢復(fù)正常,但文件內(nèi)容仍有大量亂碼。在以往的APK逆向分析中,我們發(fā)現(xiàn)針對(duì)Androidmanifest.xml的正文混淆通常會(huì)采用“Android”標(biāo)簽替換成任意字符串的方式,只需要在自研解析工具中根據(jù)“Android”標(biāo)簽的偏移找到該字符串并將其強(qiáng)制替換回“Android”即可修復(fù),但在最近研究發(fā)現(xiàn),開發(fā)者還會(huì)在Androidmanifest.xml中插入大量無(wú)用標(biāo)簽來(lái)干擾分析,因此還需要按照一定規(guī)則把垃圾標(biāo)簽和內(nèi)容剔除。
⑵ 混淆文件編碼修改
通過(guò)本文方法對(duì)AndroidManifest.xml文件修復(fù)后,可以成功反編譯一部分內(nèi)容,但顯示的內(nèi)容可能是中文亂碼,導(dǎo)致數(shù)組索引出現(xiàn)問(wèn)題而報(bào)錯(cuò),這是因?yàn)樵揂ndroidManifest.xml文件使用UTF-16寬字節(jié)編碼,導(dǎo)致反編譯工具不兼容,需要在解析過(guò)程中針對(duì)寬字節(jié)識(shí)別和判斷后,進(jìn)行單字節(jié)處理,最后實(shí)現(xiàn)對(duì)混淆文件的編碼修改。
2.3 APK資源代碼加密破解
對(duì)大量的加密樣本研究發(fā)現(xiàn),在APK內(nèi)部進(jìn)行加解密需自動(dòng)化實(shí)現(xiàn),因此加密常采用對(duì)稱加密算法。對(duì)稱加密是一種比較傳統(tǒng)的加密方式,其加密運(yùn)算、解密運(yùn)算使用的是同樣的密鑰,單鑰加密的安全性依賴于加密算法的強(qiáng)度和密鑰的秘密性。雖然加密類型較為單一,但在不同APK加密對(duì)象不盡相同。有的針對(duì)APK資源文件加密,有的對(duì)APK與服務(wù)器通訊地址的代碼加密,也有的對(duì)APK文件進(jìn)行整體加密。本文介紹以下常見(jiàn)加密類型的破解方法。
⑴ APK資源加密破解
常見(jiàn)APK大都是通過(guò)APP打包公司將搭建好的網(wǎng)站前端進(jìn)行封裝而成的WebAPP。WebAPP是一種框架型APP開發(fā)形式(H5AP框架開發(fā)形式),具有跨平臺(tái)的優(yōu)點(diǎn),該框架由“HTML5云網(wǎng)站+APP應(yīng)用客戶端”構(gòu)成。APP應(yīng)用客戶端只安裝應(yīng)用的外觀部分,而數(shù)據(jù)則是在每次運(yùn)行APP時(shí)加載網(wǎng)站數(shù)據(jù),呈現(xiàn)給手機(jī)用戶。這類APK大多可以通過(guò)分析資源文件,直接獲取通訊地址、打包公司惟一ID號(hào)等。下文為一個(gè)WebAPP的JSON文件內(nèi)容。
為了防止攻擊者獲取資源文件,打包公司會(huì)對(duì)資源文件進(jìn)行加密,一些主流的打包公司,如APIcloud和“第八區(qū)打包”等,使用RC4對(duì)稱加密算法進(jìn)行加密。APIcloud會(huì)通過(guò)特定方法從so文件中提取密鑰,而第八區(qū)則是通過(guò)特定的函數(shù)對(duì)密鑰進(jìn)行拆分和拼接。對(duì)使用第八區(qū)進(jìn)行資源文件加密的APK進(jìn)行反編譯,可搜索到資源加密的算法。代碼中的加密類定義了多個(gè)拆散的原始字符串值,加密算法主要通過(guò)對(duì)這些字符串值進(jìn)行base64加密和拼接處理,最后生成RC4加密的密鑰。
需要說(shuō)明的是,個(gè)別打包公司在打包APP時(shí)會(huì)選擇對(duì)APK資源文件進(jìn)行加密。由于市面上有不少“山寨”公司通過(guò)使用大公司的打包ID和代碼實(shí)現(xiàn)打包。不同打包公司的資源文件加解密方法會(huì)有差異,在做加密破解時(shí)間還需要具體分析APK的加密算法程序腳本。
⑵ APK代碼加密破解
APK代碼加密,一般指對(duì)代碼中重要信息進(jìn)行加密,如APK通訊地址、APK中的關(guān)鍵值、數(shù)據(jù)庫(kù)密碼等重要信息。APK代碼加密通常也使用對(duì)稱加密算法。
通過(guò)分析實(shí)現(xiàn)代碼得到加密的密鑰和參數(shù),可得到APK真正的通訊地址。此外,對(duì)通訊內(nèi)容進(jìn)行加密的APK往往會(huì)伴隨安全環(huán)境的檢測(cè),直接使用動(dòng)態(tài)抓包也可以截取其真正的通訊目標(biāo)地址。圖4展示了通過(guò)指定參數(shù)、密鑰和向量,解密AES密文得到通信目標(biāo)地址的方式。
3 結(jié)束語(yǔ)
本文系統(tǒng)地分析了常用的APK加固技術(shù)特點(diǎn)和流程,并總結(jié)了整體加固流程實(shí)現(xiàn)的加殼、混淆、加密防護(hù)措施的手動(dòng)破解思路和方法。該方法基于大量APK實(shí)例總結(jié)提煉而來(lái),經(jīng)實(shí)踐證明具有較強(qiáng)普適性,可為取證人員開展涉案APK分析取證提供指導(dǎo)。但我們也發(fā)現(xiàn),APK的破解方法也會(huì)隨著加固技術(shù)的不斷演進(jìn)而變化,接下來(lái)我們還將在取證實(shí)踐中不斷歸納和總結(jié)新的破解方法和思路,并將其集成于相應(yīng)的取證工具,為涉案APP的取證分析提供一體化解決方案。
參考文獻(xiàn)(References):
[1] 中國(guó)互聯(lián)網(wǎng)信息中心.第50次中國(guó)互聯(lián)網(wǎng)絡(luò)發(fā)展?fàn)顩r統(tǒng)計(jì)報(bào)告[R].北京:中國(guó)互聯(lián)網(wǎng)信息中心,2022-08-31.
[2] 斜杠青年工作室.apk加固是什么意思(淺談安卓apk加固原理和實(shí)現(xiàn))[EB/OL].http://www.webzuan.cn/szk/7566.html,2022-01-09.
[3] 用友開發(fā)中心.APK加固原理和步驟是什么?[EB/OL].https://www.apicloud.com/blogDetails/8553,2022-06-29.
[4] 孟彩霞,林俊豪,張驍.面向非法第四方支付平臺(tái)的取證分析技術(shù)研究[J].警察技術(shù),2022(4):41-45.
[5] 李佳斌,裴洪卿,鄭雄,等.第三方SDK暗刷流量的取證分析與應(yīng)用[J].警察技術(shù),2022(3):57-60.