現(xiàn)在市面上對(duì)APP的安全合規(guī)管控越來(lái)越嚴(yán)格了,也就要求了APP在上架之前一定要做合規(guī)檢測(cè)和加固處理。對(duì)APP就是加固的好處,可以提高APP的安全性,提高APP被逆向分析破解的門檻,同時(shí)通過(guò)加固保護(hù)可以提高過(guò)安全合規(guī)的檢測(cè)。由于APP加固技術(shù)不斷被攻破情況,因此加固技術(shù)也是不斷在快速迭代的過(guò)程。現(xiàn)在市面上的加固產(chǎn)品的還是比較多的,并且各個(gè)加固技術(shù)產(chǎn)品都有其各自優(yōu)缺點(diǎn),但是加固產(chǎn)品的所采用技術(shù)去有很多共性的地方。下面就對(duì)加固和脫殼對(duì)抗方案做些梳理總結(jié)。 加固準(zhǔn)備 APP加固主要是對(duì)APP中的dex文件、so文件、資源文件等進(jìn)行保護(hù),因此這邊對(duì)這APP中的關(guān)鍵文件結(jié)構(gòu)做簡(jiǎn)短梳理總結(jié)。 App文件的結(jié)構(gòu) Dex文件結(jié)構(gòu) SO文件結(jié)構(gòu) 簡(jiǎn)單的APP加固原理的流程
第一代加固和脫殼 第一代加固技術(shù)主要做了進(jìn)行對(duì)app的dex文件進(jìn)行保護(hù)和做了一些簡(jiǎn)單的反調(diào)試保護(hù)。 Dex保護(hù): Dex文件整體加密、字符串加密、自定義DexClassLoader。 動(dòng)態(tài)防護(hù): ptrace反調(diào)試、TracePid值校驗(yàn)反調(diào)試。 第一代加固的出現(xiàn)也同時(shí)出現(xiàn)各種對(duì)加固技術(shù)的攻破。從而出現(xiàn)了各種對(duì)抗加固的脫殼方法。 最突出的是直接從內(nèi)存dump出dex完整結(jié)構(gòu)脫殼原理: 程序在啟動(dòng)過(guò)程中,要保證程序正常運(yùn)行,那么加固殼會(huì)自動(dòng)解密受保護(hù)的dex文件并完成加載,基于這個(gè)子解密的原理,我可以選擇在dex加載完成這個(gè)時(shí)機(jī)點(diǎn),將其dump下來(lái)。從而實(shí)現(xiàn)第一層防護(hù)殼、加密殼的脫殼。 下面羅列幾個(gè)脫殼方案
第一代的某些加固產(chǎn)品,安裝包是加密壓縮的,安裝后回在data/dalvik-cache目錄下生成解密的odex文件,這時(shí)候只需要獲取odex文件進(jìn)行做為分析的突破點(diǎn)。
通過(guò)工具:IDA Pro + dumpDEX 1、通過(guò)/proc/%d/maps獲取內(nèi)存映射 2、在內(nèi)存中查找關(guān)鍵字 dex.035或dex.036 3、手動(dòng)dump查找到的數(shù)據(jù)。
1、通過(guò)基于IDA的android_server的代理方式進(jìn)行附加app。 2、再IDA中下dvmDexFileOpenPartial 斷點(diǎn),確認(rèn)要dump的起始地址和大小。 3、用ida的腳本方式進(jìn)行dump出原始數(shù)據(jù)。
Hook脫殼法一般都是基于frida和xposed這兩個(gè)框架進(jìn)行做hook操作的。 這種hook脫殼法:先需要進(jìn)行分析app應(yīng)用,找到可以進(jìn)行hook的函數(shù), 然后在選擇用的順手的、適用的frida或xposed框架進(jìn)行 hook。 (xposed是java編譯,適用于java層hook;frida適用于java層和native層hook)。 通過(guò)對(duì)關(guān)鍵函數(shù)dvmDexFileOpenPartial進(jìn)行hook實(shí)現(xiàn)脫殼。 也可以通過(guò)xposed框架hook ClassLoader的loadClass函數(shù)實(shí)現(xiàn)脫殼。
主要是通過(guò)修改系統(tǒng)源碼中的關(guān)鍵函數(shù),接著將修改后的源碼重新編譯并進(jìn)行刷機(jī)。 例如通過(guò)修改系統(tǒng)dvmdexfileopenpartial函數(shù)的關(guān)鍵邏輯。在函數(shù)里面修改寫入我們想要實(shí)現(xiàn)的功能。 第二代加固和脫殼 由于第一代加固是整體性加固的,因此只要dump到關(guān)鍵點(diǎn)后,就可以完整的獲取到dex整個(gè)內(nèi)容。由于第一代殼的缺點(diǎn),隨之而來(lái)的就是進(jìn)行對(duì)APP中關(guān)鍵類的抽取技術(shù)。那么第二代加固主要進(jìn)行如下的功能點(diǎn)。
脫殼技術(shù)方案 脫殼原理: 主動(dòng)調(diào)用類中的每一個(gè)方法,并實(shí)現(xiàn)函數(shù)指令的還原 常見的加固廠商的指令抽取的實(shí)現(xiàn)方式主要又兩大類,一種是指令代碼在dex文件原便宜位置處還原,另外一種就是隨機(jī)分配,通過(guò)修訂偏移的方式,使程序在執(zhí)行過(guò)程中通過(guò)修定的便宜找到函數(shù)指令;android程序在執(zhí)行過(guò)程,使用到類時(shí)候,都需要進(jìn)行加載,而在加載過(guò)程中,函數(shù)指令就會(huì)進(jìn)行指令還原或修訂函數(shù)指令指向的位置,我們可以利用這個(gè)時(shí)機(jī),將代碼拷貝到原代碼位置,進(jìn)而實(shí)現(xiàn)類抽取殼的脫殼。 下面羅列針對(duì)第二代加固的脫殼法
通過(guò)內(nèi)存中dex文件的格式,找到完整的dex文件,將其組合到一起。
通過(guò)工具:IDA Pro + dumpDEX 1、通過(guò)/proc/%d/maps獲取內(nèi)存映射 2、在內(nèi)存中查找關(guān)鍵字 dex.035或dex.036 3、手動(dòng)dump查找到的數(shù)據(jù)。 也可以直接用frida中的dump腳本進(jìn)行內(nèi)存dump脫殼。
1、通過(guò)基于IDA的android_server的代理方式進(jìn)行附加app。 2、再IDA中下dvmDexFileOpenPartial 斷點(diǎn),確認(rèn)要dump的起始地址和大小。 3、用ida的腳本方式進(jìn)行dump出原始數(shù)據(jù)。
Hook脫殼法一般都是基于frida和xposed這兩個(gè)框架進(jìn)行做hook操作的。 這種hook脫殼法:先需要進(jìn)行分析app應(yīng)用,找到可以進(jìn)行hook的函數(shù), 然后在選擇用的順手的、適用的frida或xposed框架進(jìn)行 對(duì)關(guān)鍵函數(shù)hook。 (xposed是java編譯,適用于java層hook;frida適用于java層和native層hook)。 通過(guò)對(duì)關(guān)鍵函數(shù)memcmp、dexFileParse進(jìn)行hook實(shí)現(xiàn)脫殼。 也可以通過(guò)hook ClassLoader的loadClass函數(shù)實(shí)現(xiàn)脫殼。
主要是通過(guò)修改系統(tǒng)源碼中的關(guān)鍵函數(shù),接著將修改后的源碼重新編譯并進(jìn)行刷機(jī)。 例如通過(guò)修改系統(tǒng)memcmp、dexFileParse函數(shù)的關(guān)鍵邏輯。在函數(shù)里面修改寫入我們想要實(shí)現(xiàn)的功能。 ![]() 第三代加固和脫殼 ![]() 第三代加固方案主要進(jìn)行對(duì)函數(shù)進(jìn)行做抽取,并進(jìn)行做動(dòng)態(tài)加解密方式,下面羅列關(guān)鍵的加固技術(shù)點(diǎn)
APP函數(shù)抽取指令流程: 1、解析原始dex文件格式,保存所有方法的代碼結(jié)構(gòu)體信息。 2、通過(guò)傳入需要置空指令的方法和類名,檢索到其代碼結(jié)構(gòu)體信息。 3、通過(guò)方法的代碼結(jié)構(gòu)體信息獲取指令個(gè)數(shù)和偏移地址,構(gòu)造空指令集,然后覆蓋原始指令。 4、重新計(jì)算dex文件的checksum和signature信息,回寫到頭部信息中。 脫殼方法:
通過(guò)利用frida框架進(jìn)行hook關(guān)鍵函數(shù)DexFile,OpenFile、dexFindClass等關(guān)鍵函數(shù)實(shí)現(xiàn)脫殼。
通過(guò)修改系統(tǒng)源碼中的關(guān)鍵函數(shù)如DexFile、OpenFile、dexFindClass函數(shù)的關(guān)鍵邏輯,然后進(jìn)行重編系統(tǒng)。 在ART中通過(guò)修改定制dex2oat法進(jìn)行脫殼。 ![]() 第四代加固和脫殼 ![]() 現(xiàn)在市面上強(qiáng)度最強(qiáng)加固方案實(shí)屬代碼虛擬化保護(hù)的方案。通過(guò)將程序的代碼編譯為虛擬機(jī)指令也就是虛擬機(jī)代碼(也就是自定義的代碼集),通過(guò)虛擬機(jī)cpu解釋并執(zhí)行的一種方式。 下面羅列下關(guān)鍵的加固技術(shù)點(diǎn)
脫殼方案
![]() 總結(jié) ![]() 利用frida脫殼方法: 1、通過(guò)找到DexFile對(duì)象(art虛擬機(jī)是DexFile對(duì)象,dalvik虛擬機(jī)下是DexFile結(jié)構(gòu)體),獲取到DEX文件的起始地址和大小,然后dump下來(lái)。 常見能夠找到DexFile對(duì)象的函數(shù)有LoadMethod、ResolveMethod函數(shù)等,能直接獲取到DEX起始地址和大小的常見函數(shù)有openMemory、dexparse、dexFileParse、dvmDexFileOpenPartial等函數(shù)。frida_unpack便是其中的代表作。 2、利用frida的搜索內(nèi)存,通過(guò)匹配DEX文件的特征,例如DEX文件的文件頭中的魔法值---dex.035或dex.036這個(gè)特征。frida-Dexdump便是這種脫殼方法的代表作。 自定義系統(tǒng)和定制的android設(shè)備方法: 1、采用定制的android的rom,可以有效對(duì)抗市場(chǎng)中所有的加密殼、類抽取類型的殼;相比開源的脫殼工具,大體都是基于hook框架,例如frida、Xposed;目前大多加固廠商已經(jīng)對(duì)hook框架,以及脫殼框架的特征進(jìn)行了安全檢測(cè),這會(huì)導(dǎo)致app啟動(dòng)失敗,從而實(shí)現(xiàn)脫殼失敗,而通過(guò)自定義的rom,沒(méi)有依賴hook框架,也就沒(méi)有相關(guān)框架特征代碼標(biāo)志,所以脫殼成功率會(huì)比較高。 2、采用定制android硬件設(shè)備優(yōu)勢(shì),基于android的開源性,google公司每次發(fā)布新版的rom,都會(huì)率先在Pixel、Nexus系列的設(shè)備上最早應(yīng)用,這也導(dǎo)致大部分安全從業(yè)者為了提升工作效率,間隔的采用自定義ROM實(shí)現(xiàn)方式,在市場(chǎng)中開源脫殼ROM,大多是需要刷Nexus、Pixel系列機(jī)型,這也使得大多加固廠商對(duì)這Nexus、Pixel系列機(jī)型做特殊,更深層次的安全防護(hù)檢測(cè),以此保證程序在運(yùn)行過(guò)程中的安全性。通過(guò)定制android硬件設(shè)備,沒(méi)有Nexus、pixel設(shè)備相關(guān)特征,更能提高脫殼的成功率。 ![]() E N D ![]() |
|
來(lái)自: 長(zhǎng)沙7喜 > 《極客與安全》