如何開始對Android應用的逆向分析?
本文是我的關于如何開始Android逆向系列文章的第一部分。在文末提供了一個文檔,你可以根據該文檔說明部署同我一樣的實驗環境。
在了解android應用的逆向之前,你必須對android平臺及其架構和android應用程序的構建塊(組件)已有了一個較好的理解。如果你并不了解這些,那么我建議你先參閱以下鏈接,然后再繼續瀏覽本文。
- Android平臺架構
- Android應用程序及其組件
- Android應用程序及其架構(PPT)
我當前的實驗室環境如下:
- 主機系統為windows,其中安裝了virtual box 和 genymotion
- virtual box 和 genymotion的設備都處于橋接模式
- Android 4.4 (kitkat API version 19)
- 在virtual box中,kali linux也同時運行(與genymotion一起)
注:該設置并非固定,你可以根據自身需求環境進行調整。例如,你也可以使用kali linux作為你的主機系統,并在上面安裝genymotion。
在正式開始我們的逆向之旅前,我想先向大家介紹一下名為adb(android debugger bridge)的工具/服務器。它可以幫助我們連接,獲取數據并將指令傳遞給遠程Android設備(調試模式可以通過設備設置中的開發者模式打開)。當前情況下,我們將使用genymotion設備(虛擬設備)。
對于安卓應用的逆向,這里有一個非常好的可供我們學習和練習的apk - DIVA ( Damn insecure and vulnerable mobile Application )。這是一個由Payatu的安全分析師開發的脆弱安卓應用。下面我們也將以該應用為例:
首先,讓我們來啟動genymotion設備:
- 在Windows/Linux中搜索Genymotion應用
- Start genymotion
選中你想要啟動的設備,然后點擊Start按鈕。
如果你以上步驟正確執行,則應該能看到類似以下的界面:
可以看到Android設備已經啟動,現在我們來啟動虛擬機中的kali linux。步驟如下:
- 啟動virtual box
- 從中啟動kali虛擬機
注:這兩個虛擬機處于橋接模式。如果有DHCP服務器,則需要連接到路由器或網絡。
現在兩臺機器都已啟動,下面讓我們來檢查下kali和Android設備之間的連接情況。為此,我們需要獲取Android設備的IP地址。
- 導航到設置菜單
- 單擊WiFi選項
- 你會在網絡中看到WiredSSID
- 長按“WiredSSID”選項
- 你會看到如下所示界面
獲取IP后我們回到kali終端,并鍵入以下命令檢查連接情況:
- adb connect 192.168.20.74
如果命令正確執行,你將會看到以下輸出。
現在讓我們通過執行以下命令,來驗證設備是否真正連接:
- adb devices
通過確認我們得知設備已連接到IP地址192.168.20.74和5555端口(adb默認的連接端口為5555)。
現在,我們就可以在Android設備上執行不同的adb命令了。通過-h選項查看可用參數:
- adb -h
在幫助信息中會為你列出所有可用的參數選項。下面是一些在逆向中時常會用到的命令:
ADB 調試
- adb devices – Lists all the connected devices
- adb forward – used for forwarding socket connections
- adb kill-serve
無線
- adb connect – connects to the remote device
- adb usb – connects to the USB attached device
包管理器
- adb install – install a package adb uninstall – uninstall a package adb shell pm list packages – used for displaying lists of packages installed adb shell pm path – used for displaying package path on device adb shell pm clear
文件管理器
- adb pull – used for pulling / downloading a file adb push – used for pushing / uploading a file adb shell ls – used for displaying list of files and directories in the current directory adb shell cd – used for changing the directory adb shell rm- used for removing a file adb shell mkdir – used for creating a directory adb shell touch – used for creating a file adb shell pwd – used for displaying the current path adb shell cp – used for copying a file adb shell mv – used for moving a file
網絡
- adb shell netstat – used for displaying the statistics for network connection adb shell ping – used for pinging a host / IP adb shell netcfg adb shell ip
Logcat
- adb logcat adb shell dumpsys adb shell dumpstate
截圖
- adb shell screencap adb shell screenrecord
系統
- adb root adb sideload adb shell ps adb shell top adb shell getprop adb shell setprop
在了解adb命令后,下面我們來安裝DIVA(Android應用程序)。
注:請將該應用下載安裝至你的kali機器上,因為所有的adb命令都將從kali中觸發。
執行以下命令安裝該應用:
- adb install diva-beta.apk
現在,我們已經完成了diva-beta.apk的安裝。讓我們來驗證下該應用是否已在我們的設備中成功安裝。
可以看到應用程序已被正確安裝,并可在設備的菜單中使用。
讓我們通過單擊該應用程的圖標來啟動它。你將看到如下啟動界面:
當前,DIVA為我們準備了以下挑戰:
不安全的日志記錄 硬編碼問題 – 第1部分 不安全的數據存儲 – 第1部分 不安全的數據存儲 – 第2部分 不安全的數據存儲 – 第3部分 不安全的數據存儲 – 第4部分 輸入驗證問題 – 第1部分 輸入驗證問題 – 第2部分 訪問控制問題 – 第1部分 訪問控制問題 – 第2部分 訪問控制問題 – 第3部分 硬編碼問題 – 第2部分 輸入驗證問題 – 第3部分
我們將逐一解決上述挑戰,讓你了解Android應用中的不同漏洞。對于第一項挑戰,即不安全日志記錄,我們可以通過adb命令來檢查diva應用的日志記錄。命令如下:
- adb logcat
如果命令正確執行,你將會看到如下所示內容:
可以看到這里的日志記錄非常的雜亂,因為它顯示了許多不同的日志記錄數據(整個設備)。為了讓我們看起來更加清晰,我將使用grep命令。但在此之前,我們需要首先獲取該應用程序包的進程ID。命令如下:
- adb shell ps | grep diva
如果命令正確執行,你將會看到如下所示內容:
adb shell是用于通過adb發送任何shell指令的命令;ps作為shell指令發送,ps的輸出提供給grep命令。Grep是一個非常棒的用于搜索相關字符串的工具,在本例中我們搜索的字符串為“diva”。
從輸出結果中我們得知,diva的pid為1654,包名稱為“jakhar.aseem.diva”
現在,讓我們以組合的形式使用logcat和grep命令:
- adb logcat | grep 1654
你將看到與該特定進程(即diva)相關的所有日志。