Frida使用过程记录

欢迎转载,转载请注明出处!原文地址

Follow me on GitHub ^_^

使用环境Ubuntu16.04 with Python3.5 / Win7 with Python3.6
官方文档 - https://www.frida.re/docs/
练习代码 - https://github.com/KevinsBobo/frida_usage_record

1. 安装

需要通过sudo easy_install3 -i http://pypi.douban.com/simple/ Frida安装;不知道为什么pip安装一直卡在运行setup.py那里

2. 安装完成测试

linux 在以普通用户身份运行脚本前需要执行这条命令:sudo sysctl kernel.yama.ptrace_scope=0(该命令的作用是临时的),否则必须通过root身份运行,这样不便于后期脚本的调试

命令 frida-trace -i "recv*" -i "read*" *calc*

3. 官方例子Examples-Windows练习

https://www.frida.re/docs/examples/windows/
这是一个在目标进程中寻找jvm.dll的模块地址的例子,所以被注入的进程应该是个java开发的程序,例如eclipsexmind

发现JavaScript的注入代码是作为字符串传递给python API的,所以最好单独建立.js文件来写注入代码来获得语法高亮和补全,但对于FridaJavaScript API是没有高亮和补全的,这点比较令人难受

独立.js脚本使用方法

import codecs
import frida

session = frida.attach('xxx`)
with codecs.open('./xxx.js', 'r', 'utf-8') as f:
    source = f.read()

script = session.create_script(source)

...

4. 文档Basic Usage练习

frida/invincible.py
https://github.com/KevinsBobo/frida_usage_record/blob/master/frida/invincible.py

'''
example: 修改game.exe为无敌模式
'''

# python2 需要引入下面的这个包
# from __future__ import print_function
import frida
import sys

def main(target_process):
    # 获取进程会话\打开进程句柄
    session = frida.attach(target_process)

    # 实验代码

    # 枚举进程模块
    print(session.enumerate_modules())
    # 枚举内存范围
    print(session.enumerate_ranges('rw-'))
    # 读内存 read_bytes(address, bytes)
    print(hex(session.read_bytes(0x00403616, 1)[0]))
    # 写内存 write_bytes(address, data)
    # 错误 frida.core.RPCException: Error: access violation accessing 0x403616
    # 用 js 脚本的方式写内存也是同样地错误
    # 但 js 脚本在写内存前调用 Memory.protect(ptr("0x00403616"), 8, 'rw-'); 就没问题
    # 而 py 脚本没有这个 API
    session.write_bytes(0x00403616, b'0xeb')    

    with codecs.open('./invincible.js', 'r', 'utf-8') as f:
        source = f.read()

    script = session.create_script(source)
    script.on('message', on_message)
    script.load()
    session.detach()


if __name__ == '__main__':
    # 进程PID或进程名
    target_process = 'game.exe'
    main(target_process)

API

Python

Python API 较为简单,重点是和JavaScript通信的消息回调

JavaScript

对进程的主要操作都在js脚本中

调用函数:

小总结

Tools

frida CLI

frida命令行工具,在这里可以执行所有JavaScript API并且会有提示和补全

# 打开进程
# win
> frida *calc*
# linux
$ frida '*calc*'

# 打开进程并加载js代码
# win
> frida -l xxx.js *calc*
# linux
$ frida -l xxx.js '*calc*'

frida-trace

动态跟踪API调用

# Trace recv* and send* APIs in Safari
$ frida-trace -i "recv*" -i "send*" Safari

# Trace ObjC method calls in Safari
$ frida-trace -m "-[NSView drawRect:]" Safari

# Launch SnapChat on your iPhone and trace crypto API calls
$ frida-trace -U -f com.toyopagroup.picaboo -I "libcommonCrypto*"

frida-discover

用于发现程序内部函数 - 对于没有逆向经验的来说是好东西

$ frida-discover -n name
$ frida-discover -p pid

在linux下一开起程序进程就被终止了:segmentation fault (core dumped)(分段故障)

在win下只分析到了线程数量(有可能是分析时间太短);分析期间目标程序非常卡,并且无法正常停止分析,除非关闭目标进程

所以这个工具应该是用于分析移动端的