frida免root hook 1) frida gadget嵌入app
可能有的大佬并不知道 frida gadget是個啥。
這裡先看看官方對于gadget的解釋
官方連結 https://frida.re/docs/gadget/
這句英語意思大概意思是:
frida Gadget是一個動态庫,如果注入不适用于目前場景 (一般是被檢測 或者沒 root),就用程式加載這個庫來達到hook的效果。
大家好,我是王鐵頭 一個乙方安全公司搬磚的菜雞
持續更新移動安全,iot安全,編譯原理相關原創視訊文章
視訊示範:https://space.bilibili.com/430241559
frida gadget使用場景
- 免root 使用 frida
- 反調試 反root 反frida 很強,繞不過去的時候
- frida 持久化 hook
frida gadget 支援的連接配接方式
官網文檔支援的互動方式有4種
- Listen: 預設的連接配接方式, 類似frida-server那種,可以指定端口,frida -U gadget 連接配接,電腦端操作
- Connect: 我愣是沒看懂 看懂了再過來改
- Script: 直接執行注入腳本,js注入腳本要放到手機目錄
- ScriptDirectory:腳本目錄,類似全局hook, 可以用libart之類的so 加載 gadget,可以指定哪個腳本注入哪個app (沒測試)
這裡示範第3種 Script 直接執行注入腳本這種連接配接方式
後續有空會把上面的各種方式都寫一下
app一般分為有so庫和無so庫
這篇文章示範有so庫的情況
frida Gadget script腳本連接配接(有so庫) 步驟
- 下載下傳 frida gadget.so
- app so添加依賴 加入 frida gadget.so
- 配置 frida gadget 的config檔案
- 編寫注入js
- 打包新apk執行
1.下載下傳 frida gadget.so
去哪裡下載下傳呢?
當當當當
當然是全球最大同性交友網站 github
直接去frida的github倉,點選 release 找想要的版本去下載下傳就可
連結 https://github.com/frida/frida/releases
2.app so添加依賴 加入 frida gadget.so
這一步的原理就是,讓app在執行so的檔案的時候,加載frida-gadget.so
大部分so檔案,在運作的時候,都有一些依賴庫。
這一步就是把 frida gadget.so加入到apk 本身so的依賴庫中。
這一步很多大佬是用 lief實作的。
實際上實作這一步的辦法挺多的。
喜歡用ubuntu的可以安裝 patchelf 然後一行指令就搞定了
patchelf位址:https://github.com/NixOS/patchelf
patchelf --add-needed frida-gadget.so apk.so
so easy ,再也不用擔心你不會添加依賴了。
執行個體示範:
看看這裡的示例apk
wtt這個示例apk裡面有一個 so libnative-lib.so
這裡,直接給 libnative-lib.so添加frida-gadget.so 依賴庫
為了防止檢測,frida這特征也太大了,很容易被檢測 被針對
最好把這個so改個名字,比如 libcaiji.so 改名後如下圖
運作 patchelf 添加依賴庫
沒有添加依賴庫之前,依賴庫如下
搞完之後 拖進ida看一下 依賴庫,這裡可以看到多了一個依賴so
libcaiji.so 就是 frida-gadget.so改名後的so
當然這一步也可以用lief
先安裝
pip install lief
這裡 很多大佬直接給出了代碼 但是每次都得改代碼就好麻煩
我直接寫了個腳本 直接讀取指令行參數執行
import sys
import lief
str_so_apk = sys.argv[1]
str_so_gadget = sys.argv[2]
libnative = lief.parse(str_so_apk)
libnative.add_library(str_so_gadget) # Injection!
libnative.write(str_so_apk)
儲存成 inject.py
指令格式如下
python inject.py apk的so 注入的so名
執行
執行完之後看一下依賴
成功添加
3.配置 frida gadget 的config
這裡這篇文章主要是 執行腳本
關于用gadget.so執行腳本
看看官方文檔的介紹,機器翻譯還是有點問題的,湊合看吧
這裡我按照官方的示例,寫了一個配置檔案
配置檔案名 libcaiji.config.so
這裡, 注意配置檔案命名的格式,一定是你改名後的名字 + .config.so
libxxx.so
libxxx.config.so
官方文檔是這麼描述的
這裡,按照上面的格式
修改後的so名為 libcaiji.so
配置檔案的名字為: libcaiji.config.so
腳本代碼如下
{
"interaction": {
"type": "script",
"path": "/data/local/tmp/hook.js"
}
}
這裡雖然字尾名是 .so 内容其實是json配置檔案,這點要注意
4.編寫注入js
原apk的代碼如下
apk正常運作是這樣的
這裡 編寫一個注入的js
把 彈窗顯示的 aaa 改成 bbb
這裡 直接 hook com.wangtietou.no_root.MainActivity 的 aaa 方法
改下傳回值就可以了
hook代碼如下
var str_name_class = "com.wangtietou.no_root.MainActivity";
Java.perform(function()
{
var obj = Java.use(str_name_class);
obj.aaa.implementation = function ()
{
return "bbb";
}
});
寫完js 把注入腳本放到之前配置的路徑下
這裡 /data/local/tmp/hook.js 是之前配置檔案配置過的路徑
一定要寫對,不然,找不到執行的js, 怎麼hook ,涼涼
5.打包簽名新apk執行
這裡把 改名後的 frida-gadget.so 和 配置檔案放到lib目錄
再壓縮
然後簽名
就可以了
這裡沒有修改 dex檔案 也沒有修改 AndroidManifest.xml 是以并不用使用apktool重新打包
這個例子隻有一個 依賴庫架構 是 armv7a 那麼隻修改這一個架構就可以了
如果是多個架構,那就要都改 下面這個例子有2個架構 armv7 armv8
不确定運作平台的前提下 最好兩個都改了 這裡看一下前後的對比
把修改後的apk目錄 壓縮一下就可以了
搞完後 用 apktoolbox重新簽個名就ojbk了
安裝app執行 看一下效果
上面搞了這麼多,實際上還有更簡單的辦法
有大佬早就寫好了一鍵腳本
文章位址:https://bbs.pediy.com/thread-268175.htm
腳本位址:https://github.com/nszdhd1/UtilScript/
隻不過,腳本用起來不太靈活。
我準備把腳本改改,讓腳本用起來更友善。
搞完會分享給大佬們的。.
這個文章用到的所有檔案,周末會錄個視訊,然後一起發上去。
方案要注意的點
1.簽名校驗
修改apk後,簽名會發生變化,apk如果有簽名校驗的話,要繞過簽名校驗
2.hook時機
這裡導入的so 一定要在 要hook的函數執行之前導入
要不然,要hook的函數都執行完了,你的so才導入,hook個錘子
3.so架構
如果app so支援多個架構,不确定具體執行平台的話,建議每個架構都操作一波
方案優點
1.有效繞過大部分反調試 反root 反frida
在沒有root的手機上運作,反root對你而言就是不存在的
用 gadget去注入,frida的大部分特征也沒了 能繞過大部分 反調試 反frida
2.持久化hook
直接嵌入app 相當于源碼級修改 體驗很好
持續更新移動安全,iot安全,編譯原理相關原創視訊文章
視訊示範:https://space.bilibili.com/430241559
相關資料關注公衆号 回複 frida 下載下傳: