第30讲:如何爬app的数据
前面我們介紹的都是爬取 Web 網頁的內容。隨著移動互聯網的發展,越來越多的企業并沒有提供 Web 網頁端的服務,而是直接開發了 App,更多更全的信息都是通過 App 來展示的。那么針對 App 我們可以爬取嗎?當然可以。
我們知道 Web 站點有多種渲染和反爬方式,渲染分為服務端渲染和客戶端渲染;反爬也是多種多樣,如請求頭驗證、WebDriver 限制、驗證碼、字體反爬、封禁 IP、賬號驗證等等,綜合來看 Web 端的反爬蟲方案也是多種多樣。
但 App 的情況略有不同,一般來說,App 的數據通信大都需要依賴獨立的服務器,比如請求某個 HTTP 接口來獲取數據或做登錄校驗等。這種通信其實就類似 Web 中的 Ajax,客戶端向服務器發起 HTTP 請求,獲取到數據之后再做一些處理,數據的格式大多也是 JSON、XML 等,基本不會有 HTML 代碼這樣的數據。
所以說,對于 App 來說,其核心就在于找到這些數據請求到底是怎樣的,比如某次 HTTP POST 請求的 URL、Headers、Data 等等,知道了這些,我們就能用程序模擬這個請求過程,從而就能完成爬蟲了。
那么怎么知道 App 到底在運行過程中發起了什么請求呢?最有效且常見的方式就是抓包了,抓包工具也非常多,比如 Fiddler、Charles、mitmproxy、anyproxy 等等,我們用這些工具抓到 HTTP 請求包,就能看到這個請求的 Method、Headers、Data 等內容了,知道了之后再用程序模擬出來就行了。
但是,這個過程中你可能遇到非常多的問題,畢竟 App 的數據也是非常寶貴的,所以一些 App 也添加了各種反爬措施,比如:
- 這個 App 的請求根本抓不到包,原因可能是 App 本身設置了不走系統代理。
- 對一些 HTTPS 的請求,抓包失敗,原因可能是系統或 App 本身設置了 SSL Pining,對 HTTPS 證書進行了校驗,代理軟件證書校驗不通過,拒絕連接。
- 某些包即使抓到了,也發現了其中帶了加密參數,比如 sign、token 等等,難以直接用程序模擬。
- 為了破解一些加密參數可能需要對 App 進行逆向,逆向后發現是混淆后的代碼,難以分析邏輯。
- 一些 App 為了防止逆向,本身進行了加固,需要對 App 進行脫殼處理才能進行后續操作。
- 一些 App 將核心代碼進行編譯,形成 so 庫,因此可能需要對 so 庫進行逆向才能了解其邏輯。
- 一些 App 和其服務器對以上所有的流程進行了風控處理,如果發現有疑似逆向或破解或訪問頻率等問題,返回一些假數據或拒絕服務,導致爬蟲難以進行。
隨著移動互聯網的發展,App 上承載的數據也越來越多,越來越重要,很多廠商為了保護 App 的數據也采取了非常多的手段。因此 App 的爬取和逆向分析也變得越來越難,本課時我們就來梳理一些 App 爬取方案。
以下內容針對 Android 平臺。
抓包
對于多數情況來說,一臺 Android 7.0 版本以下的手機,抓一些普通的 App 的請求包還是很容易做到的。
抓包的工具有很多,常見的如 Charles、Fiddler、mitmproxy 等。
抓包的時候在 PC 端運行抓包軟件,抓包軟件會開啟一個 HTTP 代理服務器,然后手機和 PC 連在同一個局域網內,設置好抓包軟件代理的 IP 和端口,另外 PC 和手機都安裝抓包軟件的證書并設置信任。這樣在手機上再打開 App 就能看到 App 在運行過程中發起的請求了。
抓包完成之后在抓包軟件中定位到具體數據包,查看其詳情,了解其請求 Method、URL、Headers、Data,如果這些沒有什么加密參數的話,我們用 Python 重寫一遍就好了。
當然如果遇到抓不到包或者有加密參數的情形,無法直接重寫,那就要用到后面介紹的方法了。
抓不到包
一些 App 在內部實現的時候對代理加了一些校驗,如繞過系統代理直接連接或者檢測到了使用了代理,直接拒絕連接。
這種情形往往是手機的 HTTP 客戶端對系統的網絡環境做了一些判斷,并修改了一些 HTTP 請求方式,使得數據不走代理,這樣抓包軟件就沒法直接抓包了。
另外對于一些非 HTTP 請求的協議,利用常規的抓包軟件也可能抓不到包。這里提供一些解決方案。
強制全局代理
雖然有些數據包不走代理,但其下層還是基于 TCP 協議的,所以可以將 TCP 數據包重定向到代理服務器。比如軟件 ProxyDroid 就可以實現這樣的操作,這樣我們就能抓到數據包了。
ProxyDroid:https://github.com/madeye/proxydroid
手機代理
如果不通過 PC 上的抓包軟件設置代理,還可以直接在手機上設置抓包軟件,這種方式是通過 VPN 的方式將網絡包轉發給手機本地的代理服務器,代理服務器將數據發送給服務端,獲取數據之后再返回即可。
使用了 VPN 的方式,我們就可以截獲到對應的數據包了,一些工具包括 HttpCanary、Packet Capture、NetKeeper 等。
- HttpCanary:https://play.google.com/store/apps/details?id=com.guoshi.httpcanary
- Packet Capture:https://play.google.com/store/apps/details?id=app.greyshirts.sslcapture
- NetKeeper:https://play.google.com/store/apps/details?id=com.minhui.networkcapture.pro
以上應用鏈接來源于 Google Play,也可以在國內應用商店搜索或直接下載 apk 安裝。
特殊協議抓包
可以考慮使用 Wireshark、Tcpdump 在更底層的協議上抓包,比如抓取 TCP、UDP 數據包等等。
使用的時候建議直接 PC 上開熱點,然后直接抓取 PC 無線網卡的數據包,這樣 App 不管有沒有做系統代理校驗或者使用了非 HTTP 協議,都能抓到數據包了。
SSL Pining
SSL Pining,就是證書綁定,這個只針對 HTTPS 請求。
SSL Pining 發生在下面的一些情況:
- 對于 Android 7.0 以上的手機,系統做了改動,HTTPS 請求只信任系統級別證書,這會導致系統安全性增加,但是由于抓包軟件的證書并不是系統級別證書,就不受信任了,那就沒法抓包了。
- 一些 App 里面專門寫了邏輯對 SSL Pining 做了處理,對 HTTPS 證書做了校驗,如果發現是不在信任范圍之內的,那就拒絕連接。
對于這些操作,我們通常有兩種思路來解決:
- 讓系統信任我們的 HTTPS 證書;
- 繞開 HTTPS 證書的校驗過程。
對于這兩種思路,有以下一些繞過 SSL Pining 的解決方案。
修改 App 的配置
如果是 App 的開發者或者把 apk 逆向出來了,那么可以直接通過修改 AndroidManifest.xml 文件,在 apk 里面添加證書的信任規則即可,詳情可以參考 https://crifan.github.io/app_capture_package_tool_charles/website/how_capture_app/complex_https/https_ssl_pinning/,這種思路屬于第一種信任證書的解決方案。
將證書設置為系統證書
當然也可以將證書直接設置為系統證書,只需要將抓包軟件的證書設置為系統區域即可。但這個前提是手機必須要 ROOT,而且需要計算證書 Hash Code 并對證書進行重命名,具體可以參考 https://crifan.github.io/app_capture_package_tool_charles/website/how_capture_app/complex_https/https_ssl_pinning,這種思路也是第一種信任證書的解決方案。
Xposed + JustTrustMe
Xposed 是一款 Android 端的 Hook 工具,利用它我們可以 Hook App 里面的關鍵方法的執行邏輯,繞過 HTTPS 的證書校驗過程。JustTrustMe 是基于 Xposed 一個插件,它可以將 HTTPS 證書校驗的部分進行 Hook,改寫其中的證書校驗邏輯,這種思路是屬于第二種繞過 HTTPS 證書校驗的解決方案。
當然基于 Xposed 的類似插件也有很多,如 SSLKiller、sslunpining 等等,可以自行搜索。
Frida 也是一種類似 Xposed 的 Hook 軟件,使用它我們也可以實現一些 HTTPS 證書校驗邏輯的改寫,這種思路也是屬于第二種繞過 HTTPS 證書校驗的方案。
具體可以參考 https://codeshare.frida.re/@pcipolloni/universal-android-ssl-pinning-bypass-with-frida/。
VirtualXposed
Xposed 的使用需要 ROOT,如果不想 ROOT 的話,可以直接使用一款基于 VirtualApp 開發的 VirtualXposed 工具,它提供了一個虛擬環境,內置了 Xposed。我們只需要將想要的軟件安裝到 VirtualXposed 里面就能使用 Xposed 的功能了,然后配合 JustTrustMe 插件也能解決 SSL Pining 的問題,這種思路是屬于第二種繞過 HTTPS 證書校驗的解決方案。
特殊改寫
對于第二種繞過 HTTPS 證書校驗的解決方案,其實本質上是對一些關鍵的校驗方法進行了 Hook 和改寫,去除了一些校驗邏輯。但是對于一些代碼混淆后的 App 來說,其校驗 HTTPS 證書的方法名直接變了,那么 JustTrustMe 這樣的插件就無法 Hook 這些方法,因此也就無效了。
所以這種 App 可以直接去逆向,找到其中的一些校驗邏輯,然后修改寫 JustTrustMe 的源碼就可以成功 Hook 住了,也就可以重新生效了。
逆向秘鑰
還有一種硬解的方法,可以直接逆向 App,反編譯得到證書秘鑰,使用秘鑰來解決證書限制。
逆向
以上解決了一些抓包的問題,但是還有一個問題,就是抓的數據包里面帶有加密參數怎么辦?比如一個 HTTP 請求,其參數還帶有 token、sign 等參數,即使我們抓到包了,那也沒法直接模擬啊?
所以我們可能需要對 App 進行一些逆向分析,找出這些加密過程究竟是怎樣的。這時候我們就需要用到一些逆向工具了。
JEB
JEB 是一款適用于 Android 應用程序和本機機器代碼的反匯編器和反編譯器軟件。利用它我們可以直接將安卓的 apk 反編譯得到 Smali 代碼、jar 文件,獲取到 Java 代碼。有了 Java 代碼,我們就能分析其中的加密邏輯了。
JEB:https://www.pnfsoftware.com/
JADX
與 JEB 類似,JADX 也是一款安卓反編譯軟件,可以將 apk 反編譯得到 jar 文件,得到 Java 代碼,從而進一步分析邏輯。
JADX:https://github.com/skylot/jadx
dex2jar、jd-gui
這兩者通常會配合使用來進行反編譯,同樣也可以實現 apk 文件的反編譯,但其用起來個人感覺不如 JEB、JADX 方便。
脫殼
一些 apk 可能進行了加固處理,所以在反編譯之前需要進行脫殼處理。一般來說可以先借助于一些查殼工具查殼,如果有殼的話可以借助于 Dumpdex、FRIDA-DEXDump 等工具進行脫殼。
- FRIDA-DEXDump:https://github.com/hluwa/FRIDA-DEXDump
- Dumpdex:https://github.com/WrBug/dumpDex
反匯編
一些 apk 里面的加密可能直接寫入 so 格式的動態鏈接庫里面,要想破解其中的邏輯,就需要用到反匯編的一些知識了,這里可以借助于 IDA 這個軟件來進行分析。
IDA:https://www.hex-rays.com/
以上的一些逆向操作需要較深的功底和安全知識,在很多情況下,如果逆向成功了,一些加密算法還是能夠被找出來的,找出來了加密邏輯之后,我們用程序模擬就方便了。
模擬
逆向對于多數有保護 App 是有一定作用的,但有的時候 App 還增加了風控檢測,一旦 App 檢測到運行環境或訪問頻率等信息出現異常,那么 App 或服務器就可能產生防護,直接停止執行或者服務器返回假數據等都是有可能的。
對于這種情形,有時候我們就需要回歸本源,真實模擬一些 App 的手工操作了。
adb
最常規的 adb 命令可以實現一些手機自動化操作,但功能有限。
觸動精靈、按鍵精靈
有很多商家提供了手機 App 的一些自動化腳本和驅動,如觸動精靈、按鍵精靈等,利用它們的一些服務我們可以自動化地完成一些 App 的操作。
觸動精靈:https://www.touchsprite.com/
Appium
類似 Selenium,Appium 是手機上的一款移動端的自動化測試工具,也能做到可見即可爬的操作。
Appium:http://appium.io/
AirTest
同樣是一款移動端的自動化測試工具,是網易公司開發的,相比 Appium 來說使用更方便。
AirTest:http://airtest.netease.com/
Appium/AirTest + mitmdump
mitmdump 其實是一款抓包軟件,與 mitmproxy 是一套工具。這款軟件配合自動化的一些操作就可以用 Python 實現實時抓包處理了。
mitmdump:https://mitmproxy.readthedocs.io/
到此,App 的一些爬蟲思路和常用的工具就介紹完了,在后面的課時我們會使用其中一些工具來進行實戰演練。
參考來源
- https://zhuanlan.zhihu.com/webspider
- https://www.zhihu.com/question/60618756/answer/492263766
- https://www.jianshu.com/p/a818a0d0aa9f
- https://mp.weixin.qq.com/s/O6iWb2VL4SH9UNLwk2FCMw
- https://zhuanlan.zhihu.com/p/60392573
- https://crifan.github.io/app_capture_package_tool_charles/website/
- https://github.com/WooyunDota/DroidDrops/blob/master/2018/SSL.Pinning.Practice.md
總結
以上是生活随笔為你收集整理的第30讲:如何爬app的数据的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第33讲:可见即可爬,Appium 的使
- 下一篇: 第16讲:异步爬虫的原理和解析