本文節主要介紹一下Android逆向常用的環境、工具、動靜態分析思路,筆者通過學習肉絲大佬分享的一些內容,加上自己一些經驗總結而來。
1、環境準備環境也分三六九等,一個好的環境能讓你節省大量時間和精力去投入到更有意義的事情中,所以Android移動安全第一步,就是配置一套無坑的環境,首先是硬體配置如下:
1.1、VMware虛擬機
1、下載並安裝虛擬機後,註冊碼百度搜索註冊即可。
VMware workstation下載(Windows)
VMware Fusion下載(Mac)
2、下載並運行kali虛擬機
kali-linux-2019-4-vmware-amd64-zip.torrent
3、Kali更改時區:
dpkg-reconfigure tzdata然後選擇`Asia→Shanghai`,然後重啟即可。4、更新源apt update
5、安裝中文字體
apt install xfonts-intl-chinese
apt install ttf-wqy-microhei1.2、Android studio
1、訪問官網並下載最新版android studio
wget https://redirector.gvt1.com/edgedl/android/studio/ide-zips/4.0.1.0/android-studio-ide-193.6626763-linux.tar.gz2、新建第一個Android項目
3、耐心等待android-studio加載完成即可
如果下載速度過慢,可配置代理重新加載。1.3、Genymotion模擬器
1、genymotion下載
2、選擇Android8.0版本,並選擇主網卡設置為橋接模式
3、運行模擬器,並消除wifi感嘆號以及時間同步
在模擬器的shell裡以root用戶執行:settings put global captive_portal_http_url https://www.google.cn/generate_204settings put global captive_portal_https_url https://www.google.cn/generate_204settings put global ntp_server 1.hk.pool.ntp.orgreboot1.4、Genymotion ARM Translation
1、Genymotion是基於X86的,不支持ARM架構。所以有些應用是基於ARM架構編譯的就無法安裝,出現如下提示:
2、解決方法
安裝ARM Translation tool,
下載地址:[https://github.com/m9rco/Genymotion_ARM_Translation](https://github.com/m9rco/Genymotion_ARM_Translation)
下載與Genymotion模擬器相對應的Android版本的Genymotion-ARM-Translation.zip
然後將該文件直接拖入Genymotion,點OK開始安裝
安裝完點OK,重啟一下Genymotion即可
1.5、常用工具1、命令工具
tmux: 可以關閉窗口將程序放在後臺運行
jnettop: 監測網絡流量,得到通訊IP、埠、URL、速率信息
netstat -tunlp:埠對應進程號、監聽、收發包埠
htop: top 的增強版,當前系統負載、前臺活躍進程、線程和佔用apt install tmux jnettop htop
2、QtScrcpy
Android實時投屏軟體
[https://gitee.com/Barryda/QtScrcpy/releases](https://gitee.com/Barryda/QtScrcpy/releases)
3、wifi adb
連接WIFI自動開啟網絡調試
[https://www.apkmirror.com/apk/metactrl/wifi-adb-debug-over-air/](https://www.apkmirror.com/apk/metactrl/wifi-adb-debug-over-air/)
kali虛擬機adb連接模擬器:
直接adb devices時提示沒設備,可以先使用adb connect 192.168.3.18:5555
4、termux
Android終端模擬器應用程式,可直接運行而無需生根或安裝。自動安裝了最小的基本系統-使用APT軟體包管理器可以使用其他軟體包2、四大組件與系統架構2.1、Android四大組件
5、Neofetch
在終端中顯示Linux系統信息,可以連接手機查看手機系統信息
1、Activity1、一個Activity通常就是一個單獨的窗口2、Activity之間通過Intent進行通信。3、Activity應用中每一個Activity都必須要在AndroidManifest.xml配置文件中聲明,否則系統將不識別也不執行該Activity。
2、Service1、Started(啟動):當應用程式組件(如Activity)調用StartService()方法啟動服務時,服務處於Started狀態。2、bound(綁定):當應用程式組件調用bindService()方法綁定到服務時,服務處於bound狀態。3、Service通常位於後臺運行,它一般不需要與用戶交互,因此Service組件沒有圖形用戶界面。Service組件需要繼承Service基類。Service組件通常用於為其他組件提供後臺服務或監控其他組件的運行狀態。
3、Content provider1、Android平臺提供了Content Provider使一個應用程式的指定數據集提供給其他應用程式。其他應用可以通過ContentResolver類從該內容提供者中獲取或存入數據。2、只有需要在多個應用程式間共享數據是才需要內容提供者。例如,通訊錄數據被多個應用程式使用,且必須存儲在一個內容提供者中。它的好處是統一數據訪問方式。3、ContentProvider實現數據共享。ContentProvider用於保存和獲取數據,並使其對所有應用程式可見。這是不同應用程式間共享數據的唯一方式,因為android沒有提供所有應用共同訪問的公共存儲區。4、開發人員不會直接使用ContentProvider類的對象,大多數是通過ContentResolver對象實現對ContentProvider的操作。5、ContentProvider使用URI來唯一標識其數據集,這裡的URI以content://作為前綴,表示該數據由ContentProvider來管理。
4、Broadcast Receiver1、你的應用可以使用它對外部事件進行過濾,只對感興趣的外部事件(如當電話呼入時,或者數據網絡可用時)進行接收並做出響應。廣播接收器沒有用戶界面。然而,它們可以啟動一個activity或serice來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力,例如閃動背燈、震動、播放聲音等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。2、廣播接收者的註冊有兩種方法,分別是程序動態註冊和AndroidManifest文件中進行靜態註冊。3、動態註冊廣播接收器特點是當用來註冊的Activity關掉後,廣播也就失效了。靜態註冊無需擔憂廣播接收器是否被關閉,只要設備是開啟狀態,廣播接收器也是打開著的。也就是說哪怕app本身未啟動,該app訂閱的廣播在觸發時也會對它起作用。2.2、Android系統架構
Android採用分層的架構,分為四層,從高層到底層分為應用程式層(app+System apps),應用程式框架層(Java API Framework),系統運行庫和運行環境層(Libraries + android Runtime)和Linux核心層(HAL+ Linux Kernel)2.3、Android常用開發與逆向命令總結
1、file查看文件屬性
2、使用echo命令寫內容到文件中,然後利用cat讀取文件內容。
3、使用dumpsys命令獲取當前頂層activity的信息,grep進行過濾,-i參數忽略大小寫。
4、ls -alit按時間排序顯示當前目錄全部信息。
5、dumpsys package com.termux查看該APP內存中的信息
6、ps -e 顯示全部進程
7、dumpsys dbinfo com.termux查看資料庫信息
8、adb pull /sdcard/app 將手機中的文件拷貝到電腦當前目錄下
adb push D:\tmp.txt /sdcard 將本地文件放到手機中
註:如遇到權限問題,使用chmod改權限
9、adb forward埠轉發
10、adb logcat 查看當前日誌信息adb logcat |grep -i com.termux
11、指定連接某臺設備的adb shelladb -s 192.168.3.18:5555 shell
12、查看某埠對應的進程名netstat -tunlp |grep 7001 # 埠netstat -tunlp |grep "com.termux" # 進程名netstat -aple |grep -i https #正在通信的埠,查看使用https的通信
13、htop 實時查看手機進程
手機普通用戶termux安裝
手機root用戶查看htop,全部進程$ su# /data/data/com.termux/files/usr/bin/htop3、刷機3.1、推薦環境
1、pixel(sailfish)+官方8.1.0_r1+twrp3.3.0+Magisk+Frida
2、pixel(sailfish)+twrp3.3.0+lineage16.0+addonsu16.0
1、pixel(sailfish)+官方7.1.2_r8+twrp3.2.1-0+SuperSU+XposedInstaller
1、pixel(sailfish)+最新fastboot+Fart8.1.0
2、n6p(angler)+老fastboot+Fart8.1.0
1、n6p(angler)+原生8.1.0_r1+twrp3.3.1+SuperSu3.2、n6p(angler)+官方8.1.0_r1+twrp3.3.1+Magisk+Frida下面帶領大家刷兩套常用手機環境。
搜鏡像並下載8.1.0 (OPM1.171019.011, Dec 2017)
[https://developers.google.com/android/images](https://developers.google.com/android/images)
然後下載對應手機型號的安裝包root@tale:~/Desktop# wget https://dl.google.com/dl/android/aosp/angler-opm1.171019.011-factory-39448337.ziproot@tale:~/Desktop# 7z x angler-opm1.171019.011-factory-39448337.zip
1、將fastboot添加環境變量# nano ~/.bashrc添加export PATH=/root/Android/Sdk/platform-tools:$PATH# source ~/.bashrc
2、手機完全關機,按住下音量鍵+關機鍵,進入bootloader模式root@tale:~/Desktop/angler-opm1.171019.011# ./flash-all.sh
部分較老機型在使用fastboot刷入8.1.0_r1版本的FART時(比如bullhead),會出現各種奇怪錯誤,原因是使用高版本的fastboot會報錯:
複製自己編譯的fastboot替換原文件即可。# which fastboot# mv /root/Desktop/fastboot Android/Sdk/platform-tools/fastboot# chmod 777 fastboot
提示finished之後手機會進入重啟狀態
選擇中文後,一直點下一步進入手機主屏幕,然後設置休眠時間長一些,再去點擊10次版本號,打開開發者選項,打開「不鎖定屏幕」
-關閉「自動系統更新」-開啟「USB調試」3.2.1、使用Magisk獲取root
[https://twrp.me/](https://twrp.me/)
選擇TWRP 3.3.1-0 Released,然後點擊 devices page
選擇Primary (Europe)
下載拷貝到kali虛擬機
手機進入bootloader模式,然後使用fastboot flash recovery命令# adb reboot bootloader# fastboot flash recovery twrp-3.3.1-0-angler.img 註:刷pixel XL使用# fastboot boot twrp-3.3.1-0-marlin.img
然後手機按兩下向下音量鍵,點擊開關鍵進入recovery mode模式
滑動進入後選擇settings,然後取消「Enable screen timeout」
下載Magisk、frida-server# wget https://github.com/topjohnwu/Magisk/releases/download/v20.4/Magisk-v20.4.zip# adb push Magisk-v20.4.zip /sdcard/# wget https://github.com/frida/frida/releases/download/12.11.10/frida-server-12.11.10-android-arm64.xz# 7z x frida-server-12.11.10-android-arm64.xz 放到官網推薦目錄下# adb push frida-server-12.11.10-android-arm64 /data/local/tmp/然後點擊install選項,找到Magisk-v20.4.zip,點進去之後向右滑動進行安裝,完成之後點擊Reboot System選擇Do Not install
啟動手機後,運行wifi adb時會彈出root請求選項,如下3.2.2、啟動frida-server
然後我們去開啟手機frida-server➜ ~ adb shellangler:/ $ whoamishellangler:/ $ suangler:/ # whoamirootangler:/ # cd /data/local/tmp/angler:/data/local/tmp # lsfrida-server-12.11.10-android-arm64 oatangler:/data/local/tmp # chmod 777 frida-server-12.11.10-android-arm64 angler:/data/local/tmp # ./frida-server-12.11.10-android-arm64 &[1] 8096至此該套n6p(angler)+官方8.1.0_r1+twrp3.3.1+Magisk+Frida環境已刷成功。
3.3、n6p(angler)+官方8.1.0_r1+twrp3.3.1+SuperSu+NetHunter2020年4月初,Kali在其官方博客上釋出了最新的Kali Nethunter 2020.1,帶來了全新的Kali NetHunter Rootless和Kali NetHunter Lite,同時對完整版Kali Nethunter進行了更加深入的優化,使用了全新的內核編譯工具,從內核全面支持USB鍵盤、光碟機和網卡模擬,功能更加強大,系統更加穩定。可以連上顯示器和鍵鼠,直接成為一臺電腦,直接把桌面環境帶著走。
3.3.1、刷入官方原版鏡像
Kali Nethunter的完整鏡像不是所有手機都能裝的,只有官網支持的設備才能裝。這裡使用Nexus 6p(angler)進行舉例,主要流程分四步:首先完全關機,按住音量下+關機鍵,或直接使用如下命令,進入bootloader模式
# adb reboot bootloader# cd angler-opm1.171019.011/# ./flash-all.sh3.3.2、三方recovery:twrp
# adb reboot bootloader# fastboot flash recovery twrp-3.3.1-0-angler.img3.3.3、使用SuperSU獲取root按兩下音量↓鍵,開機鍵確認進入recovery mode# adb push SR5-SuperSU-v2.82-SR5-20171001224502.zip /sdcard然後安裝SuperSU即可3.3.4、刷入Kali Nethunter下載Nexus 6P Oreo
https://www.offensive-security.com/kali-linux-nethunter-download/root@tale:~# proxychains wget https://images.kali.org/nethunter/nethunter-2020.3-angler-oreo-kalifs-full.zip# adb push /Users/tale/Downloads/nethunter-2020.3-angler-oreo-kalifs-full.zip /sdcard/# adb reboot bootloader按兩下音量↓鍵,開機鍵確認進入recovery mode然後選擇安裝Nethunter即可刷機結束後進入系統首次也要先點擊Nethunter的應用,申請的所有權限都給,左側導航進入Kali Chroot Manager,點擊START KALI CHROOT,只要初始化這一次,後續無論如何重啟都會出現如圖所示的Everything is fine and Chroot has been started!。
3.3.5、使用Kali Nethunter
至此詳細刷機流程結束。1、點開Nethunter這個app,給它所有的權限,左上角選擇Kali Chroot Manager頁面,看到chroot系統初始化完成。
4、動靜態分析
2、點開Nethunter終端這款App,選擇KALI,進入Kali系統。
3、apt update升級系統中的軟體庫信息。
4、可以安裝linux環境才能跑的命令程序,如apt install neofetch htop jnettop等。
5、打開Nethunter這個應用,左上角切換到KeX Manager,點擊「SETUP LOCAL SERVER」,輸入一個連接密碼和顯示密碼,輸入和確認即可,然後點擊「START SERVER」開啟伺服器。點開「KeX Client」這個App,在密碼那一欄輸入密碼之後,點擊「Connect」進行連接,即可直接進入Kali Nethunter作業系統的桌面。
6、配合QtScrcpy、wifiadb更方便的從電腦操控手機,並不用連接數據線
7、可以在此手機系統運行操作burp、Wireshark來抓包,手機SIM卡的流量也可以抓到。
8、Kali Nethunter為諸多USB設備和無線網卡打上了驅動補丁,可以在手機上直接製作路由器,然後在網卡上進行抓包。(以後會發文章詳情介紹)
製作路由器來抓包可以徹底解決抓不到包的問題,因為在路由器上抓包,對於一個App來說日常使用是沒有區別的,所以可以做到對App的完全無感知的,從上帝視角對APP進行全面監控。下面以具體一個惡意APP為實例,運用動靜態分析方法結合工具使用來分析該APP。
4.1、靜態分析
通過模擬器安裝該APP發現場面高能,背景和背景音樂非常不健康(筆者差點身敗名裂),並且音量被調到最大,循環播放無法關閉,屏幕也被鎖定無法關閉。靜態分析原理基本就是一個反彙編過程,常用的靜態分析工具為jadx、jeb、gda,當我們拿到手分析一款APP時,基本先反編譯、解包大致查看APK裡的內容,下圖為jadx-gui反編譯之後的情況。
# proxychains wget https://github.com/skylot/jadx/releases/download/v1.1.0/jadx-1.1.0.zip4.2、動態分析
可以看到該APP並沒有加殼,然後我們解壓APK文件後,發現在r文件夾下存放了資源文件(包括多人運動的圖片與聲音),dex為Dalvik虛擬機可執行文件,resources存放了一些字符串,meta包含該APP籤名信息,AndroidManifest文件中包含了APP的配置信息。
將要分析的APP文件拖入jeb之後,進入MainActivity,然後選擇Decompile,通過代碼分析發現該APP首先註冊了Broadcast,然後尋找該類Class.forName("com.shimeng.qq2693533893.MyServiceOne"),最後用startService來啟動該類。主要邏輯在MyServiceOne類裡。
點開MyServiceOne發現裡面有祝福的話
通過在模擬器運行該APP發現,連接模擬器的ADB斷掉,而且重啟模擬器會自動彈出APP的頁面並且自動播放聲音,該聲音無法關掉,而且重啟手機後也會自動播放聲音。
setprop persist.sys.usb.config none執行斷掉自身USB的操作。動態分析在運行代碼的情況下,通過跟蹤分析相關的內存,如寄存器內容,函數執行結果,內存使用情況等等,分析函數功能,明確代碼邏輯。
objection是由Frida提供支持的運行時移動探索工具包,旨在幫助您評估行動應用程式的安全狀況# wget https://bootstrap.pypa.io/get-pip.py# python3 get-pip.py# pip install objection# objection version# adb push frida-server-12.11.10-android-arm64 /data/local/tmp# adb shell# su# cd /data/local/tmp# chmod 777 *# ./frida-server-12.11.10-android-arm64# objection -g com.android.settings explore
通過objection動態分析該APP,不過因要分析的惡意APP會自動斷掉USB連接,所以我們在模擬機上用termux運行frida服務,並監聽8888埠,用電腦去連接監聽的埠。vbox: # ./frida-server-12.11.10-android-x86 -l 0.0.0.0:8888
通過frida-ps找到該APP包名com.shimeng.qq2693533893# frida-ps -H 192.168.56.101:8888
配合加載Wallbreaker插件,更方便的搜索查看Android內存中的類結構、實例、內部數據等。# git clone https://github.com/hluwa/Wallbreaker ~/.objection/plugins/Wallbreaker# objection -N -h 192.168.56.101 -p 8888 -g com.android.settings explore -P ~/.objection/plugins
通過動靜態結合分析了解大致邏輯在com.shimeng.qq2693533893.MyServiceOne類中,操作按解除鎖定後,然後hook該類com.shimeng.qq2693533893 on (Android: 8.0.0) [net] # android hooking watch class com.shimeng.qq2693533893.MyServiceOne
首先觀察objection發現一直調用該函數access$L1000018
然後hook該方法com.shimeng.qq2693533893 on (Android: 8.0.0) [net] # android hooking watch class_method com.shimeng.qq2693533893.MyServiceOne.access$L1000018 --dump-backtrace
發現一直在調用MyServiceOne$100000007,通過靜態分析找到100000007,發現該方法是調用getStreamMaxVolume系統音量最大的api,所以該APP運行之後無法關閉音量。
回頭來看我們輸入的解鎖碼然後列印出來的內容,相當於輸入了一個解鎖碼的參數,下圖涉及到的調用方法即APP的執行流程。com.shimeng.qq2693533893 on (Android: 8.0.0) [net] # android hooking watch class com.shimeng.qq2693533893.MyServiceOne
然後hook顏如玉方法com.shimeng.qq2693533893 on (Android: 8.0.0) [net] # android hooking watch class_method com.shimeng.qq2693533893.MyServiceOne.顏如玉 --dump-args --dump-backtrace --dump-return
點擊再點解鎖,發現列印出了參數、返回值、調用棧。
根據列印出的內容繼續跟蹤該類com.shimeng.qq2693533893.MyServiceOne$100000002
發現主要的判斷邏輯如下,如果與9DDEB743E935CE399F1DFAF080775366相等,則移除MyServiceOne.this.util.removeView(),進入sm2if(顏如玉QQ2693533893.getSaltMD5(MyServiceOne.顏如玉(v2.substring(0, 3))) + v2.substring(3, v2.length()).equals("9DDEB743E935CE399F1DFAF080775366" + v3_1)) {MyServiceOne.this.util.removeView();MyServiceOne.this.sm2();
5、脫殼
至此,利用動態分析我們將更準確的定位到關鍵性邏輯,相比搜索字符串碰運氣,更快捷靠譜。將解包後的dex文件導入010Editor進行分析查看,發現文件頭為dex035,比較常用的葫蘆娃脫殼機FRIDA-DEXDump的原理是採用暴力搜索內存中dex035進行特徵匹配
# proxychains wget https://www.sweetscape.com/download/010EditorLinux64Installer.tar.gz# tar zxvf 010EditorLinux64Installer.tar.gz # ./010EditorLinux64Installer
個人比較常用的FRIDA-DEXDump如作者所說可實現三秒脫殼。https://github.com/hluwa/FRIDA-DEXDump默念一聲"我想脫個殼"。啟動 APP。啟動 frida-server。python main.py。默數三秒,脫好了。6、總結
越學越菜