本文來自網易雲社區html
做者:王濤java
本文主要介紹了移動端爬蟲的工具與方法,做爲一個入門的大綱。沒有詳細介紹的也給出了本人學習過程當中借鑑的資料的連接,適合對移動端爬蟲感興趣的同窗入門。python
中間人攻擊:在中間人攻擊中,攻擊主機一般截斷客戶端和服務器的加密通訊。攻擊機以本身的證書替代服務器發給客戶端的證書。一般,客戶端不會驗證該證書,直接接受該證書,從而創建起和攻擊機的安全鏈接。這樣,客戶端發送的數據,都會被攻擊機獲取和解密。linux
Fiddler | charles | anyproxy | |
---|---|---|---|
手機安裝證書 | 須要 | 須要 | 須要 |
支持抓取 | http/websocket/https(單向認證) | http/websocket/https(單向認證) | http/websocket/https(單向認證) |
支持平臺 | win/mac/linux(受限) | win/mac/linux | win/mac/linux |
腳本開發 | Jscript.net | 未知 | js |
準備工做:手機與PC在同一個局域網內(能夠連同一個WIFI,或者電腦插入移動WIFI)android
配置步驟見下:ios
https的抓包原理是基於中間人攻擊的方式,可是這種方式只適用於單向認證的方式,也就是隻是客戶端去檢驗服務端的證書。而雙向認證的Https,服務端還會校驗客戶端的證書。https握手過程以下:git
如何檢測是雙向認證仍是單向認證,能夠經過wireshark抓包看雙方的協商過程,證書的交換是不是雙向的。github
解決辦法:暫時沒有好的辦法解決這個抓包的問題golang
ssl pinning:證書鎖定Certificate Pinning是SSL/TLS加密的額外保證手段。它會將服務器的證書公鑰預先保存在客戶端。在創建安全鏈接的過程當中,客戶端會將預置的公鑰和接受的證書作比較。若是一致,就創建鏈接,不然就拒絕鏈接。Certificate Pinning在手機軟件中應用較多。由於這些應用鏈接的服務器相對固定,能夠預先將服務器的X509證書或者公鑰保存在App中。例如,蘋果應用商店Apple App Store就預置了這個功能。當使用中間人工具或者Fiddler之類的工具攔截數據,就會形成應用商店沒法聯網的狀況。web
解決辦法:手機安裝xposed和Justtrustme 插件(github.com/Fuzion24/Ju…)
抓到報文後,就能夠模擬請求了。請求發送的幾種方式:
抓包工具裏面提供了發送功能,Fiddler中的Composer 標籤裏提供了此功能。
Chrome的Postman擴展程序也能夠用來發送報文。
Python中的requests包也能夠方便地實現
如何構造更多的請求?(常見的分頁請求、更換查詢參數等)
若是抓不到包怎麼辦?(若是通訊走socket怎麼辦?)
http參數中包含加密、簽名字段,如何找到參數的生成方法?
經過程序模擬人的行爲對APP的界面進行點擊、滑動等操做,同時能夠獲取APP的Activity頁面上的大部分控件上的文本信息(有一些可能獲取不到,Uiautomator自己就獲取不到)
Appium官網介紹:
appium.io/docs/cn/abo…
github.com/appium/appi…
Macaca: macacajs.com/
Appium | Macaca | |
---|---|---|
支持平臺 | 須要 | 須要 |
腳本語言 | PC/ios/android/hybrid(h五、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)
若是使用過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的不穩定,出現異常時有可能進程卡死,須要從新啓動
方法1、二 對於沒有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使用這個指定代表方法中非參寄存器的總數,放在方法的第一行複製代碼
網址參考
bbs.pediy.com/thread-1517…
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複製代碼
一些對安全性要求高的APP會採用加固工具爲本身的APK加殼,表象就是你能反編譯代碼,反編譯出來的smali代碼很簡單,只能看到殼的主程序代碼,並無真實的業務邏輯代碼。 能夠藉助apktoolbox來進行檢測是什麼殼,而去尋找對應的脫殼工具。(因爲加固這個比較專業,這裏只推薦幾款比較出名的脫殼工具,細的就講不了了)
github.com/DrizzleRisk… 某數字公司殼
github.com/DrizzleRisk 其它幾個脫殼工具
github.com/zyq8709/Dex… 好久沒更新了
github.com/F8LEFT/FUPK… 須要修改android源碼
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介紹:api.xposed.info/reference/p…
開發者論壇:(forum.xda-developers.com/xposed)
Cydia Substrate:
官網:www.cydiasubstrate.com/
文檔:www.cydiasubstrate.com/id/264d6581…
Frida:
官網:www.frida.re/
須要安裝smaliidea,具體教程
blog.csdn.net/linchaolong…
使用IDA工具包,具體教程:
blog.csdn.net/jiangwei091…
隨着開發者對於數據安全性的重視,通常的APK都會有各類保護策略,包括代碼混淆、加殼,反調試,hook檢查等等策略。咱們非專業安全研究人員,只能見招拆招,只要能實現咱們的目的就能夠了,面對一些常規的策略有如下幾種應對措施。
調用ptrace(PTRACE_TRACEME,0,0,0) (原理一個進程只能被一個進程Ptrace)
檢測TracerPid的值
檢測代碼的執行間隔時間
檢測手機的硬件信息是否在調試器中
檢測android_server的端口號
檢測android_server 名稱
檢測在調試狀態下的軟件斷點
經過使用Inotify對文件進行監控
檢測進程列表中是否存在常見的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語法:www.jianshu.com/p/ba9b37434…
IDA使用介紹:blog.csdn.net/jiangwei091…
反反hook: gnaixx.cc/2016/09/03/…
Fiddler小白入門: blog.csdn.net/gld82412523…
淺析HTTPS中間人攻擊與證書校驗:blog.csdn.net/zhangmiaopi…
網易雲免費體驗館,0成本體驗20+款雲產品!
更多網易研發、產品、運營經驗分享請訪問網易雲社區。
相關文章:
【推薦】 網易鄭棟:數據採集與分析的那些事——從數據埋點到AB測試
【推薦】 淺談容器監控和網易雲計算基礎服務實踐
【推薦】 從golang的垃圾回收提及(上篇)