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安全,编译原理相关原创视频文章
相关资料关注公众号回复 关键字 frida 进行下载