熟知應用層開發的我們都知道,在應用上架的時候都需要程序經過編譯、簽名 、生成一個後綴爲apk的文件才能發佈到應用市場。
一、Android 逆向學習背景
瞭解Java Android開發。
瞭解NDK ,C 語言 Android 動態鏈接庫.SO開發。
瞭解Android反編譯Smali 語法。
瞭解adb 和 jdb 等等工具使用。、
瞭解IDA 調試(遠程動態調試APK和本地靜態調試.SO文件)
瞭解文件格式類似PE格式,例如:ELF,和Android文件格式等等。
瞭解APK的打包解包流程。
瞭解熟練使用Fiddler和Charles抓包工具進行抓包;
瞭解其他工具使用(改之理,Apk killer,Android模擬器)等。
二、Android 逆向工具
1. ApkTool
Android逆向分析領域歷史最久遠的工具之一,提供了Android Apk反編譯和回編譯的功能。雖然越來越多的工具提供了GUI進行反編譯,但是以命令行的方式操作的ApkTool使用起來更加簡單、便捷,仍然是很多人分析的最佳選擇。
目前ApkTool的版本2.4.1版本(推薦使用最新的版本使用,避免舊版本中的一些問題),下載地址爲:https://ibotpeaches.github.io/Apktool/。
ApkTool使用方式:
- 反編譯Apk: apktool d <file.apk>
- 編譯文件爲Apk:apktool b
2. GDA
GDA是一款完全基於C++開發的新型反編譯工具,因此該工具並不僅依賴於Java平臺。該工具使用起來非常方便,而且運行速度非常快,支持APK、DEX、OBED和oat等文件格式。
3. Dex2jar/JD-GUI
使用最多的將DEX文件轉換爲jar包的工具。對使用Dex2jar轉換的包,可以通過JD-GUI等工具查看反編譯後的Java代碼。
三、Android 逆向學習整理
Android 逆向分析(一):使用改之理實現逆向HelloWorld
...
四、Android 加殼方式
使用軟件殼爲目標APK加殼,一般使用的方式爲:Dex混淆、Dex加密與Application替換、so加密等。
1. Dex混淆
Dex混淆常見於Dex混淆器,例如DexGuard與DexProtect。識別這類加殼程序的方法是對比和分析它們所生成的Dex文件與常規Dex文件。爲了達到字符串加密與方法流程混淆的效果,混淆器通常會使用Java的反射機制來實現加密,並向代碼中插入getClass().getDeclaredMethod().invoke()之類的方法調用。配合它們獨有的Dex字節碼特徵,相對容易識別。
2. Dex加密與Application替換
軟件殼在處理Apk的時候,會用StubApplication類替換程序的Application類,達到接管Apk啓動控制權的目的。不同的廠商的加殼程序向Apk添加的StubApplication類在名稱與包名上有所不同,這是識別各個廠商軟件殼最簡單、有效的方法。
3.So加密
so加密一般會對Apk處理後,在assets目錄下添加相應的文件。
4. 如何識別軟件殼
可以使用APKID進行APK文件特徵的識別,APKID是一款開源工具(https://github.com/rednaga/APKiD)。它使用Python腳本配合yara規則,實現了APK編譯器識別規則與常見的軟件殼特徵識別規則,支持快速識別APK的軟件殼信息,準確率高且易擴展。
五、Android 軟件殼的發展
1. 動態加載型殼(第一代殼)
動態加載殼屬於第一代殼,它的發展時期是從4.4向5.0邁進的時期,這個時期也是從Dalviik虛擬機向ART虛擬機轉型的時期。這個時期的軟件殼,早期版本主要針對Dalvik虛擬機的實現,其特點是:對本地APK中的數據進行加密,在運行時在內存中解密。
因爲“加載即解密”的特點,使得脫殼有很多種方式,常見的脫殼方法如下:
緩存脫殼法:因爲動態加載型殼使用DexClassLoader將加密後的Dex文件在內存中解密後進行動態加載,但部分軟件殼並沒有對加載的Dex緩存路徑進行處理,導致優化的結果默認放置到了/data/dalvik-cache目錄。只需要將/data/dalvik-cache下的OBEX文件去喫,在進行一次deodex操作,即可完成脫殼工作。
內存Dump脫殼法:基於這代殼在內存中完全解密的特點,可以從內存中Dump需要解密的APK的內存,從而完成脫殼操作。
動態調試脫殼法:本質還是基於內存Dump脫殼法,需要通過調試器找到合適的Dump時機,即DEX文件已經在內存中完全解密,且代碼還沒有開始執行。尋找合適的Dump時機是動態調試脫殼法的重點。
Hook脫殼法:與動態調試脫殼法一樣,都需要分析人員找到合適的脫殼實際。不同點在於:動態調試脫殼法需手動操作調試器來完成脫殼,Hook脫殼法需要使用Hook框架,配合Hook代碼,實現工具的自動化脫殼。
系統定製脫殼法:與Hook脫殼法類似,系統定製脫殼法針對第一代殼在dvmDexFileOpenPartial()或dexFileParse()方法處設置斷點來脫殼的特點,修改它們的源碼中的實現,然後編譯修改後的代碼,以刷機的方式實現脫殼。刷機後,APK加載時會自動將Dex保存到我們修改後的指定的目錄下,這樣我們就能輕易找到脫殼後的DEX文件。
2. 代碼抽取型殼(第二代殼)
代碼抽取型殼屬於第二代殼,特點是即使DEX加載到內存中,也處於加密的狀態,所有的DEX方法都是在運行時解密的。針對這代的代碼抽取型殼,脫殼的方法就沒有第一代的脫殼方法多了,且難度變大了不少。
針對代碼抽取型的脫殼方式有以下幾種:
內存重組脫殼法:通過解析內存中的DEX文件格式,將其重新組合成DEX文件,可以實現百分百的DEX代碼還原。
Hook脫殼法:也是基於DEX在內存中完全解密進行的。
系統定製脫殼法:對Dalvik的方法實現代碼進行修改通過調用dvmDefineClass()方法手動加載所有的類。
3. 代碼混淆殼(第三代殼)
這裏先說明一下軟件的混淆技術。軟件的混淆分爲代碼混淆和數據混淆,而從軟件的編譯與鏈接的生成過程來看,軟件混淆是可以分爲事前的代碼混淆,事中的編譯期混淆、事後的二進制混淆。
代碼混淆指的就是源碼混淆,好處是經過這種混淆處理後的代碼,分析起來是有一定難度的。不過,從軟件混淆技術的層面看,儘管能有效防止反編譯後的逆向分析,但是對自身的調試和維護也來了麻煩,當代碼出現Bug的時候,定位問題也變得更難。
代碼混淆分爲Java級別的代碼混淆(第一代殼)和原生程序的代碼混淆(第三代殼)。這裏的代碼混淆殼指的是: 原生程序的代碼混淆。目前代碼混淆殼是當前級別最高的軟件加密技術,這裏推薦LLVM編譯套件,這是一個很優秀的開源跨平臺的編譯套件(感興趣的可以瞭解AST混淆技術)。
代碼混淆殼在編譯時改寫了代碼了代碼生成的指令,因此在分析與破解這類二進制程序時,談不上脫殼,更像是對原始指令的還原,或者說是對代碼混淆的還原。
六、Android 逆向安全拓展內容
1. Android APP安全在線檢測平臺
騰訊金剛審計系統 http://service.security.tencent.com/kingkong 免費 無限制
騰訊御安全 http://yaq.qq.com/ 免費 查看漏洞詳情需認證
阿里聚安全 http://jaq.alibaba.com/ 免費 查看漏洞詳情需認證
360顯微鏡 http://appscan.360.cn/ 免費 無限制
360APP漏洞掃描 http://dev.360.cn/html/vulscan/scanning.html 免費 無限制
百度MTC http://mtc.baidu.com 9.9元/次 無限制
梆梆 https://dev.bangcle.com 免費 無限制
愛內測 http://www.ineice.com/ 免費 無限制
通付盾 http://www.appfortify.cn/ 免費 無限制
NAGA http://www.nagain.com/appscan/ 免費 無限制
GES審計系統 http://01hackcode.com/ 免費 無限制
盤古出品的Janeushttp://appscan.io
Janus http://cloud.appscan.io
APP逆向main_classify_list https://android.fallible.co/
java在線反編譯Java decompiler online http://www.javadecompilers.com
騰訊電腦管家:哈勃 http://habo.qq.com/
騰訊TSRC:金剛 http://service.security.tencent.com/
阿里聚安全:http://jaq.alibaba.com/
西安交通大學 sanddroid:http://sanddroid.xjtu.edu.cn/#home
金山火眼:http://fireeye.ijinshan.com/analyse.html
瀚海源文件B超:https://b-chao.com
2. 推薦博客內容
安卓滲透測試工具——Drozer(安裝和使用):https://www.cnblogs.com/zhaoyixiang/p/11236458.html
Android安全測試框架Drozer(安裝篇):https://www.jianshu.com/p/4ef5b26dd3fb
Android安全測試框架Drozer(使用篇):https://www.jianshu.com/p/8f9d7dc5a8bb
QARK工具的介紹和原理分析:https://zhuanlan.zhihu.com/p/35411248
GDA:一款基於C++的新型Android逆向分析工具:https://www.freebuf.com/sectool/226185.html
ApkTool: Apktool 使用教程:https://www.jianshu.com/p/6ba8b826c138
Android中的Apk的加固(加殼)原理解析和實現:https://blog.csdn.net/sally_liang/article/details/52946790
Android安全知識筆記合集:https://juejin.im/post/5deb7478518825126204f4d7
Android安全客戶端安全要點:https://zhuanlan.zhihu.com/p/35100057
Android應用防止so注入防止動態調試參考代碼:http://www.iiii.name/androidsobug.html
安卓Activity劫持與反劫持:https://www.freebuf.com/company-information/222548.html
Android 安全之 Activity 劫持防護:https://www.jianshu.com/p/d4677e837648