Android 逆向分析從入門到精通

熟知應用層開發的我們都知道,在應用上架的時候都需要程序經過編譯、簽名 、生成一個後綴爲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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章