APP加固技術(shù)歷程及未來級別方案:虛機(jī)源碼保護(hù)

傳統(tǒng)App加固技術(shù)休里,前后經(jīng)歷了四代技術(shù)變更富腊,保護(hù)級別每一代都有所提升坏逢,但其固有的安全缺陷和兼容性問題始終未能得到解決。而下一代加固技術(shù)—虛機(jī)源碼保護(hù)赘被,適用代碼類型更廣泛是整,App保護(hù)級別更高,兼容性更強(qiáng)民假,堪稱未來級別的保護(hù)方案浮入。

undefined

(加固技術(shù)發(fā)展歷程)

第一代加固技術(shù)—?jiǎng)討B(tài)加載

第一代Android加固技術(shù)用于保護(hù)應(yīng)用的邏輯不被逆向與分析,最早普遍在惡意軟件中使用羊异,其主要基于Java虛擬機(jī)提供的動(dòng)態(tài)加載技術(shù)事秀。

其保護(hù)流程是:

開發(fā)階段中將程序切分成加載(Loader)與關(guān)鍵邏輯(Payload)兩部分,并分別打包野舶;

undefined

(開發(fā)階段)

運(yùn)行時(shí)加載部分(Loader)會(huì)先運(yùn)行易迹,釋放出關(guān)鍵邏輯(Payload),然后java的動(dòng)態(tài)加載技術(shù)進(jìn)行加載平道,并轉(zhuǎn)交控制權(quán)睹欲。

undefined

(啟動(dòng)流程)

undefined

(核心代碼)

備注(multidex組件的加固原理):

Android的DEX文件在設(shè)計(jì)之初程序普遍較小,所以在DEX文件設(shè)計(jì)時(shí)一屋,只允許包含65535個(gè)函數(shù)引用窘疮。而隨著Android應(yīng)用的發(fā)展,大量的應(yīng)用的代碼已經(jīng)超過了65535的限制冀墨,為了解決這個(gè)問題闸衫,Android5.0之后原生支持加載多個(gè)dex,而為了對舊版本的兼容诽嘉,Android提供了multidex組件蔚出。該組件的實(shí)現(xiàn)原理與上面介紹的是一致的疫蔓。

缺陷與對抗

第一代加固技術(shù)的缺陷是依賴Java的動(dòng)態(tài)加載機(jī)制,而這個(gè)機(jī)制要求關(guān)鍵邏輯(Payload)部分必須解壓身冬,并且釋放到文件系統(tǒng)衅胀,這就給了攻擊機(jī)會(huì)去獲取對應(yīng)的文件。雖然可以通過關(guān)鍵邏輯(Payload)被加載后酥筝,被從文件系統(tǒng)刪除滚躯,用于防止被復(fù)制,但是攻擊者可以攔截對應(yīng)的刪除函數(shù)嘿歌,阻止刪除掸掏。

而關(guān)鍵邏輯(Payload)會(huì)被加密后保存,可用于對抗靜態(tài)分析宙帝,但是攻擊者可以通過自定義虛擬機(jī)丧凤,攔截動(dòng)態(tài)加載機(jī)制所使用的關(guān)鍵函數(shù),在這個(gè)函數(shù)內(nèi)部步脓,復(fù)制文件系統(tǒng)中的關(guān)鍵邏輯(Payload)文件愿待。

第二代加固技術(shù)—不落地加載

相對第一代加固技術(shù),第二代加固技術(shù)在APK修改方面已經(jīng)完善靴患,能做到對開發(fā)的零干擾仍侥。開發(fā)過程中不需要對應(yīng)用做特殊處理,只需要在最終發(fā)布前進(jìn)行保護(hù)即可鸳君。而為了實(shí)現(xiàn)這個(gè)零干擾的流程农渊,Loader需要處理好Android的組件的生命周期。

主要流程:

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

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

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

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

5)將系統(tǒng)內(nèi)所有對StubApplication對象的引用使用替換成原始Application,此步驟使用JAVA的反射機(jī)制實(shí)現(xiàn)看铆。6)由Android系統(tǒng)進(jìn)行其他組件的正常生命周期管理徽鼎。

undefined

(對開發(fā)零干擾的加固后啟動(dòng)流程)

另一方面,不落地加載技術(shù)是在第一代加固技術(shù)的基礎(chǔ)上改進(jìn)弹惦,主要解決第一代技術(shù)中Payload必須釋放到文件系統(tǒng)(俗稱落地)的缺陷否淤,其主要的技術(shù)方案有兩種:

A.?dāng)r截系統(tǒng)IO相關(guān)的函數(shù)(如read、write)棠隐,在這些函數(shù)中提供透明加解密石抡。具體的流程是:

1)關(guān)鍵邏輯(Payload)以加密的方式存儲(chǔ)在APK中。

2)運(yùn)行時(shí)加載部分(Loader)將關(guān)鍵邏輯釋(Payload)放到文件系統(tǒng)助泽,此時(shí)關(guān)鍵邏輯(Payload)還處于加密狀態(tài)啰扛。

3)加載部分?jǐn)r截對應(yīng)的系統(tǒng)IO函數(shù)(read嚎京,write等)。

4)加載部分(Loader)正常調(diào)用Java動(dòng)態(tài)加載機(jī)制隐解。由于虛擬機(jī)的IO部分被攔截鞍帝,所以虛擬機(jī)讀取到已經(jīng)解密的關(guān)鍵邏輯(Payload)。

undefined

(透明加解密方案流程)

B.直接調(diào)用虛擬機(jī)提供的函數(shù)進(jìn)行不落地的加載煞茫,具體流程是:

1)關(guān)鍵邏輯(Payload)以加密的方式存儲(chǔ)在APK中帕涌。

2)運(yùn)行時(shí)加載部分(Loader)將關(guān)鍵邏輯釋(Payload)放到內(nèi)存。

3)加載部分調(diào)用虛擬機(jī)內(nèi)部接口進(jìn)行加載续徽。

undefined

(不落地加載流程)

關(guān)鍵的系統(tǒng)函數(shù)如下:

undefined

兼容性

方案A透明加密方案由于其需要攔截系統(tǒng)的IO函數(shù)蚓曼,這部分會(huì)使用inline hook或者got hook等技術(shù),其會(huì)帶來一定的兼容性問題

方案B的不落地加載方案由于其調(diào)需要調(diào)用系統(tǒng)內(nèi)部的接口钦扭,而這個(gè)接口并不導(dǎo)出纫版,各個(gè)廠商在實(shí)現(xiàn)時(shí)又有各自的自定義修改,導(dǎo)致該方案存在兼容性問題客情。

缺陷與對抗

第二代加固技術(shù)在應(yīng)用啟動(dòng)時(shí)要處理大量的加解密加載操作其弊,會(huì)造成應(yīng)用長時(shí)間假死(黑屏),用戶體驗(yàn)差裹匙。

在加固技術(shù)實(shí)現(xiàn)上沒有本質(zhì)區(qū)別瑞凑,雖然能防止第一代加固技術(shù)文件必須落地被復(fù)制的缺陷末秃,但是也可以從以下方面進(jìn)行對抗:

例如內(nèi)存中的DEX文件頭會(huì)被清除概页,用于防止在dump文件中被找到;DEX文件結(jié)構(gòu)被破壞练慕,例如增加了一些錯(cuò)誤的數(shù)據(jù)惰匙,提高恢復(fù)的成本。

但是Payload被加載之后铃将,在內(nèi)存中是連續(xù)的项鬼,利用gdb等調(diào)試工具dump內(nèi)存后可以直接找到Payload,進(jìn)行簡單的處理之后可以恢復(fù)出100%的Payload文件劲阎。

和第一代加固技術(shù)的對抗方法一樣绘盟,不落地加載也無法對抗自定義虛擬機(jī)。只需對上述的關(guān)鍵函數(shù)進(jìn)行攔截然后將對應(yīng)的內(nèi)存段寫出去悯仙,即可恢復(fù)Payload龄毡。注意,由于IO相關(guān)的函數(shù)被攔截锡垄,所以無法直接調(diào)用read/write等函數(shù)進(jìn)行直接的讀寫沦零,需要使用syscall函數(shù)進(jìn)行繞過。

雖然廠商會(huì)自己實(shí)現(xiàn)可能上述函數(shù)货岭,從而繞過上述函數(shù)的攔截路操。但是Android的類加載器必須能找到對于的結(jié)構(gòu)體才能正常執(zhí)行疾渴,攻擊者可以以類加載器做為起點(diǎn),找到對應(yīng)的Payload在內(nèi)存中的位置屯仗。

第三代加固技術(shù)—指令抽離

由于第二代加固技術(shù)僅僅對文件級別進(jìn)行加密搞坝,其帶來的問題是內(nèi)存中的Payload是連續(xù)的,可以被攻擊者輕易獲取魁袜。第三代加固技術(shù)對這部分進(jìn)行了改進(jìn)瞄沙,將保護(hù)級別降到了函數(shù)級別。

主要的流程是:發(fā)布階段將原始DEX內(nèi)的函數(shù)內(nèi)容(Code Item)清除慌核,單獨(dú)移除到一個(gè)文件中距境。

undefined

(發(fā)布階段)

運(yùn)行階段將函數(shù)內(nèi)容重新恢復(fù)到對應(yīng)的函數(shù)體】遄浚恢復(fù)的時(shí)間點(diǎn)有幾個(gè)方式:

A.加載之后恢復(fù)函數(shù)內(nèi)容到DEX殼所在的內(nèi)存區(qū)域

undefined

(運(yùn)行階段)

B.加載之后將函數(shù)內(nèi)容恢復(fù)到虛擬機(jī)內(nèi)部的結(jié)構(gòu)體上:虛擬機(jī)讀取DEX文件后內(nèi)部對每一個(gè)函數(shù)有一個(gè)結(jié)構(gòu)體垫桂,這個(gè)結(jié)構(gòu)體上有一個(gè)指針指向函數(shù)內(nèi)容(CodeItem),可以通過修改這個(gè)指針修改對應(yīng)的函數(shù)內(nèi)容粟按。

undefined

C.攔截虛擬機(jī)內(nèi)與查找執(zhí)行代碼相關(guān)的函數(shù)诬滩,返回函數(shù)內(nèi)容。

兼容性

指令抽離技術(shù)使用了大量的虛擬內(nèi)部結(jié)構(gòu)與未被文檔的特性灭将,再加上Android復(fù)雜的廠商定制疼鸟,帶來大量的兼容性問題。

缺陷與對抗

指令抽離技術(shù)的某些方案與虛擬機(jī)的JIT性能優(yōu)化沖突庙曙,無法達(dá)到最佳的運(yùn)行性能空镜。依舊使用了java虛擬機(jī)進(jìn)行函數(shù)內(nèi)容的執(zhí)行。攻擊者可以通過自定義Android虛擬機(jī)捌朴,在解釋器的代碼上做記錄一個(gè)函數(shù)的內(nèi)容(CodeItem)吴攒。接下來遍歷觸發(fā)所有函數(shù),從而獲取到全部的函數(shù)內(nèi)容砂蔽。最終重新組裝成一個(gè)完整的DEX文件洼怔。目前已經(jīng)有自動(dòng)化工具可以指令抽離技術(shù)中脫殼。

undefined

(第三代加固DEX文件脫殼流程)

第四代加固技術(shù)—指令轉(zhuǎn)換/VMP

第三代加固技術(shù)在函數(shù)級別的保護(hù)左驾,使用Android虛擬機(jī)內(nèi)的解釋器執(zhí)行代碼镣隶,帶來可能被記錄的缺陷,第四代加固技術(shù)使用自己的解釋器來避免第三代的缺陷诡右。而自定義的解釋器無法對Android系統(tǒng)內(nèi)的其他函數(shù)進(jìn)行直接調(diào)用安岂,必須使用JAVA的JNI接口進(jìn)行調(diào)用。其主要實(shí)現(xiàn)由兩種:

A.DEX文件內(nèi)的函數(shù)被標(biāo)記為native稻爬,內(nèi)容被抽離并轉(zhuǎn)換成一個(gè)符合JNI要求的動(dòng)態(tài)庫嗜闻。 動(dòng)態(tài)庫內(nèi)通過JNI和Android系統(tǒng)進(jìn)行交互。

undefined

B.DEX文件內(nèi)的函數(shù)被標(biāo)記為native桅锄,內(nèi)容被抽離并轉(zhuǎn)換成自定義的指令格式琉雳,該格式使用自定義接收器執(zhí)行样眠,和A一樣需要使用JNI和Android系統(tǒng)進(jìn)行調(diào)用。

undefined

兼容性

第四代VMP加固技術(shù)一般配合第三代加固技術(shù)使用翠肘,所以第三代的所有兼容性問題檐束,指令轉(zhuǎn)換/VMP加固也存在。

缺陷與對抗

不論使用指令轉(zhuǎn)換/VMP加固的A方案或者B方案束倍,其必須通過虛擬機(jī)提供的JNI接口與虛擬機(jī)進(jìn)行交互被丧,攻擊者可以直接將指令轉(zhuǎn)換/VMP加固方案當(dāng)作黑盒,通過自定義的JNI接口對象绪妹,對黑盒內(nèi)部進(jìn)行探測甥桂、記錄和分析,進(jìn)而得到完整DEX程序邮旷。

undefined

(第四代加固DEX文件恢復(fù))

另外黄选,第四代VMP加固技術(shù)只實(shí)現(xiàn)Java代碼保護(hù),沒有做到使用VMP技術(shù)來保護(hù)C/C++等代碼婶肩,安全保護(hù)能力有所欠缺办陷。

下一代加固技術(shù)—虛機(jī)源碼保護(hù)

跟第四代的VMP加固技術(shù),虛機(jī)源碼保護(hù)加固是用虛機(jī)技術(shù)保護(hù)所有的代碼律歼,包括Java民镜,Kotlin,C/C++险毁,Objective-C制圈,Swift等多種代碼,具備極高的兼容性辱揭;使App得到更高安全級別的保護(hù)离唐,運(yùn)行更加穩(wěn)定。

虛機(jī)源碼保護(hù)為用戶提供一套完整的工具鏈问窃,首先把用戶待保護(hù)的核心代碼編譯成中間的二進(jìn)制文件,隨后生成獨(dú)特的虛機(jī)源碼保護(hù)執(zhí)行環(huán)境和只能在該環(huán)境下執(zhí)行的運(yùn)行程序完沪。

虛機(jī)源碼保護(hù)會(huì)在App內(nèi)部隔離出獨(dú)立的執(zhí)行環(huán)境域庇,該核心代碼的運(yùn)行程序在此獨(dú)立的執(zhí)行環(huán)境里運(yùn)行。即便App本身被破解覆积,這部分核心代碼仍然不可見听皿。

undefined

(虛機(jī)源碼保護(hù)加固流程)

生成的虛機(jī)源碼保護(hù)擁有獨(dú)特的可變指令集,極大的提高了指令跟蹤宽档、逆向分析的難度尉姨。同時(shí),虛機(jī)源碼保護(hù)還提供了反調(diào)試能力和監(jiān)控能力吗冤。虛機(jī)源碼保護(hù)可以通過自身的探針感知到環(huán)境的變化又厉,實(shí)時(shí)探測到外界對本環(huán)境的調(diào)試九府、注入等非正常執(zhí)行流程變化,將調(diào)試動(dòng)作引入程序陷阱覆致,并發(fā)出警報(bào)侄旬,進(jìn)而進(jìn)行實(shí)時(shí)更新,提高安全強(qiáng)度煌妈。

加固技術(shù)發(fā)展及其攻防對抗的更迭儡羔,伴隨著互聯(lián)網(wǎng)技術(shù)發(fā)展不斷升級,我們深信邪不能勝正璧诵,而虛機(jī)源碼保護(hù)加固作為當(dāng)前領(lǐng)先的加固技術(shù)汰蜘,在未來很長一段時(shí)間,能夠?yàn)锳pp提供足夠強(qiáng)度的保護(hù)之宿,為企業(yè)和開發(fā)者的業(yè)務(wù)發(fā)展保駕護(hù)航鉴扫。

原文地址: https://www.dingxiang-inc.com/blog/post/2

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市澈缺,隨后出現(xiàn)的幾起案子坪创,更是在濱河造成了極大的恐慌,老刑警劉巖姐赡,帶你破解...
    沈念sama閱讀 216,470評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莱预,死亡現(xiàn)場離奇詭異,居然都是意外死亡项滑,警方通過查閱死者的電腦和手機(jī)依沮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來枪狂,“玉大人危喉,你說我怎么就攤上這事≈菁玻” “怎么了辜限?”我有些...
    開封第一講書人閱讀 162,577評論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長严蓖。 經(jīng)常有香客問我薄嫡,道長,這世上最難降的妖魔是什么颗胡? 我笑而不...
    開封第一講書人閱讀 58,176評論 1 292
  • 正文 為了忘掉前任毫深,我火速辦了婚禮,結(jié)果婚禮上毒姨,老公的妹妹穿的比我還像新娘哑蔫。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評論 6 388
  • 文/花漫 我一把揭開白布闸迷。 她就那樣靜靜地躺著嵌纲,像睡著了一般。 火紅的嫁衣襯著肌膚如雪稿黍。 梳的紋絲不亂的頭發(fā)上疹瘦,一...
    開封第一講書人閱讀 51,155評論 1 299
  • 那天,我揣著相機(jī)與錄音巡球,去河邊找鬼言沐。 笑死,一個(gè)胖子當(dāng)著我的面吹牛酣栈,可吹牛的內(nèi)容都是我干的险胰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼矿筝,長吁一口氣:“原來是場噩夢啊……” “哼起便!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窖维,我...
    開封第一講書人閱讀 38,903評論 0 274
  • 序言:老撾萬榮一對情侶失蹤榆综,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后铸史,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鼻疮,經(jīng)...
    沈念sama閱讀 45,319評論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評論 2 332
  • 正文 我和宋清朗相戀三年琳轿,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了判沟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡崭篡,死狀恐怖挪哄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情琉闪,我是刑警寧澤迹炼,帶...
    沈念sama閱讀 35,417評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站塘偎,受9級特大地震影響疗涉,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜吟秩,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绽淘。 院中可真熱鬧涵防,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,664評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至椰憋,卻和暖如春厅克,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背橙依。 一陣腳步聲響...
    開封第一講書人閱讀 32,818評論 1 269
  • 我被黑心中介騙來泰國打工证舟, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人窗骑。 一個(gè)月前我還...
    沈念sama閱讀 47,711評論 2 368
  • 正文 我出身青樓女责,卻偏偏與公主長得像,于是被迫代替她去往敵國和親创译。 傳聞我的和親對象是個(gè)殘疾皇子抵知,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評論 2 353