前言
多种姿势花样使用Frida注入是怎么回事呢?Frida相信大家都很熟悉,但是多种姿势花样使用Frida注入是怎么回事呢,下面就让小编带大家一起了解吧。 多种姿势花样使用Frida注入,其实就是用不止一种方式注入Frida,大家可能会很惊讶Frida为什么要用多种方式注入?但事实就是这样,小编也感到非常惊讶。 这就是关于多种姿势花样使用Frida注入的事情了,大家有什么想法呢,欢迎在评论区告诉小编一起讨论哦!
在实战中使用Frida会遇到各种各样的问题来对你进行限制,因此在这里总结和对比一下自己在实战中使用过的一些frida的注入方式。关于注入方式的归纳在sandhook的文档中有一小段提到过,本文主要讲下如何将这些方式真正的应用到Frida上。
方式一:直接使用
思路:
开启root后将frida-server push到手机并启动,然后使用frida -U
命令连接。这是最简单而普遍的方式,网上的Frida教程基本上都是这么教的没啥好说的,能够满足大部分app的hook需求,容易被检测。
具体操作:
- 手机root(部分可参考附录)
- 下载手机对应架构的frida-server,一般选择android-arm64
- 将下载好的frida-server解压后改名(以防检测)为fs或其他名字,push到手机data/local/tmp目录
- 修改frida-server权限,chmod 777 fs
- 直接运行或者修改端口运行(以防检测),改端口使用命令./fs -l 0.0.0.0:12345
- 若未改端口,使用frida -U命令连接;若修改端口,先进行端口转发adb forward tcp:12345 tcp:12345,然后使用命令frida -H 127.0.0.1:12345连接
- 遇到无法attach目标进程时尝试使用-f参数spawn一个进程
优点:
- 简单
- 可应对大部分app
缺点:
- 需要root
- 容易被检测
适用场景: 适用大部分场景,在手机已root的情况下可以优先使用这种方式尝试hook,如果失败则根据具体情况选择下面提到的其他方式。
方式二:重打包
思路: 将apk解包后通过修改smali或者patch so的方式植入frida-gadget,然后重打包安装,能够达到无root的情况下对单个进程hook效果。
具体操作:
- 修改smali:在app入口处(一般是MainActivity或者Application的静态代码区)添加System.loadLibrary(“frida-gadget”),然后在apk的lib目录添加libfrida-gadget.so(最好改下名字)
- patch so:取出lib目录中确定会被app加载的一个so文件,最好是没加密和混淆过的,使用lief进行patch,然后替换原来的so文件,并加入frida-gadget,具体patch方式参考附录。
- 签名绕过,自行分析,可能难度较大
- 使用工具:可以使用objection patchapk一键完成重打包,原理是修改smali,但无法绕过签名校验。也可以使用ratel重打包工具手动完成。ratel平头哥是一个重打包沙箱,自带sandhook和签名校验绕过,可以配合使用让ratel将frida-gadget注入进去,当然也可以直接使用自带的sandhook。
优点:
- 能在未root的手机中使用,所以能够绕过root检测
- 无需ptrace,能绕过一些ptrace自身的保护
缺点:
- 要绕过签名校验,这很难,特别是大厂app
适用场景:
- 如果能绕过签名校验的话,重打包的方式还是比较推荐的,如果app的签名校验很弱或者根本没有签名校验,使用重打包的方式是不错的选择
方式三:Patch SO
思路: Patch SO可以用在重打包的方式中,也可以单独拿出来用。重打包的方式不介绍了,这里讲另一种方式。由于无法绕过签名校验,所以可以patch /data/app/pkgname/lib/arm64(or arm)目录下的so文件,apk安装后会将so文件解压到该目录并在运行时加载,修改该目录下的文件不会触发签名校验。 Patch SO的原理可以参考Android平台感染ELF文件实现模块注入
具体操作:
- 根据手机架构,从apk中提取待patch的so文件
- 安装并使用lief,能很方便的patch so文件,为其添加frida-gadget的依赖
- 替换lib目录下的so文件并加入frida-gadget,这里可以使用临时root或twrp的方式完成,具体请参考附录
优点:
- 可以绕过签名校验
- 可以绕过root检测
- 可以绕过部分ptrace自身的保护
缺点:
- 需要解bl锁,部分极端app可能会检测bl锁
- 高版本系统下,当manifest中的android:extractNativeLibs为false时,lib目录文件可能不会被加载,而是直接映射apk中的so文件
适用场景:
- 当遇到一个app有root检测和签名校验而无法轻松绕过时,可以尝试这种方式,前提是app没有检测bl锁,如果检测了bl锁且无法绕过,还是直接放弃这个方案吧。部分app可能存在so文件被patch,或者加载了frida-gadget后被检测的情况,具体原因还需单独分析。
方式四:编译系统
自己编译系统,修改系统源码,将frida-gadget集成到系统中,使得app在启动时首先动态加载frida-gadget。我们其实能直接修改系统源码来影响app的动态执行过程,且不引入frida特征,但是集成frida的优势在于能够hook app自身的代码,且修改hook点较为方便。
优点:
- 无需root
- 可回锁bl锁
- 无需绕过签名校验
缺点:
- 编译系统比较麻烦
- 自己编译系统极易被风控检测,有时即使不嵌入frida也无法正常运行app,或触发其敏感功能
适用场景:
- 以上三种方式均失效,而app能在aosp或lineage系统中正常运行时,可以考虑这种方式(也是孤注一掷了)。
总结
在实战中可以根据app自身的保护情况来选择合适的方式来注入,前提是app没有针对frida。以上情况并不一定都能百分之百成功,不同app可能会有自己独特的保护方式。
附录
lief代码示例
lief的API具体参考lief官方文档
代码语言:javascript复制#!/usr/bin/env python3
import lief
libnative = lief.parse("path of ELF source")
libnative.add_library("libfg.so") # frida-gadget的so文件名,最好改个名字防检测
libnative.write("path of patched ELF output")
frida-gadget的使用
frida-gadget一般要配合一个config文件来使用,frida-gadget在被加载后会去读取自身所在目录下的配置文件,配置文件必须以一定的格式命名,例如:frida-gadget的名称为libfg.so,那么配置文件的名称则必须时libfg.config.so,否则该配置文件不会被读取。当没有读取到配置文件时,frida-gadget会使用默认配置。 配置文件的编写,我个人常用以下配置
代码语言:javascript复制{
"interaction": {
"type": "listen",
"address": "127.0.0.1",
"port": 27042,
"on_load": "resume"
}
}
默认配置是
代码语言:javascript复制{
"interaction": {
"type": "listen",
"address": "127.0.0.1",
"port": 27042,
"on_port_conflict": "fail",
"on_load": "wait"
}
}
连接时要使用frida -U gadget而不是frida -U pkgname。具体参考frida-gadget官方文档
临时root和twrp的方式修改系统目录
为了在避免被root检测的前提下修改系统目录,我们可以采取临时root或使用twrp的方式。
临时root的方式
- 提取系统boot.img,可以从刷机包中提取,也有其他方式自行百度
- 安装magisk manage app
- 使用magisk manage app对boot.img进行patch
- 将patch后的img拷贝到PC
- 手机连接PC,使用adb reboot bootloader,进入bootloader
- 使用fastboot boot boot_patch.img启动手机
- adb shell后输入su检查是否已获取root
- 完成系统修改后重启则root权限清除
使用twrp的方式
- 下载twrp.img
- 手机连接PC,使用adb reboot bootloader,进入bootloader
- 使用fastboot boot twrp.img启动手机,进入twrp
- 若有必要,挂载system分区和其他用得上的分区
- 此时adb shell即为root权限
- 修改完成后重启
建议使用twrp这种方式,相对简单,而且能够修改system分区,顺便一提这个技巧的还有一个应用是能够在无root的情况下将证书安装到系统目录下。