編輯:關於Android編程
總結下近一年的學習經歷,以中國的新年為節點。時間從2015年年後到今天,2015年年末。
首先我必須要感謝前輩的書籍和高質量的博客。
1、重新學習了一遍《Linux內核源代碼情景分析上下冊》,毛德操著,並記錄學習歷程,寫下了博客。
2、重新學習了一遍《Android系統源代碼情景分析》,羅升陽著,並記錄從開機啟動到Home界面的展示整個流程。
3、學習了一個小型java虛擬機的源代碼,並調試修改源代碼中的錯誤,最後可以運行了。參考鏈接https://github.com/cloudsec/ajvm。
4、學習了Dalvik虛擬機的工作原理,參考的博客是老羅寫的,列出來:
1)Dalvik虛擬機簡要介紹和學習計劃。
2)Dalvik虛擬機的啟動過程分析。
3)Dalvik虛擬機的運行過程分析。
4)Dalvik虛擬機JNI方法的注冊過程分析。
5)Dalvik虛擬機進程和線程的創建過程分析。
6)Dalvik虛擬機垃圾收集機制簡要介紹和學習計劃。
7)Dalvik虛擬機Java堆創建過程分析。
8)Dalvik虛擬機為新創建對象分配內存的過程分析。
還有就是鄧老師最近寫的深入理解Dalvik虛擬機,在看鄧老師的文章前,最好先看老羅的文章,老羅的文章具有系統性,鄧老師的文章是看完虛擬機的總結,直接看鄧老師的不容易看懂。
為了看懂Dalvik虛擬機,最好理解java虛擬機,不過市面上講java虛擬機的幾乎都不涉及源碼,沒有什麼用,所以推薦大家去看看上面github實現的小型jvm,對應解釋代碼的博客請參考http://club.alibabatech.org/article_detail.htm?articleId=6。
我的學習思路就是多看源碼,少看理論,這可能是低手學習的比較好的途徑,高手一般願意看理論,看理論的時候代碼就已經在心裡生成了。
5、學習Android安全,並已經寫下了幾篇文章,涉及到Android安全機制,反編譯等。
6、下面要說重點了,從十一後就沒有更新博客,這段時間我一直在研究Android安全,我打算接下來的三個禮拜把近期研究的成果分享出來。現在簡單的梳理一下,方便後續寫博客。
以下每個標題都會獨立寫成博客。所有博客都會給出源代碼。
Android逆向分析
0x00
研究了Android加固的原理,網上大多只給多了源碼,參考Android中的Apk的加固(加殼)原理解析和實現,但沒有說明為什麼,我從系統的源碼的角度來分析目前常用加殼脫殼的原理,使用Android2.3源碼。
0x01
我們在分析阿裡殼子的時候,發現脫殼根本不涉及java層的代碼,可見核心脫殼的程序寫在了native層。這篇博客中我會把所有的脫殼程序通過JNI移到native層,並在Android2.3的模擬機上運行成功,並會公開源代碼。
0x02
講解DexClassLoader、PathClassLoader原理,adb install和開機自動時加載dex,都是通過PathClassLoader。而動態加殼脫殼則使用的是DexClassLoader。
講解上面的整個流程,包括優化dex。簡單的脫殼都是在dvmDexFileOpenPartial下斷點,結合下面一篇文章你就能明白為什麼要在這個函數下斷點。
0x03
講解dex文件優化,dex文件解析為DexFile,運行時加載數據為ClassObject到最後運行的流程。基於Android2.3源碼進行講解。
0x04
講解Davlik虛擬機運行時篡改字節碼,參考apk自我保護的一種實現方式——運行時自篡改dalvik指令。
0x05
阿裡的殼子會用一種技巧導致反編譯dex,看到的方法都被替換為throw exception(),這是怎麼做到的,運行時又是怎麼樣動態修復的呢?在這篇文章中,我會拋磚引玉,把其中一個方法修改為throw exception(),並且在運行時動態修復。當然所有的代碼都會放在github上。
0x06講解一個開源的脫殼機,DexHunter,參考從Android運行時出發,打造我們的脫殼神器。進一步理解Dalvik虛擬機執行流程。其實就是一張圖:
0x07
使用ida靜態和動態調試so,網上有很多這樣的文章,為了在init_array下斷點,每個人都不一樣,其中最有效率的一個是安卓動態調試七種武器之孔雀翎-ida-pro,除了分析動態調試so,還要分析so調用函數的堆棧,方便看懂so的arm匯編語言。
0x08
講解常用的native反調試的方法,並且講解如何通過修改so來過掉這些反調試。
0x09
使用ida動態調試dex的smali源碼,有兩種方式,一種是反編譯apk + eclipse中調試smali,一種是直接使用ida調用dex。
0x0a
講解常用的防反編譯的方式,比如通過驗證簽名,驗證是否運行在虛擬機中等方式。這部分代碼可能在java層,也可能在native層。
0x0b
講解通過smali注入log或者注入方法的調用棧,來動態分析程序的運行。
0x0c
講解so加殼,一是對section加殼,一個是對函數加殼。參考Android逆向之旅---基於對so中的section加密技術實現so加固,Android逆向之旅---基於對so中的函數加密技術實現so加固。
0x0d
講解so注入和c/c++利用GOT表進行hook。參考Android中的so注入(inject)和掛鉤(hook) - For both x86 and arm。
0x0e
講解dex注入,參考dex注入實現詳解。
0x0f
講解java攔截技術,最簡單的攔截就是替換,在加殼脫殼程序中我們已經看到了。還有一種方式是通過Dalvik虛擬機的方式,如果我們能把一個Java函數修改為Native函數,並且將nativeFunc指針設置為自定義的函數,那麼就可以實現攔截了,參考注入安卓進程,並hook java世界的方法。
0x10
講解從system.loadlibrary到執行init_array的流程。
Android APP漏洞挖掘
組件公開安全漏洞
Content Provider文件目錄遍歷漏洞
AndroidManifest.xml配置安全檢測
Intent劫持風險安全檢測
數據存儲安全檢測
WebView高危接口安全檢測:webview高危接口漏洞,有漏洞利用代碼和詳細的講解。
拒絕服務攻擊安全檢測
WebView明文存儲密碼漏洞
隨機數生成函數使用錯誤
WebView不檢驗證書漏洞
中間人攻擊漏洞: 有漏洞代碼和詳細的講解。
從sdcard加載dex漏洞
Activity被劫持風險
file跨域訪問:webview跨域訪問訪問文件,有漏洞利用代碼和詳細的講解。
端口開發:主要分析Baidu地圖和高德地圖,並有漏洞利用代碼,展示實際的效果。並且通過反編譯smali分析了為什麼漏洞利用代碼要這麼寫。
明文存儲,明文傳輸
Android系統漏洞
0x00
講解了Linux下ROP,參考一步一步學ROP之linux_x86篇。
0x01
講解了android下ROP,DEP,ASLR,Information Leak,參考一步一步學rop之android-arm-32位篇。
0x02
講解了cve-2014-7911,講解了Dalvik-Heap Spray,C++反編譯後代碼的利用,參考Cve-2014-7911安卓提權漏洞分析,再論CVE-2014-7911安卓序列化漏洞。
0x03
講解部分Android Libcutils庫中整數溢出導致的堆破壞漏洞的發現與利用,漏洞利用代碼比較復雜,只講解其中一部分。
實際的博客可能還有出入,我也在學習中,歡迎交流,每條回復我都會認真回。
我們先來看一張圖,它清晰的說明了整個Android系統的啟動流程,參考Android內核開發:圖解Android系統的啟動過程。第一階段:Android設備上電後,首先會
引言盡管Android Studio已經越來越流行了,但很多人還是習慣於Eclipse或源碼環境下開發JNI應用。筆者是從以前在學校參加谷歌大學學術合作項目的時候接觸JN
通過widget定義,我們在widget列表中看到了我們的TestWidget,當我們拖拽widget到主頁時,如果在appwidet-provider中定義了andr
簡單的說下反編譯apk的流程:我們一般想要反編譯一個apk,無非就是想獲得三樣東西圖片資源 ,XML資源,和代碼資源一.圖片資源獲取、這個最簡單啦, &nbs