应用程序文件Android安全分析挑战:运行时篡改Dalvik字节码
發(fā)一下牢騷和主題無(wú)關(guān):
????本文章由Jack_Jia編寫,轉(zhuǎn)載請(qǐng)注明出處。??
????文章接鏈:http://blog.csdn.net/jiazhijun/article/details/8833710
????作者:Jack_Jia ???郵箱:?309zhijun@163.com
????
? ? ?動(dòng)移互聯(lián)網(wǎng)已是一種勢(shì)趨,僅2012年就有45億應(yīng)用程序載下量。伴隨著動(dòng)移互聯(lián)網(wǎng)的火爆,浩繁攻擊者也被吸引到這個(gè)臺(tái)平,動(dòng)移臺(tái)平意惡軟件呈現(xiàn)爆炸式長(zhǎng)增態(tài)勢(shì)。與PC臺(tái)平不同的是,PC臺(tái)平有量大的反病毒包和意惡軟件析分工具,而新興的動(dòng)移互聯(lián)網(wǎng)卻乏缺大強(qiáng)的析分工具和技巧。這些工具和技巧將是堅(jiān)持動(dòng)移互聯(lián)網(wǎng)闊別意惡軟件和意惡應(yīng)用程序的鍵關(guān)。它們一般來(lái)自于學(xué)術(shù)界和全安界的研討員人,但是它們都有必定的陷缺,不并合適有所的情況,入加全安社區(qū)可以幫助我們習(xí)學(xué)和開展android應(yīng)用的析分方法。
????
????一、分析
? ? ? 首先分析一下動(dòng)移應(yīng)用程序的析分方法和景背。我們可以采取很多工具來(lái)對(duì)應(yīng)用程序行進(jìn)析分,Android應(yīng)用程序的析分一般都是基于APK文件,APK文件代表了一個(gè)應(yīng)用程序。
? ? ?它存儲(chǔ)了以下內(nèi)容:
????
? ? ? ? ? ?1、程序邏輯:dex字節(jié)碼和so地本庫(kù)。
? ? ? ? ? ?2、元據(jù)數(shù)信息:AndroidManifest.xml文件。
? ? ? ? ? ?3、源資文件:圖像或其他類型據(jù)數(shù)。
????
? ? ?析分工具一般采取以下兩種應(yīng)用析分方法:
????
? ? ? ? ? 1、靜態(tài)析分:該方法搜集有關(guān)應(yīng)用程序的信息,但程序代碼不行執(zhí)。
? ? ? ? ? 2、態(tài)動(dòng)析分:該方法行執(zhí)應(yīng)用程序,同時(shí)搜集應(yīng)用運(yùn)行為行。
????
? ? ?這兩種析分技巧都各有利弊,在Android逆向析分范疇,很多工具都是基于靜態(tài)析分技巧,也有于用態(tài)動(dòng)析分的沙箱系統(tǒng),但受限于態(tài)動(dòng)析分系統(tǒng)的交互靈活性,析分師常常在那些分部要需態(tài)動(dòng)析分上沒(méi)有充足的控制力。在逆向工程中程過(guò),析分員人一旦肯定了感興趣的應(yīng)用程序分部,它們更側(cè)重于用使靜態(tài)析分工具。問(wèn)題是如何找到那些分部呢?靜態(tài)析分技巧的另一個(gè)要重陷缺是不知道什么被真正行執(zhí)和程序上下文在某特定點(diǎn)的行執(zhí)否是有效。當(dāng)我們假設(shè)應(yīng)用程序代碼在運(yùn)行中程過(guò)不會(huì)轉(zhuǎn)變時(shí),析分任務(wù)將是非常易容的,我們可以通過(guò)析分apk文件來(lái)識(shí)別程序代碼邏輯,混雜的應(yīng)用程序會(huì)給析分員人帶來(lái)必定的戰(zhàn)挑。隨著運(yùn)行時(shí)改動(dòng)Dalvik字節(jié)碼的解講,我們將暴露這些基于代碼流析分的工具的制限和問(wèn)題。
????
? ? ?我們將在接下來(lái)的分部描述一下應(yīng)用程序的基本組成分部,并指出要重的運(yùn)行時(shí)組件。這將使我們更易容白明當(dāng)運(yùn)行crackme時(shí)發(fā)生了什么事情。后之,我們將報(bào)告于用欺騙靜態(tài)析分工具所采取的要重技巧。最后我們會(huì)進(jìn)入crackme戰(zhàn)挑的細(xì)節(jié)。
????
????二、應(yīng)用程序行執(zhí)的上下文
????
每日一道理記不清有多少個(gè)夜晚,在我翻閱紙張的指間滑落;記不清有多少支蠟燭,在我的凝視中化為灰燼。逝者如斯,我時(shí)時(shí)刻刻會(huì)聽見自己對(duì)生命承諾的余音,感到歲月的流轉(zhuǎn)在漸漸稀釋我的年少無(wú)知,我愿自己是一只上足了發(fā)條的時(shí)鐘,在晝夜不停的流轉(zhuǎn)中留下自己充實(shí)的每一刻。
? ? ? 應(yīng)用程序的生命周期開始于zygote程進(jìn)的fork方法,因?yàn)樗严阮A(yù)加載了Android框架,所以應(yīng)用程序不必再花時(shí)間加載這些基礎(chǔ)類,同時(shí)這也可以有效低降體整的內(nèi)存開銷。在新的程進(jìn)低降限權(quán)后之,它加載了apk文件中的classes.dex文件,該文件包含了可被Dalvik虛擬機(jī)(DVM)釋解行執(zhí)的Dalvik字節(jié)碼,代表了應(yīng)用程序邏輯。此外,應(yīng)用程序還帶有可以在運(yùn)行時(shí)態(tài)動(dòng)加載的Native庫(kù)。因?yàn)镈alvik虛擬機(jī)和Native庫(kù)運(yùn)行在統(tǒng)一程進(jìn)中,因此它們擁有同相的限權(quán)。一個(gè)型典的(收縮的)應(yīng)用程序的內(nèi)存布局如圖1所示。
????
????
????
圖1型典的APP內(nèi)存布局? ? ? ?我們可以看到,Android框架和同享庫(kù)及dex文件一樣被映射到我們的程進(jìn)。我們的dex文件字節(jié)碼被映射為只讀。
????
????三、改動(dòng)技巧
????
? ? ? ?回到靜態(tài)析分工具的話題,如果Dalvik字節(jié)碼在運(yùn)行時(shí)不能轉(zhuǎn)變的話,靜態(tài)析分工具將能很好的任務(wù)。因?yàn)槲覀兛梢灾苯訌腁PK文件中提取的出和運(yùn)行時(shí)相匹配的字節(jié)碼。你可能會(huì)說(shuō)這類假設(shè)是建立的,因?yàn)閐ex文件映射為只讀,所以Dalvik指令集是不夠能修改的字節(jié)碼本身的。無(wú)限的Dalvik指令集使我們不夠能改動(dòng)程序字節(jié)碼,但我們可以用利捆綁在APK文件中的地本庫(kù)。地本代碼和DVM運(yùn)行在同相的較低水平,如圖2:
????
????
????圖2 地本代碼和DVM在統(tǒng)一級(jí)別的操縱
????
? ? ??地本代碼是夠能意任操縱自己程進(jìn)上下文內(nèi)存的,因此我們可以通過(guò)地本代碼覆蓋已加載Dalvik字節(jié)碼。但是classes.dex被映射為只讀。這意味著,如果我們修改該段內(nèi)存,內(nèi)核將會(huì)殺掉我們的程進(jìn),因此在際實(shí)改動(dòng)我們的應(yīng)用程序的字節(jié)碼之前,我們必須從新映射該段內(nèi)存為可寫。后之,我們就夠能寫我們的新字節(jié)碼到我們的應(yīng)用程序。如果程序調(diào)用我們改動(dòng)過(guò)的方法,那么將行執(zhí)新的字節(jié)碼。沒(méi)有進(jìn)一步修改應(yīng)用程序或DVM的要必。通過(guò)這類方法,我們現(xiàn)發(fā)“字節(jié)碼在運(yùn)行時(shí)不能修改”的假設(shè)也不是絕對(duì)的。只存眷classes.dex文件的靜態(tài)析分工具沒(méi)有考慮到這類情況,這樣的工具就必須改良以應(yīng)答這類情況。可以用使靜態(tài)和態(tài)動(dòng)析分的合組來(lái)服克這類制限,但這樣的雜復(fù)的析分系統(tǒng)是不常見的。
????
????三、示例-Crackme
????
? ? ?為了明說(shuō)我們后面所論討的一些問(wèn)題,我們決議建創(chuàng)一個(gè)案例研討“challenge”的應(yīng)用程序“crackme”,它用使意惡軟件用使的混雜技巧行進(jìn)了處置。您可以用使任何析分技巧和工具,并弄清楚它是如何任務(wù)的。找到確準(zhǔn)的碼密,輸入到上面的文本框中。點(diǎn)擊按鈕,看查否是得到了確準(zhǔn)的案答。這將示顯按鈕上面的文字。
????
? ? ?您可以在這里載下crackme的apk文件的副本:https://github.com/blueboxsecurity/DalvikBytecodeTampering/raw/master/delta.apk
????
? ? ?止停瀏覽,如果你算打接受戰(zhàn)挑。上面是戰(zhàn)挑的案答 -----
? ? ?首先我們開始析分Action類,這是我們的應(yīng)用程序的Activity的進(jìn)口,按鈕會(huì)發(fā)觸verify()方法。在這里,我們第一次取獲TextField中的輸入的文本,并把它轉(zhuǎn)換成一個(gè)String。這個(gè)String對(duì)象不并是java.lang.String類的一個(gè)實(shí)例而是我們自己的現(xiàn)實(shí)。在構(gòu)造函數(shù)中,我們用使第二種方法轉(zhuǎn)變字符串。結(jié)果將被儲(chǔ)存在私有的域區(qū),和Action類的硬編碼在一塊。如果碼密同相,將被于用示顯在屏幕上的消息的密加。
? ? ?但是String類內(nèi)所用使的轉(zhuǎn)變文本方法的方法,或者更確準(zhǔn)地說(shuō),這類方法的字節(jié)碼,將遠(yuǎn)永不會(huì)被行執(zhí)。當(dāng)應(yīng)用程序啟動(dòng)后,在Action的靜態(tài)類的構(gòu)造函數(shù)中,這個(gè)方法的字節(jié)碼已被替換掉了。在這里,我們加載地本庫(kù)'libnet.so'和行執(zhí)READMEM()函數(shù)。在這個(gè)庫(kù)中,我們?nèi)~@一個(gè)指針從堆棧到我們的映射的dex文件,并實(shí)驗(yàn)找到文件的頭開。這可以很易容地通過(guò)正向搜索內(nèi)存頁(yè),直到我們現(xiàn)發(fā)dex文件的magic byte。在現(xiàn)我們可以從dex文件的頭開析解頭文件。當(dāng)我們析解dex文件時(shí),我們可以找到的我們要改動(dòng)方法的址地。但正如后面提到的,我們首先要從新映射內(nèi)存為可寫。這可以用使mprotect()函數(shù)現(xiàn)實(shí)。后之,我們就夠能覆蓋本來(lái)的字節(jié)碼,并通過(guò)從本機(jī)代碼到類的初始化的返返來(lái)成完。類初始化已結(jié)束,Activity在Android設(shè)備上彈出。在現(xiàn),當(dāng)我們按下按鈕時(shí),我們行執(zhí)的是新的字節(jié)碼,而不是本來(lái)dex的字節(jié)碼。
????
????英文源址:http://blog.bluebox.com/2013/03/25/android-security-analysis-challenge-tampering-dalvik-bytecode-during-runtime/
文章結(jié)束給大家分享下程序員的一些笑話語(yǔ)錄: 面試官:熟悉哪種語(yǔ)言
應(yīng)聘者:JAVA
面試官:知道什么叫類么
應(yīng)聘者:我這人實(shí)在,工作努力,不知道什么叫累
面試官:知道什么是包?
應(yīng)聘者:我這人實(shí)在 平常不帶包 也不用公司準(zhǔn)備了
面試官:知道什么是接口嗎?
應(yīng)聘者:我這個(gè)人工作認(rèn)真。從來(lái)不找借口偷懶
面試官:知道什么是繼承么
應(yīng)聘者:我是孤兒沒(méi)什么可以繼承的
面試官:知道什么叫對(duì)象么?
應(yīng)聘者:知道,不過(guò)我工作努力,上進(jìn)心強(qiáng),暫時(shí)還沒(méi)有打算找對(duì)象。
面試官:知道多態(tài)么?
應(yīng)聘者:知道,我很保守的。我認(rèn)為讓心愛的女人為了自已一時(shí)的快樂(lè)去墮胎是不道德的行為!請(qǐng)問(wèn)這和C#有什么關(guān)系??
轉(zhuǎn)載于:https://www.cnblogs.com/xinyuyuanm/archive/2013/04/24/3041164.html
總結(jié)
以上是生活随笔為你收集整理的应用程序文件Android安全分析挑战:运行时篡改Dalvik字节码的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 如何解决IIS7上传文件大小限制【转】
- 下一篇: 获取网络信息单元