Frida是一款輕量級HOOK框架,可用於多平台上,例如android、windows、ios等。
frida分為兩部分,服務端運行在目標機上,通過注入進程的方式來實現劫持應用函數,另一部分運行在系統機器上。
frida上層接口支持js、python、c等。
Frida官方github地址為:frida官方github地址
PS:雖然百度一下會發現frida教程有不少,但是涉及到native層的教程基本很少,然后對每一句Hook代碼解釋一下的更是少之又少,所以我還是厚着臉皮從自己的角度寫了這一篇!!!
0|1二、Frida安裝
1 、安裝python3.7並配置好環境變量(官方推薦python3以上版本至少為3.7),python安裝包官方下載地址:https://www.python.org/downloads/。
2 、安裝frida模塊,命令為pip install frida
(配置了多個python版本環境的可以使用命令python -m pip install frida
防止用pip install frida
命令報錯)。
3、安裝frida-tools模塊,命令同上,pip install frida-tools
或者python -m pip install frida-tools
。
4、下載運行在目標機上的frida-sever端,官方下載地址:https://github.com/frida/frida/releases,下載時要選擇對應的版本下載,例如我的機器為arm32為架構,就選擇frida-server-12.8.14-android-arm.xz
下載。(可以在adb使用命令cat /proc/cpuinfo
查詢)
5、將第四步下載好的文件解壓,然后通過命令adb push 你的電腦是存放位置 /data/local/tmp
將文件傳輸到手機中,然后通過adb shell
進入手機端,給文件賦權777,並於root權限啟動。
6、做完以上幾步后,新開一個命令行輸入命令frida-ps -U
查看手機進程,如果出現以下結果,則frida安裝成功。
0|1三、Frida Hook Java層
1、編寫一個小demo用來hook,該demo關鍵部分代碼如下:
2、現在我們將該apk安裝好,運行看一下未Hook前的顯示字符串!!!
3、現在來編寫Hook的Python腳本,腳本代碼如下:
4、現在python腳本編寫完畢,我們來執行該腳本,首先手機端執行frida,然后通過命令adb forward tcp:27043 tcp:27043
和adb forward tcp:27042 tcp:27042
來轉發這兩個端口,接着在手機上運行該應用程序,在命令行中執行腳本,最后點擊應用的按鈕,即可看到字符串已經被替換成我們要替換的了!!!
0|1四、Frida Hook Native層
4.1、Hook native層返回值為int類型的demo
1、還是先寫一個小demo,下面貼一下關鍵代碼(很簡單c語言代碼就不再解釋了,至於native層函數怎么編寫,由於本篇主要不是講怎么編寫so函數,就不過多敘述了,實在不會的可以看一下我的一篇博客,我覺得寫得還是挺詳細的,博客編寫native層函數鏈接:https://www.cnblogs.com/aWxvdmVseXc0/p/11564809.html)和未Hook前截圖:
代碼:
2、接下來我們來寫python hook腳本,我們需要hook native層這個函數,達到返回值修改為0的效果。寫到這里需要說明一下關於so文件當中的函數,分為導出函數和未導出函數兩種,導出函數打開IDA后能夠在導出表中找到的函數就是導出函數,未導出函數則在導出表中尋找不到,一般來說靜態編寫的native函數都能在導出表中尋找到,而動態加載的則無法在導出表中發現!!!
代碼如下:(跟上面hook java層重復的代碼不在注釋詳講了!!!)
3、最后在手機端執行frida-server,轉發端口,開啟應用,執行腳本,點擊按鈕,即可看到返回值已經被修改成了0,效果圖如下:
4.2、Hook native層返回值為String類型的demo
1、上面已經寫了怎么Hook修改native層函數返回值為int類型的情況,使用replace()
函數直接修改即可,但是返回情況為字符串則不一樣,在c語言中,返回值為字符串其實是返回了一個char *
(字符串指針),所以簡單的替換是無法取效果的,具體怎么修改返回值,接着看下面,下面還是貼上demo的關鍵代碼和未Hook前截圖:
代碼如下:
未Hook前運行截圖:
2、接下來是python Hook腳本(只解釋與上面有差異的代碼),Hook的函數具體函數名還是使用IDA去尋找
python代碼:
3、運行腳本后,點擊按鈕,我們可以看到字符串已經被替換成了tamper
,如下所示:
4、關於為導出函數的Hook,大體上差不多,差別在於需要通過ida找到偏移值計算地址,而不是像導出函數這么方便罷了,但原理都是差不多的,就不在細說了!!!