开始复习Frida的使用。
Android逆向-Frida
安装
在电脑上执行:
1 | pip install -U frida |
然后再从 Releases · frida/frida (github.com) 下载对应版本的frida-server
。
编译与魔改
放在另一个blog。
使用
将frida-server
放到/data/local/tmp
,chmod 777
然后执行
1 | adb push .\frida-server-16.1.4-android-arm64\frida-server |
然后在电脑上执行frida相关的工具即可,比如frida-ps
。
Frida+IDA动静态分析流程
使用 Frida + IDA 的动静态分析中,流程是这样的:
找线索 —> Frida Hook验证 —> 验证成功继续下一步 / 验证失败继续找线索
在以 Frida 为中心的逆向分析中,写hook代码是工作重心。因为本质上APP是在实体机器上动态执行的。
现成工具
根据需要可以分别放在一个新blog里面。
frida-ps
在Android设备上的frida-server
开始运行后,在电脑上执行:
1 | frida-ps -U |
即可打印手机中所有正在运行的进程。
frida-trace
用于跟踪函数,方法,Java函数等的执行。
官方提供的例子:
1 | frida-trace -i "recv*" -i "read*" twitter |
以上命令用于跟踪twitter
APP中所有调用的recv*
与read*
函数。此工具会为每一个被trace的函数生成一个Frida js脚本,用于用户继续自定义trace时执行的功能。
以下是比较有用的参数:
1 | -I MODULE, --include-module MODULE |
jnitrace
用来跟踪安卓APP中库函数调用的小工具。
一开始安装的时候一定要在管理员控制台里面。
1 | jnitrace -l libhookinunidbg.so com.example.hookinunidbg |
-I
- is used to specify the exports from a library that should be traced. This is useful for libraries where you only want to trace a small number of methods. The functions jnitrace considers exported are any functions that are directly callable from the Java side, as such, that includes methods bound using RegisterNatives. The option can be supplied multiple times. For example,-I stringFromJNI -I nativeMethod([B)V
could be used to include an export from the library calledJava_com_nativetest_MainActivity_stringFromJNI
and a method bound using RegisterNames with the signature ofnativeMethod([B)V
.
Objection
Objection的安装和简单使用 - 乔瑞 - 博客园 (cnblogs.com)
内容比较多,放在另一个blog了。
VSCode + nodejs + Frida js开发环境(过时)
(114条消息) 【原创】vscode+Frida开发环境搭建_赵庆明老师的博客-CSDN博客_frida vscode
Frida 代码自动补全_frida代码提示_移动安全星球的博客-CSDN博客
创建一个文件夹用于专门编写Frida js脚本。在里面执行:
1 | npm install @types/frida-gum |
装了这几个库即可自动提示+染色
注意,请在具有管理员权限的Powershell里面执行。同时最好为terminal设置好proxy。
里面的API Doc可能不太全,因为版本太老了。
TypeScript+Frida开发环境
[原创]FRIDA 使用经验交流分享-Android安全-看雪-安全社区|安全招聘|kanxue.com
1 | git clone https://github.com/oleavr/frida-agent-example.git |
实际上就是利用 frida-compile
编译脚本 frida-compile agent/index.ts -o _agent.js -c
。
然后用IDE打开(比如VSCode)这个文件夹,就有自动补全了。
启动实时编译
1 | npm run watch |
使用
1 | frida -U -f com.example.android --no-pause -l _agent.js |
其实主要就是自动补全。
单步调试⭐
还是有一些小缺点,只能以attach方式附加到脚本上,有的需要在APP刚刚启动时就Hook的脚本就完全没法调试了;偶尔会崩溃;
运行Frida脚本
1 | frida -l </Users/name/path/test.js> --debug --runtime=v8 <port/name> |
或者
1 | session = dev.attach(app.pid) |
启动后会回显 Inspector 正在监听 9229 默认端口
打开Chrome调试工具
打开 chrome://inspect
, 点击 Open dedicated DevTools for Node
此时 debug 已经连接,切换至 Sources
,按 Command + P
加载要调试的脚本,即可下断调试了。
利用PyCharm调试(没实验)
- 首先安装 Node.js 插件,重启
- 添加调试器
Attaching to Node.js/Chrome
,端口默认即可。Attach to
应选择Node.js < 8 started with --debug
, 下面的自动重连选项可选可不选。 - 触发断点需要在 debug 窗口切换到 script 选项卡,右键要调试的脚本,选择 Open Actual Source,在新打开的 Actual Source 窗口设置好断点后,需要再取消/启用一次所有断点作为激活,发现断点上打上对勾才真正可用了。
优缺点:
- 用 Chrome 调试支持的更为顺滑,调试脚本自动重加载,断点也能正确响应。
- 用 PyCharm 调试断点有时需要手动激活有点麻烦,纯粹是个人偏爱PyCharm 的Debug 窗口和快捷键。
- PyCharm 使用 ts 环境,调试时可以直接在 ts 文件上下断,也不需要手动激活断点,比较顺畅。
入门学习
frida-android-examples
11x256/frida-android-examples: Examples of using frida to hook android apps (github.com)
Frida hooking android part 1 - 11x256’s Infosec blog (infosec-blog.com)
进阶(未学习)
frida全流程分析-Android安全-看雪-安全社区|安全招聘|kanxue.com
在非root设备上运行
Using Frida on Android without root · Yiannis Kozyrakis ~ blog
免Root使用Frida的一种简易方案 - 简书 (jianshu.com)
[原创]非root环境下frida持久化的两种方式及脚本-Android安全-看雪-安全社区|安全招聘|kanxue.com
单独放一个blog。
Frida-gadget
主要看非root环境运行Frida
的blog。这里列一下gadget的运作方式:
Listing
:交互和frida-server
一样Script
:使用配置文件中指定的JS脚本进行交互ScriptDirectory
:和Script
一样,但可以指定多个应用和多个脚本
Listing
交互方式需要android.permission.INTERNET
权限。我们可以通过修改manifest
文件添加这个权限。不过,如果我们使用的是Script
这种交互方式就不需要这一权限。
常用脚本
lasting-yang/frida_hook_libart: Frida hook some jni functions (github.com)
bypass_ssl_example
frida_dump
frida_hook_libart
- hook_art.js:具体而言,用于跟踪指定so库中以下JNI函数的调用情况:
GetStringUTFChars
NewStringUTF
FindClass
GetMethodID
GetStaticMethodID
GetFieldID
GetStaticFieldID
RegisterNatives
- 此外还有
CallNonvirtual
与Call<>
等方法。
- hook_artmethod.js:用于Hook 实现原理是通过Hook
dlopen
,在每一个so加载完成后,都去遍历liart.so
的符号,找到其中与调用ArtMethod
有关的函数并Hook,使得每次java
或android
字符串有关联的函数被调用的时候就会打印出来。简单来说,能够检查现在在调用什么方法。 - hook_RegisterNatives.js:有的so不会直接静态导出函数,而是会通过
RegisterNatives
JNI方法动态注册导出函数。这个脚本即用于打印出so到底导出了什么玩意。
frida_replace_fun
- frida_replace_fun.js
frida_trace
- raptor_frida_android_enum.js
- raptor_frida_android_trace.js
frida_反调试
hook_commonFun
- frida_common_funs.js
改进想法
frida_hook_libart/hook_art.js
:- 使用
console.log
大量打印字符串严重拖慢了进程本身的速度,容易崩溃和卡顿。建议后面用RPC传参,直接写文件等方式。
- 使用
frida_hook_libart/hook_artmethod.js
:- 每次ArtMethod的调用都会打印stacktrace,没什么用处,应该删掉。(已完成)
- 不用
console.log
FridaContainer
这是一个整合了网上大部分Frida现成脚本的仓库。
下载使用:
1 | $ git clone https://github.com/deathmemory/FridaContainer.git |
开发实时编译:
1 | npm run watch |
安装gson
第三方JSON库:
1 | $ python setupAndroid.py |
Android文档
FridaContainer/docs/android.md at master · deathmemory/FridaContainer (github.com)
为了方便搜索,复制粘贴是我的好习惯。
JSON
1 | FCAnd.toJSONString(javaObject); |
反调试
1 | FCAnd.anti.anti_debug(); |
Trace Java methods
1 | /** |
Trace JNI
1 | FCAnd.jni.traceAllJNISimply(); |
Multi Dex Hook
1 | FCAnd.useWithDexClassLoader('com.cls.name', function (cls: Wrapper) { |
打印堆栈
1 | FCAnd.showStacks(); |
Dump Dex方法
1 | FCAnd.dump_dex_common(); |
加载自定义 ssl 证书
将证书 cert-der.crt
传到手机,然后调用下面的语句
1 | FCAnd.anti.anti_sslLoadCert("/data/local/tmp/cert-der.crt"); |
ssl unpinning
相当于 frida 版的 JustTrustMe
1 | FCAnd.anti.anti_ssl_unpinning(); |
chrome cronet bypass
1 | import {FCAnd} from "./FCAnd"; |
Hook JNI
方便的 JNI Hook
1 | FCAnd.jni.hookJNI('NewStringUTF', { |
打印 registNatives
1 | FCAnd.jni.hook_registNatives(); |
该功能拆分出了一个独立模块,使用频率高的朋友可以使用独立模块 地址:https://github.com/deathmemory/fridaRegstNtv
动态加载 dex
在利用 InMemoryDexClassLoader 加载内存 Dex 找不到类的情况下适用。
1 | FCAnd.anti.anti_InMemoryDexClassLoader(function(){ |
其它
- 根据地址获取所在 module 的信息
- 获取模块地址
- 获取 LR 寄存器值
- 现成的 Hook url/json/map …
Frida Dynamic Hooking
Java.use
必须用在已经加载好的类上面,否则会报错。这个项目提供了一个基于callback实现动态加载Java类的方法JavaUseOnceLoaded
。
具体而言,先Hook了ClassLoader
的loadClass
方法,对它进行了监视,如果传入里面需要加载的类名是用户想要Hook的类,那么就会通过ClassLoader生成出一个类示例,然后进行Hook。
Frida CodeShare
fridaUiTools
dqzg12300/fridaUiTools: frida工具的缝合怪 (github.com)
strongR-frida-android⭐
hzzheyang/strongR-frida-android: An anti detection version frida-server for android. (github.com)
Patchs/strongR-frida/frida-core at master · hluwa/Patchs (github.com)
这是一个将frida源码进行patch魔改,实现掩盖frida特征的一个项目。
可以偷懒直接下载它提供的release,但也最好自己试试魔改。
Stalker
[原创] sktrace:基于 Frida Stalker 的 trace 工具-Android安全-看雪-安全社区|安全招聘|kanxue.com
Stalker | Frida • A world-class dynamic instrumentation toolkit
Anatomy of a code tracer | by Ole André Vadla Ravnås | Medium
单独放一个Blog吧。感觉有不少好玩的东西。
其他
Introduction — QBDI 0.10.0 documentation
参考
11x256’s Infosec blog (infosec-blog.com)
全!Frida 入门全教程 - 知乎 (zhihu.com)
[原创]FRIDA 使用经验交流分享-Android安全-看雪-安全社区|安全招聘|kanxue.com
frida学习笔记3–hook so中的方法 - 『移动安全区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
Frida-跨平台注入工具基础篇 - 瘦蛟舞 (seebug.org)
FridaContainer/docs/android.md at master · deathmemory/FridaContainer (github.com)
[原创]介召几个frida在安卓逆向中使用的脚本以及延时Hook手法-Android安全-看雪-安全社区|安全招聘|kanxue.com
- 本文作者: Taardis
- 本文链接: https://taardisaa.github.io/2023/09/03/Android逆向-Frida/
- 版权声明: 本博客所有文章除特别声明外,均采用 Apache License 2.0 许可协议。转载请注明出处!