抖音數據採集教程,詳解Hook框架frida,讓你在逆向工做中效率成倍提高!

抖音數據採集教程,詳解Hook框架frida,讓你在逆向工做中效率成倍提高!

短視頻、直播數據實時採集接口,請查看文檔: TiToDatajava


免責聲明:本文檔僅供學習與參考,請勿用於非法用途!不然一切後果自負。

1、frida簡介
frida是一款基於python + java 的hook框架,可運行在androidioslinuxwinosx等各平臺,主要使用動態二進制插樁技術。本期「安仔課堂」,ISEC實驗室爲你們詳解frida,認真讀完這篇文章會讓你在逆向工做中效率成倍提高哦!

一、插樁技術
插樁技術是指將額外的代碼注入程序中以收集運行時的信息,可分爲兩種:
(1)源代碼插樁[Source Code Instrumentation(SCI)]:額外代碼注入到程序源代碼中。
(2)二進制插樁(Binary Instrumentation):額外代碼注入到二進制可執行文件中。
●靜態二進制插樁[Static Binary Instrumentation(SBI)]:在程序執行前插入額外的代碼和數據,生成一個永久改變的可執行文件。
●動態二進制插樁[Dynamic Binary Instrumentation(DBI)]:在程序運行時實時地插入額外代碼和數據,對可執行文件沒有任何永久改變。
二、你能用DBI作些什麼呢
(1)訪問進程的內存
(2)在應用程序運行時覆蓋一些功能
(3)從導入的類中調用函數
(4)在堆上查找對象實例並使用這些對象實例
(5)Hook,跟蹤和攔截函數等等
2、frida的安裝
今天咱們用到的frida框架分爲兩部分:** 一部分是運行在系統上的交互工具frida CLI; 另外一部分是運行在目標機器上的代碼注入工具 frida-server。
一、frida CLI
環境要求:
●系統環境 - Windows, macOS, or GNU/Linux
●Python – 最新的3.x版本
經過 pip 安裝frida

圖1
說明:
(1) 經過pip安裝的frida是能夠跟python綁定的; 另外frida如今也已經有了跟nodeJs綁定的版本, 所以也能夠直接經過 npm 進行安裝。
(2) frida CLI是安裝的frida的其中一個工具,也是最經常使用的一個工具。
二、frida server
frida-server須要咱們單獨下載,在 frida項目的github上能夠直接下載對應系統已經編譯好的frida server

圖2
咱們須要下載的文件名的格式是: frida-server-(version)-(platform)-(cpu).xz
我試驗的手機是nexus6p, cpu爲arm64
因此我須要下載的是: frida-server-11.0.13-android-x86_64.xz;注意, frida-server 的版本必定要跟 frida CLI的版本一致。
將下載後的壓縮包解壓獲得frida-server, 而後將該文件推送到Android設備上。

圖3
將Android設備上的frida-server添加執行權, 並運行該程序(須要root權限)

圖4
三、frida tools
前面說過, frida CLI只是frida的其中一個工具,** frida 的工具共有6個:
(1) frida CLI: 是一個交互式解釋器(REPL),他的交互形式跟IPython很相似。

圖5
(2) frida-ps: 用於列出進程的一個命令行工具,當咱們須要跟遠程系統進行交互的時候,這個是很是有用的。

圖6
另外還有四個分別是: frida-trace, frida-discover, frida-ls-devices, frida-kill
因爲不是常常用到,這邊就不一一詳細介紹了, 感興趣的同窗能夠去frida的官網查看他們的詳細介紹和用法。
四、Java Api
在Hook開始以前,有必要對Java注入相關的api作一個簡單介紹, frida的注入腳本是Java, 所以咱們後面都是經過js腳原本操做設備上的Java代碼的。

圖7
當咱們獲取到Java類以後,咱們直經過接..implementations = function() {}的方式來hook wrapper類的method方法,不論是實例方法仍是靜態方法均可以。
因爲js代碼注入時可能會出現超時的錯誤, 爲了防止這個問題,咱們一般還須要在最外面包裝一層setImmediate(function(){})的代碼。
下面就是js的一個模板代碼:

圖8
3、 frida Hook實戰
接下來我將經過製做一個相似微信搶紅包的插件來演示frida的具體使用,因爲本文的主旨是教你們如何使用強大的frida框架, 因此側重描述的是frida的使用, 而不會說明如何逆向微信。
一、信息持久化到本地的攔截
微信的每一條信息都會保存到本地數據庫,這個保存的方法就是 com.tencent.wcdb.database.SQLiteDatabase 類的 insert()方法:

圖9
咱們先看看每條信息保存的內容是什麼:

圖10
咱們將手機鏈接到電腦, 而後經過frida將腳本注入到微信中:

圖11
用微信發送任意消息,咱們能夠看到控制檯打印內容以下:

圖12
arg1就是要插入數據的表名, arg2是表的主鍵, arg3是要插入表的數據的字段名稱跟值的集合。這樣, 咱們就能夠輕鬆拿到每條消息的內容和發送者等相關信息。
這裏咱們須要注意的是arg3裏面如下幾個值:

圖13
當咱們接收到一條紅包消息的時候,咱們能夠看到紅包信息的具體內容以下:

圖14

圖15
那咱們要怎樣經過這些信息來搶到紅包呢?
二、搶紅包流程分析
咱們先來看一下,當咱們點擊打開紅包之時發生了什麼呢? 下面是反編譯獲得的打開紅包按鈕的點擊事件:

圖16
這行代碼其實就是發送搶紅包的請求, ad 就是一個網絡請求類, 那麼須要構成這個請求又須要哪些參數呢?
咱們單獨看看 ad 類的建立:

圖17
其中第1,2,3,4,9個參數都是來自luckyMoneyReceiveUI.kRG, 第8個參數是固定的 "v1.0"
接下來咱們來打印一下第5,6,7個參數是什麼:

圖18
從新加載這段js代碼, 而後咱們打開一個紅包, 咱們能夠看到控制檯打印以下信息:

圖19
第5,6個參數實際上是本身的頭像跟暱稱信息,第7個是發送者的信息,而第4個參數跟上面紅包內容裏面的nativeurl的值是同樣的。
那luckyMoneyReceiveUI.kRG 中的msgType,bxk,kLZ,ceR,kRC這些要怎麼獲得呢?
luckyMoneyReceiveUI.kRG 這個字段的類型是: com.tencent.mm.plugin.luckymoney.b.ag,ag類跟以前提到的ad類同樣, 都是一個請求類, 他們都是繼承同一個類。其中, msgType是固定的 1,bxk,kLZ,ceR 是在ag的構造方法裏面就被初始化的:

圖20
而kRC則是在裏面的a方法裏面被賦值的:

圖21
……

圖22
這個a方法是請求類發起請求以後的一個回調,而在 LuckyMoneyReceiveUI的 OnCreate 方法裏面咱們能夠看到 com.tencent.mm.plugin.luckymoney.b.ag 是怎麼被構造出來的:

圖23
第一個參數是nativeurl中的channelid;
第二個參數是nativeurl中的sendid;
第三個參數是nativeurl自己;
第四個參數能夠用0;
第五個參數是也是固定的 "v1.0"
通過上面的分析以後, 咱們的思路就清晰了, 在收到紅包信息後咱們解析出紅包信息裏面nativeurl, channelid, sendid, 根據這些參數發送一個com.tencent.mm.plugin.luckymoney.b.ag的請求, 以後獲得timingIdentifier, 最後根據獲得的timingIdentifier 再發送一個com.tencent.mm.plugin.luckymoney.b.ad的請求就能夠搶到紅包了。
三、模擬請求
到這裏咱們也就剩最後一個問題了, 那就是怎麼把請求發送出去?這個咱們一樣能夠看看微信, 咱們跟蹤到紅包界面的請求都是經過下面的方法發送的:

圖24
上面的g.Eh().dpP獲得的是一個專門發送請求的Network, 獲得這個Network以後咱們就能夠調用他的a方法把這個請求發送出去。須要注意的是frida不支持直接經過.dpP的方式拿到屬性, 不過不要緊, 咱們能夠經過反射的方式來獲取:

圖25
獲得Network以後咱們就開始發送請求了:
第一步是收到紅包信息以後要解析出ContentValues裏面的信息,並根據解析出的內容發送ag請求。

圖26
咱們單獨把紅包信息的content的解析拿出來:

圖27
nativeurl的具體內容以下:

圖28
經過上面的解析以後咱們就能夠獲得以下的info:

圖29
第二步是Hook ag請求的a方法, 在裏面咱們能夠拿到timingIdentifier的值:

圖30
注意:當一個類裏面有重載的方法的時候, 咱們須要用.overload(paramtype...)來表示咱們hook的是哪一個重載方法。
最後咱們還須要改造一下以前Hook的SQL的insert方法, 咱們須要過濾出表名爲message,類型爲436207665的消息:

圖31
接下來就能夠開始體驗咱們的搶紅包插件了!

圖32
最後請看效果:

圖33
4、附錄**
本次試驗環境以下:
微信版本: 6.6.7
frida版本: 11.0.13
frida-server: frida-server-11.0.13-android-x86_64
Android: 7.0node

相關文章
相關標籤/搜索