[Android 逆向整理笔记] Frida
妈的终于考过科目三了👼
Frida 好大一坨,而且在写 Native 层 Hook 的时候突然发现好像 so 层的玩意也得整理一下...
以及在查资料的时候才发现,原来新版本的 jadx-gui 已经可以一键复制出对应函数的 frida 和 xposed 片段了,于是火速更新了 jadx-gui
1|0简介
Frida 是一个用于在运行时分析、修改和控制应用程序的开源插桩工具,可以用于 Android、Linux、Windows、IOS 等平台上,Frida 分为两部分,服务端运行在目标机上,通过注入进程的方式来实现劫持应用函数,另一部分运行在自己操作的主机上。
Xposed 是基于 zygote 的,frida 则是基于 ptrace。frida 用 ptrace 跟踪目标进程,然后在目标进程中找到存放 frida-agent 的空间,剩下的操作就由 frida-agent 来实现了。
2|0常用 Hook 方法 (Java 层)
记一下,frida-server 默认端口是 27042,adb 抓日志用 logcat |grep "D.filter",D 是级别,filter 是标签
2|1基本 API
API名称 | 描述 |
---|---|
Java.use(className) |
获取指定的 Java 类并使其在 JavaScript 代码中可用。 |
Java.perform(callback) |
确保回调函数在 Java 的主线程上执行。 |
Java.choose(className, callbacks) |
枚举指定类的所有实例。 |
Java.cast(obj, cls) |
将一个 Java 对象转换成另一个 Java 类的实例。 |
Java.enumerateLoadedClasses(callbacks) |
枚举进程中已经加载的所有 Java 类。 |
Java.enumerateClassLoaders(callbacks) |
枚举进程中存在的所有 Java 类加载器。 |
Java.enumerateMethods(targetClassMethod) |
枚举指定类的所有方法。 |
这里的用法感觉和 Xposed 差不多
板子
2|2基本的 Hook
套之前那个板子改就行
然后先 frida-ps -U 找目标进程名,再 frida -U [进程名] -l hook.js 即可,记得先开个 cmd 把 frida-server 启动着
这里启动脚本有两种方法
Spawn 方法:frida -U -f [进程名] -l hook.js
Attach 方法:frida -U [进程名] -l hook.js
Spawn 方法会让 Frida 决定进程的启动,就算目标进程启动了也会重启
Attach 方法就是目标进程已经启动的时候再用 ptrace 注入从而实现 Hook
2|3重载参数
如果有多个同名方法时使用,例如我们目标的方法重名了,但是其参数类型是独特的,只有一个 String 类型的参数,就可以像下面这样写
如果是一个复杂的自定义参数类型,我们可以去 smail 里面找这个参数的类型,就先搜方法名然后把参数类型抄上去完事,如下
其实这个 java.lang.String 如果记不住也是可以去 smail 里面抄下来的
当然如果你懒的话,也不用去 smail 找什么参数类型,直接写个 java.lang.String 在里面, Frida 报错的时候会把参数名给你写出来的,复制粘贴即可(
2|4Hook 构造函数
和前面一个意思,多个 $init 表示这个 Hook 的是构造函数,记得重载,因为可能同时有有参和无参构造函数存在
还是假设就一个 String 参数
2|5Hook 变量
分为静态和非静态两种情况
如果是静态的话
如果是非静态的话,得枚举一下
但是可能会有奇怪的问题,写的时候最好写成反射的,不然可能改不上
2|6Hook 内部类
整理的时候发现 Frida 的 hook 很多语法都和 Xposed 差不多,比如这个也是加个 $内部类名 完事
2|7主动调用方法
静态方法
非静态和上面变量的方法差不多
3|0常用 Hook 方法 (Native 层)
so 层有些东西其实还是能用 java 层的方法来进行 Hook,比如说 JNI 的静态注册之类的,不一定非要用传统的 so 层的 API
3|1Hook 导出函数
根据导出函数名来找到地址,然后根据地址来进行操作
额外举个栗子,如果我们遇到一个 JNI 函数 TestFunc,他的参数是 TestFunc(JNIEnv *a1, jclass a2, jstring a3),这个参数类型就很特殊,那我们想要 Hook 就这样写
3|2遍历导入导出函数
其实没啥 b 用,ida 全能看见,但万一用上了呢
3|3Hook 未导出函数
首先得知道咋获取 .so 的基址
其实你会发现三种方法都能获取到 .so 的基址,都是一个值
一般 32 位安卓是 thumb 指令,64 位是 arm,thumb 的话还得在偏移那额外 +1
3|4Hook dlopen
dlopen 主要是加载库文件用的,有的 app 在 dlopen 里面藏东西,其加载的时间非常早,而且只加载一次,可能稍不注意就给漏掉了
源码如下
这时候我们要对 dlopen 进行 hook,一旦检测到目标的 .so 文件被加载就,就立马跳转到我们对 .so 的 hook 中去
常用的就这些,这次主要是整理了一下怎么去 Hook,至于 rpc 和反检测啥的再议吧,摸了
__EOF__
作 者:iPlayForSG
出 处:https://www.cnblogs.com/Here-is-SG/p/18370038
关于博主:编程路上的小学生,热爱技术,喜欢专研。评论和私信会在第一时间回复。或者直接私信我。
版权声明:署名 - 非商业性使用 - 禁止演绎,协议普通文本 | 协议法律文本。
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人