具體的報文走向如下
手機上的配置方法(以Fiddler為例,其它類似)
- 準備工作:手機與PC在同一個局域網內(可以連同一個WIFI,或者電腦插入移動WIFI)
- 配置步驟見下:
參考鏈接: https://blog.csdn.net/gld824125233/article/details/52588275
==特別說明,抓不到報文可能的情況==
1、單向雙向 https
https的抓包原理是基於中間人攻擊的方式,但是這種方式只適用於單向認證的方式,也就是隻是客戶端去檢驗服務端的證書。而雙向認證的Https,服務端還會校驗客戶端的證書。https握手過程如下:
如何檢測是雙向認證還是單向認證,可以通過wireshark抓包看雙方的協商過程,證書的交換是否是雙向的。
解決辦法:暫時沒有好的辦法解決這個抓包的問題
2、ssl pinning
ssl pinning:證書鎖定Certificate Pinning是SSL/TLS加密的額外保證手段。它會將服務器的證書公鑰預先保存在客戶端。在建立安全連接的過程中,客戶端會將預置的公鑰和接受的證書做比較。如果一致,就建立連接,否則就拒絕連接。Certificate Pinning在手機軟件中應用較多。因為這些應用連接的服務器相對固定,可以預先將服務器的X509證書或者公鑰保存在App中。例如,蘋果應用商店Apple App Store就預置了這個功能。當使用中間人工具或者Fiddler之類的工具攔截數據,就會造成應用商店無法聯網的情況。
解決辦法:手機安裝xposed和Justtrustme 插件(https://github.com/Fuzion24/JustTrustMe)
抓取實現
抓到報文後,就可以模擬請求了。請求發送的幾種方式:
- 抓包工具裡面提供了發送功能,Fiddler中的Composer 標籤裡提供了此功能。
- Chrome的Postman擴展程序也可以用來發送報文。
- Python中的requests包也可以方便地實現
缺陷
- 如何構造更多的請求?(常見的分頁請求、更換查詢參數等)
- 如果抓不到包怎麼辦?(如果通信走socket怎麼辦?)
- http參數中包含加密、簽名字段,如何找到參數的生成方法?
二、模擬點擊
基本原理(基於UIautomator)
通過程序模擬人的行為對APP的界面進行點擊、滑動等操作,同時可以獲取APP的Activity頁面上的大部分控件上的文本信息(有一些可能獲取不到,Uiautomator本身就獲取不到)
Appium官網介紹:
https://appium.io/docs/cn/about-appium/intro/,
https://github.com/appium/appium
Macaca: https://macacajs.com/
工具介紹
Appium Macaca 支持平臺 需要 需要 腳本語言 PC/ios/android/hybrid(h5、native混合) PC/ios/android/hybrid 備註 支持Android所有版本 Android支持API>17 底層框架 UIAutoation(IOS)/UIAUtomator+Selendroid(Android) XCUITest(IOS)/UIAUTOMATOR(Android) 穩定性 一般 更好 開源 JS基金項目,社區活躍 阿里開源,未來未知
==特別說明==
無
抓取實現
- 程序基本架構
- 框架API說明
- 以Appium為例,Appium 支持的API 介紹如下:
- 定位支持
- 通過accessibility id查找元素
- 通過元素id
- 通過元素文本內容
- 通過元素可見鏈接文本定位
- 通過元素標籤名稱定位元素
- 通過元素class name屬性定位元素
- 支持單個、批量獲取
- 操作支持
- 從某個元素滑動到另一個元素
- 把某元素拖到目標元素
- 模擬手指點擊(最多五個手指),可設置按住時間長度(毫秒)
- 從A點滑動到B點,滑動時間可配
- 快速滑動
- 模擬雙指捏(縮小操作)
- 在元素上執行放大操作
- 單擊
- 還能搖一搖(IOS支持)
- 執行JS腳本
- 獲取H5頁面的page source
- 輸入框輸入(回車的支持,建議選用sogou輸入法,keycode: 66 ,==這樣不需要去定位鍵盤上回車的輸入==)
- 控制APP
- 安裝、刪除、運行、關閉APP
- 指定運行某APP的某activity
- 獲取控件信息
- 文本
- 元素tag名稱
- 內容描述(content-desc)
樣例代碼(python)
如果使用過selenium做爬蟲或測試,對這個接口應該很熟悉。
from appium import webdriver
desired_caps = {}
desired_caps['platformName'] = 'Android'desired_caps['platformVersion'] = '6.0'desired_caps['deviceName'] = '192.168.174.101:5555'desired_caps['appPackage'] = 'com.android.calculator2'desired_caps['appActivity'] = '.Calculator'driver = webdriver.Remote('http://localhost:4723/wd/hub', desired_caps)
driver.find_element_by_id("digit_1").click()
driver.find_element_by_id("op_add").click()
driver.find_element_by_id("digit_2").click()
driver.find_element_by_id("eq").click()
driver.quit()
缺陷
- 獲取效率低
- 定位元素需要時間
- 為了保證穩定,需要在額外地增加等待時間
獲取的數據有限
- 只能獲取到界面上可視控件的信息
- H5頁面信息,(需要切換driver到H5)
Appium的不穩定,出現異常時有可能進程卡死,需要重新啟動
三、APK逆向
基本原理
方法一、二 對於沒有android逆向經驗的朋友是不錯的選擇,開發起來也比較簡單,能滿足一些對於應用數據的需求。但是如果想要更高效地獲取更多的數據,就需要研究APP的代碼。通過向APK中注入自己的代碼,修改APP本身原來的邏輯,比如修改函數執行內容、增加新的邏輯等等來來實現自己的目標。一般的操作步驟如下:
- 逆向APK
- 分析smali代碼
- 通過hook框架向APK中注入代碼,修改邏輯
需要的基礎
- smali語法
- APK反編譯
- 靜態、動態調試
- 常用HOOK框架
- 反調試、反HOOK應對策略
下面知識可以快速入門smali語法,最基本的數據類型,函數定義關鍵字,寄存器作用說明
關鍵字
field private isFlag:z --- 定義變量.method --- 方法.parameter --- 方法參數.prologue --- 方法開始.line 12 --- 此方法位於第12行invoke-super --- 調用父函數const/high16 v0, 0x7fo3 --- 把0x7fo3賦值給v0invoke-direct --- 調用函數return-void --- 函數返回void.end method --- 函數結束new-instance --- 創建實例iput-object --- 對象賦值iget-object --- 調用對象invoke-static --- 調用靜態函數
數據類型
B --- byteC --- charD --- double (64 bits)F --- floatI --- intJ --- long (64 bits)S --- shortV --- void 只能用於返回值類型Z --- BooleanLxxx/yyy/zzz; --- 類
[XXX --- 數組
寄存器類型
寄存器採用v和p來命名,
v表示本地寄存器,p表示參數寄存器,
共16個寄存器,v0~v15, 關係如下
v0第一個本地寄存器
v1第二個本地寄存器v2 p0(this)v3 p1第一個參數
v4 p2第二個參數
v5 p3第三個參數
當然,如果是靜態方法的話就只有5個寄存器了,不需要存this了。
.registers使用這個指令指定方法中寄存器的總數
.locals使用這個指定表明方法中非參寄存器的總數,放在方法的第一行
網址參考
https://bbs.pediy.com/thread-151769.htm
工具介紹
1. 反編譯工具
APKToolbox 工具
AndroidKiller(smali 代碼IDE)
常見問題及解決辦法
- 有一些包無法使用Apktool進行反編譯,常用解決辦法:
需要先下載smali.jar,baksmali.jar signapk.jar,
先把APK包解壓縮,然後直接使用 smali.jar baksmali.jar 來進行解壓縮1:將dex 輸出為 smali文件
java -jar baksmali-2.0.3.jar classes.dex # 把dex 文件反編譯2:將修改的smali 文件 重新打包成dex 文件# 把 out 文件夾下的smali文件重新打包成classes.dex文件java -jar smali-2.0.3.jar out #給APK包簽名java -jar signapk.jar testkey.x509.pem testkey.pk8 update.apk update_signed.apk
2. 脫殼工具
一些對安全性要求高的APP會採用加固工具為自己的APK加殼,表象就是你能反編譯代碼,反編譯出來的smali代碼很簡單,只能看到殼的主程序代碼,並沒有真實的業務邏輯代碼。 可以藉助apktoolbox來進行檢測是什麼殼,而去尋找對應的脫殼工具。(由於加固這個比較專業,這裡只推薦幾款比較出名的脫殼工具,細的就講不了了)
- https://github.com/DrizzleRisk/drizzleDumper 某數字公司殼
- https://github.com/DrizzleRisk 其它幾個脫殼工具
- https://github.com/zyq8709/DexHunter 很久沒更新了
- https://github.com/F8LEFT/FUPK3 需要修改android源碼
3. 常用Hook 框架
xposed Cydia Substrate Frida 支持的系統 android android/IOS win/mac/linux/IOS/Android 版本要求 android<=8.0 android(<=4.4)/ios(<=9.1) android<=8.1 開發語言 Java Java Python+Js 是否Root 需要 需要 需要 運行 安裝後重啟 安裝模塊後需要軟重啟 基於腳本交互 Java/Native Java層 Java/Native Java/Native
Xposed:
API介紹:https://api.xposed.info/reference/packages.html
開發者論壇:(https://forum.xda-developers.com/xposed)
Cydia Substrate:
官網:http://www.cydiasubstrate.com/
文檔:http://www.cydiasubstrate.com/id/264d6581-a762-4343-9605-729ef12ff0af/
Frida:
官網:https://www.frida.re/
4. 動態調試smali代碼
需要安裝smaliidea,具體教程
http://blog.csdn.net/linchaolong/article/details/51146492
5. 動態調試so
使用IDA工具包,具體教程:
http://blog.csdn.net/jiangwei0910410003/article/details/51500328
==特殊說明==
隨著開發者對於數據安全性的重視,一般的APK都會有各種保護策略,包括代碼混淆、加殼,反調試,hook檢查等等策略。我們非專業安全研究人員,只能見招拆招,只要能實現我們的目的就可以了,面對一些常規的策略有以下幾種應對措施。
反調試
- 調用ptrace(PTRACE_TRACEME,0,0,0) (原理一個進程只能被一個進程Ptrace)
- 檢測TracerPid的值
- 檢測代碼的執行間隔時間
- 檢測手機的硬件信息是否在調試器中
- 檢測android_server的端口號
- 檢測android_server 名稱
- 檢測在調試狀態下的軟件斷點
- 通過使用Inotify對文件進行監控
- 檢測進程列表中是否存在常見的Hook/調試的進程名稱
反hook
- 檢測已經安裝的應用裡是否包含xposed/Cydia Substrate
- hook PackageManager的getInstalledApplications,把Xposed或者Substrate的包名去掉
- 關鍵函數檢查調用棧裡的可疑方法
- hook Exception的getStackTrace,把自己的方法去掉
- 檢測並不應該Native的native方法
- hook getModifiers,把flag改成看起來不是native
- 通過/proc/[pid]/maps檢測可疑的共享對象或者JAR
- hook 打開的文件的操作,返回/dev/null或者修改的map文件
抓取實現
- 基於框架,開發hook代碼
缺陷
- hook的方式對APK的代碼有侵入,需要對APK中的各種反調試、反hook檢測手段做規避
- 如果遇到加殼的,分析時間會很長。如果無法脫殼,那麼將無法實現抓取
四、開發工具
- Requests庫
- 開源框架包括
- Pyspider
- Scrapy
- Tornado協和實現併發訪問
五、參考
- Smali語法:https://www.jianshu.com/p/ba9b374346dd
- IDA使用介紹:http://blog.csdn.net/jiangwei0910410003/article/details/51500328
- 反反調試:http://blog.csdn.net/feibabeibei_beibei/article/details/60956307
- 反反hook: http://gnaixx.cc/2016/09/03/android-anti-hooking/
- Fiddler小白入門: http://blog.csdn.net/gld824125233/article/details/52588275
- 淺析HTTPS中間人攻擊與證書校驗:http://blog.csdn.net/zhangmiaoping23/article/details/79228637
鏈接:https://www.jianshu.com/p/1285c8f6b03a
來源:簡書
閱讀更多 程序員在路上 的文章