1. Frida概况
- frida 是一个 hook 框架
- 可以在不改动目标源码的情况下,动态查看函数运行入参,返回值,注入代码,更程序逻辑。
- 黑客可以用hook框架做逆向,分析和利用应用漏洞,进行非法操作。
- 开发者可以hook自己的应用进程,查看API接口入参,返回值。如果应用出现问题可以通过此方法打印信息,不需要额外增加日志,简单方便。
- hook代码使用 js 脚本实现,借助 python 执行(也可以使用C, Node.js, Swift, .NET等等)。
- 覆盖平台:Android, iOS, Windows, Linux, OSX
- 覆盖语言: c/c++, Java, Object-C
- 优势
- 覆盖平台广;
- 采用google v8 engine,较为稳定(Android 需要使用Google原生系统);
- 更新hook代码,不需要重启系统(安卓常用的xposed框架,iOS常用的Cydiasbustrate, hook插件更新,需要重启系统);
- 对于手机应用 hook,即使不 root(jailbreak),也提供了方案,其他常用的如 xposed(Android)和Cydia substrate(iOS,Android)是不行的。
2. 安装 & 环境配置
分为pc端的环境和移动端的frida-server进程(如果是用于手机端的hook)。
- PC端
install Python 3.x
pip install frida
pip install frida-tools
安装测试, 命令行执行 frida-ps,输出系统运行的所有进程及pid
- 移动端
- Android
先root, 再配置 frida-server (下载并push到/data/tmp/local, 以root权限执行, 下载地址 https://github.com/frida/frida/releases) - iOS
先 jailbreak,再从cydia下载frida插件。 - 如果没法root或越狱,可简单的修改应用,在应用初始化时,主动加载frida组件,相当于进程内部hook。详见:https://frida.re/docs/gadget/ (强烈建议设备root或越狱)
- Android
安装测试, 命令行执行 frida-ps -U,输出系统运行的所有进程及pid
3. frida 具体用法
hook最终使用 js 脚本,而脚本是通过外部环境和frida-core交互,这里使用python作为外部环境。
(a) hook脚本模板(python代码)
########################### main.py ###########################
import frida, sys, os
import traceback
def on_message(message, data):
if message['type'] == 'send':
print(message['payload'])
def hook(proc_name, target_js):
print('proc name ='+proc_name)
with open(target_js) as fin:
script_source = fin.read()
process = frida.get_usb_device().attach(proc_name)
script = process.create_script(script_source)
script.on('message', on_message)
script.load()
try:
while True:
if sys.stdin.read().strip() == 'stop':
print('Get stop signial, and going to clean frida.')
script.unload()
process.detach()
break
except Exception:
script.unload()
process.detach()
traceback.print_exc()
if __name__ == "__main__":
js_dir = os.path.dirname(os.path.realpath(__file__))
# 将 js 放入单独的文件,便于写代码,检查js语法,此外还可模块化管理脚本
target_js = os.path.join(js_dir, 'scripts', 'libc.js')
hook("processname", target_js)
########################### scripts/libc.js ###########################
try {