frida学习--01:安装与简单使用

frida安装

推荐安装以下版本

pip install frida==14.2.18
pip install frida-tools==9.2.5
pip install objection==1.8.4

frida-server安装

  1. 安装的frida版本:需要下载与安装的frida版本对应的frida-server,否则会出错

    C:\Users\Administrator>frida --version

    12.2.25

  2. 手机设备的架构
    https://github.com/frida/frida/releases 中获取对应安装版本的 frida-server

# 先查看设备平台,然后在官网下载对应 server 版本
adb shell getprop ro.product.cpu.abi    # 查看设备CPU

# 获取架构信息后,再与安装的Frida版本结合,便可前去Github下载
# 其Frida-server文件命名格式如下:
# frida-server-<Frida版本>-android-<设备架构版本>.xz
# 下载完毕之后,解压后通过adb push到设备的临时目录下

adb push [电脑端frida-server路径] /data/local/tmp/fs
adb shell
su
cd /data/local/tmp
chmod 777 fs				# 文件权限修改
./fs						    # 启动frida-server
./fs -l 0.0.0.0:8888		# 监听端口就这样启动

  1. 启动frida服务并连接

    然后 进行端口转发
    adb forward tcp:27042 tcp:27042
    adb forward tcp:27043 tcp:27043

  2. 完毕后,可以在windows上运行简单的frida命令测试我们是否安装成功了
    frida-ps -U

frida 使用

  1. 代码内置在python文件中

    
    # -*- coding: UTF-8 -*-
    import frida,sys
    
    js_code = '''
    	Java.perform(function(){
    		console.log("Frida Test");
    		var cls = Java.use("cn.gemini.k.fridatest.FridaHook1");
    		cls.func1_add.implementation = function(arg1,arg2){
    			console.log("hook arg1:",arg1," hook arg2:",arg2);
    			return this.func1_add(arg1,arg2);
    		}
    	});
    '''
    
    # 目标包名
    appPacknName = "cn.gemini.k.fridatest"
    scriptFile = "hook_script.js"
    
    # 输出日志的回调方法
    def on_message(message, data):
    	if message['type'] == 'send':
    		print("[*] {0}".format(message['payload']))
    	else:
    		print(message)
    
    device = frida.get_usb_device()
    # spawn模式,找到目标包名并重启,在启动前注入脚本
    pid = device.spawn([appPacknName])
    session = device.attach(pid)
    # 注意这里需要将device.attach(pid)这句代码写在前面,这样执行才符合预期(启动时程序白屏,等待下面这行代码来恢复执行)
    # 其实在https://www.jianshu.com/p/b833fba1bffe这篇文章中有提到
    device.resume(pid)
    
    # 方式一: 通过js文件创建hook代码
    #with open(scriptFile, encoding='UTF-8') as f :
    #    script = session.create_script(f.read())
    # 方式二: 直接将hook代码写在python文件中
    script = session.create_script(js_code)
    
    script.on('message', on_message)
    script.load()   #把js代码注入到目标应用中
    # 避免结束
    sys.stdin.read()
    
    
  2. 封装js文件
    hook_script.js代码如下

    function main(){
    	Java.perform(function(){
    		console.log("Frida Test");
    		var cls = Java.use("cn.gemini.k.fridatest.FridaHook1");
    		cls.func1_add.implementation = function(arg1,arg2){
    			console.log("hook arg1:",arg1," hook arg2:",arg2);
    			return this.func1_add(arg1,arg2);
    		}
    	});
    }
    setImmediate(main)
    
    

    load2.py代码如下

    # -*- coding: UTF-8 -*-
    import frida,sys
    
    # 目标包名
    appPacknName = "cn.gemini.k.fridatest"
    scriptFile = "hook_script.js"
    
    # 输出日志的回调方法
    def on_message(message, data):
    	if message['type'] == 'send':
    		print("[*] {0}".format(message['payload']))
    	else:
    		print(message)
    
    device = frida.get_usb_device()
    # spawn模式,找到目标包名并重启,在启动前注入脚本
    pid = device.spawn([appPacknName])
    session = device.attach(pid)
    # 注意这里需要将device.attach(pid)这句代码写在前面,这样执行才符合预期(启动时程序白屏,等待下面这行代码来恢复执行)
    # 其实在https://www.jianshu.com/p/b833fba1bffe这篇文章中有提到
    device.resume(pid)
    
    # 方式一: 通过js文件创建hook代码
    with open(scriptFile, encoding='UTF-8') as f :
    	script = session.create_script(f.read())
    # 方式二: 直接将hook代码写在python文件中
    # script = session.create_script(js_code)
    
    script.on("message", on_message)
    script.load()   #把js代码注入到目标应用中
    # 避免结束
    sys.stdin.read()
    

    运行结果如下

    // frida打印日志
    λ python load2.py
    Frida Test
    hook arg1: 1  hook arg2: 2
    
    // APP程序执行打印日志
    19493-19493/cn.gemini.k.fridatest E/func1_add: arg1:1 arg2:2
    19493-19493/cn.gemini.k.fridatest E/FridaHook1: 一般方法 ret:3
    
    
posted @ 2024-06-13 16:17  关外故人  阅读(373)  评论(0)    收藏  举报