Android逆向与病毒分析
生活随笔
收集整理的這篇文章主要介紹了
Android逆向与病毒分析
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
本文由同程旅游安全團隊對內移動安全培訓的PPT整理而來,面向對象為對移動安全感興趣的研發同事,所以講的有些寬泛。介紹了入門Android逆向需要掌握的一些知識點, 通過簡單的幾個案例講解Android app常用的分析和破解手段, 講解Android上常見的反調試和對抗逆向的手段,并通過修改系統源碼來實現反反調試。 介紹一下常見的病毒特征和預防手段, 最后講解一些關于Android SubStrate Hook相關的內容。文章最后留了一個CrackMe,據說解出之后會有神奇的事情發生。
0x0 什么是逆向
逆向工程(又稱逆向技術),是一種產品設計技術再現過程,即對一項目標產品進行逆向分析及研究,從而演繹并得出該產品的處理流程、組織結構、功能特性及技術規格等設計要素,以制作出功能相近,但又不完全一樣的產品。逆向工程源于商業及軍事領域中的硬件分析。其主要目的是在不能輕易獲得必要的生產信息的情況下,直接從成品分析,推導出產品的設計原理。
0x1 如何學習安卓逆向
0x2 常用的破解手段
0x3 簡單實戰
如圖所示,要執行到彈出Congratulations的話,那if判斷就必須為真,s是設備id加鹽后md5的值,checkcode是用戶輸入的值,這里最簡單的方式就是去掉這個if里的判斷,使其永真,反編譯該段代碼,如下:
?
關鍵點就是if-eqz v5,:cond_0,這里的v5值就是上面s和checkcode對比后的結果,if-eqz v5的含義則為如果v5等于0,則跳轉到cond_0,而cond_0為失敗函數,此處最簡單的修改方式就是直接刪除這一句判斷,讓程序強行走到成功處,這種驗證手段在時下一些app中依然常見。
2.某CrackMe so簡單算法分析
?
?
?
?
該函數有三個參數,在jni中,默認第一個參數為jniEnv指針,第二個參數為jobect對象,第三個才是真正java傳過來的參數,由46行的getStringUtfChars可知a3參數類型為jstring,對應java中的String類型,真正的邏輯從113行開始,v41為v40的指針,即指向的用戶輸入數據的第一個字符,此處判斷當用戶輸入數據是否大于12位,并且判斷每位的值是否等于v22,v21每位數據異或后的值,如果其中一個條件不成立,則都跳轉到失敗處,那知道算法邏輯后,就可以寫出對應的解密算法:
?
那so一般如何分析java層函數調用:
0x4 對抗逆向
TracerPid代表跟蹤該進程的進程pid值,正常情況下,TracerPid默認為0,當調試器附加上該進程后,TracerPid的值就會改變為非0值,反調試即通過該手段檢測當前app是否處于調試狀態,如果是則自動結束該進程。
2.檢測調試端口
?
常用調試器IDA中的android_server默認端口為23946,反調試即可檢測/proc/net/tcp下是否存在該端口,如果存在,依然結束自身。
0x5 反-反調試
針對上面兩個反調試案例,如何躲過TracerPid的檢測,常用的檢測方式為讀取/proc/{pid}/status和/proc/{pid}/task/{pid}/stat的值來判斷是否處于反調試。
?
?
修改Android內核文件,在對應的檢測點處,對TracerPid強制賦值為0,并將當前任務狀態中的T,t(Trace running和Trace stop)都置為s,這樣無論如何檢測TracerPid,都只能獲取到0。
0x6 病毒分析
2. 病毒常見加密手段
?
?
如圖,修改任意xml文件的文件頭,將固定字符03 00改成任意其它字符,都可以使apktool反編譯失敗,但不影響程序正常執行。
3. 常見病毒執行流程
4. 預防
0x7 SubStrate Hook
Android常見的hook手段有.Got表hook和inline hook(概念較為繁瑣,建議百度),Substrate則是inline hook中的一種,那如何簡單的理解inline hook,其實就是直接修改函數的匯編實現,比如在函數前加一條jmp指令來跳轉到自己的函數,執行完目標邏輯后再跳轉回原函數。
官網:?http://www.cydiasubstrate.com
Substrate是一個android上可以hook native代碼的hook框架,可以實現對Android底層代碼的劫持修改。
?
?
如果通過簡單的hook手段,就可以簡單的打印出協議包的內容,當然我們還可以通過添加一定的方法來篡改協議包。
針對第二代加固,網上有非常好的開源工具可供參考:dexhunter
針對第三代加固,常見的思路為可以HookDalvik_dalvik_system_DexFile_defineClassNative函數,原始dex加載時,枚舉所有的DexClassDef,對所有的class,調用dvmDefineClass進行類加載。
Hook示例針對第一代加固:
?
?
如上通過對defineNativeClass進行hook,拿到DvmDex結構體指針后就可以通過pid值拿到該進程的名字,通過DvmDex就可以拿到DexFile指針,最后通過DexFile就可以得到該dex的起始地址和文件大小,直接dump保存即可。
?
原文地址: http://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=16377&highlight=android
0x0 什么是逆向
逆向工程(又稱逆向技術),是一種產品設計技術再現過程,即對一項目標產品進行逆向分析及研究,從而演繹并得出該產品的處理流程、組織結構、功能特性及技術規格等設計要素,以制作出功能相近,但又不完全一樣的產品。逆向工程源于商業及軍事領域中的硬件分析。其主要目的是在不能輕易獲得必要的生產信息的情況下,直接從成品分析,推導出產品的設計原理。
0x1 如何學習安卓逆向
- 學習java基礎,最好有Android開發基礎
- 學習c語言基礎,了解常用的函數
- 學習了解常見的apk內文件格式(dex,xml,so)
- 學習常用Java,Android開發工具的使用(Idea,Android Studio)
- 學習常用Android逆向工具的使用(Android Killer,Jeb,apktool,jadx,Ida)
- 學習了解smali語言,能夠進行一定的編輯和修改
- 學習了解Arm語法
- 學習網絡抓包,了解常用抓包工具的使用,BurpSuite,Charles
- 了解常用的加解密算法和編碼,Aes,Rsa,Des,Tea,Base64,md5
0x2 常用的破解手段
- 通過敏感字段,直接搜索關鍵點進行爆破
- 算法分析,嘗試還原算法
- 網絡驗證,嘗試網絡抓包篡改數據
- 靜態分析
- 動態調試
- Xposed,SubStrate對關鍵點進行hook
0x3 簡單實戰
- 簡單爆破
如圖所示,要執行到彈出Congratulations的話,那if判斷就必須為真,s是設備id加鹽后md5的值,checkcode是用戶輸入的值,這里最簡單的方式就是去掉這個if里的判斷,使其永真,反編譯該段代碼,如下:
?
關鍵點就是if-eqz v5,:cond_0,這里的v5值就是上面s和checkcode對比后的結果,if-eqz v5的含義則為如果v5等于0,則跳轉到cond_0,而cond_0為失敗函數,此處最簡單的修改方式就是直接刪除這一句判斷,讓程序強行走到成功處,這種驗證手段在時下一些app中依然常見。
2.某CrackMe so簡單算法分析
?
?
?
?
該函數有三個參數,在jni中,默認第一個參數為jniEnv指針,第二個參數為jobect對象,第三個才是真正java傳過來的參數,由46行的getStringUtfChars可知a3參數類型為jstring,對應java中的String類型,真正的邏輯從113行開始,v41為v40的指針,即指向的用戶輸入數據的第一個字符,此處判斷當用戶輸入數據是否大于12位,并且判斷每位的值是否等于v22,v21每位數據異或后的值,如果其中一個條件不成立,則都跳轉到失敗處,那知道算法邏輯后,就可以寫出對應的解密算法:
?
那so一般如何分析java層函數調用:
- 通過System.loadLibrary找到該方法對應的so文件,使用ida載入后查找導出函數,native函數注冊的兩種形式:
- 靜態注冊:java_xxx_xxx_xxx_類名_方法名(參數)
- 動態注冊:RegisterNatives
- 正常情況下,一般開發者認為so已經足夠安全,從而不會考慮so文件的防護。
0x4 對抗逆向
- 利用第三方加固
- 代碼,字符串加密
- ollvm指令混淆
- 簽名驗證
- Dex文件驗證
- 反調試(AntiDebug)
- 檢測TracerPid
TracerPid代表跟蹤該進程的進程pid值,正常情況下,TracerPid默認為0,當調試器附加上該進程后,TracerPid的值就會改變為非0值,反調試即通過該手段檢測當前app是否處于調試狀態,如果是則自動結束該進程。
2.檢測調試端口
?
常用調試器IDA中的android_server默認端口為23946,反調試即可檢測/proc/net/tcp下是否存在該端口,如果存在,依然結束自身。
0x5 反-反調試
針對上面兩個反調試案例,如何躲過TracerPid的檢測,常用的檢測方式為讀取/proc/{pid}/status和/proc/{pid}/task/{pid}/stat的值來判斷是否處于反調試。
- 定制系統
?
?
修改Android內核文件,在對應的檢測點處,對TracerPid強制賦值為0,并將當前任務狀態中的T,t(Trace running和Trace stop)都置為s,這樣無論如何檢測TracerPid,都只能獲取到0。
0x6 病毒分析
- 常見病毒類型:
- 鎖機軟件
- 隱私竊取
- 廣告病毒
- 扣費病毒
2. 病毒常見加密手段
- 利用第三方廠商加固
- 利用Android系統對apk中文件的執行流程對其中部分文件進行修改以達到對抗反編譯的效果
- 代碼,字符串混淆
- 子母包分離,將病毒本體放在云端,本地只做加載
?
?
如圖,修改任意xml文件的文件頭,將固定字符03 00改成任意其它字符,都可以使apktool反編譯失敗,但不影響程序正常執行。
3. 常見病毒執行流程
- 鎖機病毒:誘導用戶進行安裝,打開時提示用戶申請設備管理器和root權限,成功獲取到權限后即將病毒本體釋放到system/app下,重啟設備后通過app構造的一個錯誤的全屏頁面覆蓋整個屏幕,從而實現類似于鎖機的目的。
?
- 隱私竊取病毒:針對4.4及以上,病毒在啟動時會誘導用戶設置該app會默認短信應用,4.4以下無需設置,一旦成功獲取到權限,app會在后臺開啟一個service用來監聽短信,聯系人以及其它信息的變化,并通過多個service,broadcast對該service進行守護,app定期會將這些信息發送到病毒作者手機號或者郵箱里,通過短信將該病毒app群發給聯系人,使其他人中招。
- 手段升級:為防止一些郵箱和手機號或者對抗病毒分析人員,病毒可能會將此類敏感指令隱藏,通過服務器或者手機號進行下發,app監聽到有新的指令時,則執行對應的操作。
4. 預防
- 使用最新的Android系統,新版本Android系統在權限機制上約束了部分敏感權限。
- 在正規市場和官網上下載App。
- 如無特殊需要請不要root
- 不點擊任何短信中的網址。
- 刷機!
0x7 SubStrate Hook
Android常見的hook手段有.Got表hook和inline hook(概念較為繁瑣,建議百度),Substrate則是inline hook中的一種,那如何簡單的理解inline hook,其實就是直接修改函數的匯編實現,比如在函數前加一條jmp指令來跳轉到自己的函數,執行完目標邏輯后再跳轉回原函數。
官網:?http://www.cydiasubstrate.com
Substrate是一個android上可以hook native代碼的hook框架,可以實現對Android底層代碼的劫持修改。
- 獲取明文https數據
- 在android上使用https協議時,會使用system/lib下的libssl.so配合開發者提供的證書對數據包進行加密,常規的在捕獲https數據時,只需要利用抓包工具(burpsuite,charles)導入偽證書就可以成功獲取明文的數據包,當app有嚴格的證書校驗時,此類方法將不可再使用。
?
?
如果通過簡單的hook手段,就可以簡單的打印出協議包的內容,當然我們還可以通過添加一定的方法來篡改協議包。
- 簡單脫殼
針對第二代加固,網上有非常好的開源工具可供參考:dexhunter
針對第三代加固,常見的思路為可以HookDalvik_dalvik_system_DexFile_defineClassNative函數,原始dex加載時,枚舉所有的DexClassDef,對所有的class,調用dvmDefineClass進行類加載。
Hook示例針對第一代加固:
- 在第一代和第二代以及當前部分加固中依然使用了整體加固,在閱讀Android系統源碼時發現DEX在執行時會調用defineClassNative去執行類方法,而傳進來的參數中就包含了DvmDex指針,通過該指針即可拿到一個DexFile實例。
?
?
如上通過對defineNativeClass進行hook,拿到DvmDex結構體指針后就可以通過pid值拿到該進程的名字,通過DvmDex就可以拿到DexFile指針,最后通過DexFile就可以得到該dex的起始地址和文件大小,直接dump保存即可。
?
原文地址: http://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=16377&highlight=android
總結
以上是生活随笔為你收集整理的Android逆向与病毒分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Binder fuzz安全研究
- 下一篇: AndroidLinker与SO加壳技术