Featured image of post Frida

Frida

frida基础知识

基础命令

1.frida-ps -U 查看当前手机运行的进程

2.frida-ps --help 查看help指令

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
frida-ps --help
使用方式: frida-ps [选项]

选项:
  -h, --help            显示帮助信息并退出
  -D ID, --device ID    连接到具有给定ID的设备
  -U, --usb             连接到USB设备
  -R, --remote          连接到远程frida-server
  -H HOST, --host HOST  连接到HOST上的远程frida-server
  --certificate CERTIFICATE
                        与HOST进行TLS通信,期望的CERTIFICATE
  --origin ORIGIN       连接到设置了"Origin"头为ORIGIN的远程服务器
  --token TOKEN         使用TOKEN验证HOST
  --keepalive-interval INTERVAL
                        设置心跳包间隔(秒),或设置为0以禁用(默认为-1,根据传输方式自动选择)
  --p2p                 与目标建立点对点连接
  --stun-server ADDRESS
                        设置与--p2p一起使用的STUN服务器地址
  --relay address,username,password,turn-{udp,tcp,tls}
                        添加与--p2p一起使用的中继
  -O FILE, --options-file FILE
                        包含额外命令行选项的文本文件
  --version             显示程序版本号并退出
  -a, --applications    只列出应用程序
  -i, --installed       包括所有已安装的应用程序
  -j, --json            以JSON格式输出结果
  1. 操作模式 CLI模式:通过命令行直接将JavaScript脚本注入进程中。 RPC模式:使用Python进行JavaScript脚本的注入,适合复杂数据处理。

4.注入模式与启动命令

  • Spawn模式

将启动App的权利交由Frida来控制,即使目标App已经启动,在使用Frida注入程序时还是会重新启动App

当需要监控App从启动开始的所有行为时使用 frida -U -f 进程名 -l hook.js 进程名可以通过frida-ps -U来查看

  • Attach模式

在目标App已经启动的情况下,Frida通过ptrace注入程序从而执行Hook的操作

frida -U 进程名 -l hook.js 在App已经启动,或者我们只关心特定时刻或特定功能的行为时使用

5.基础语法 Java.use(className):获取指定的Java类并使其在JavaScript代码中可用。 Java.perform(callback):确保回调函数在Java的主线程上执行。 Java.choose(className, callbacks):枚举指定类的所有实例。 Java.cast(obj, cls):将一个Java对象转换成另一个Java类的实例。

6.日志输出 console.log():直接在命令行输出日志。 send():将日志发送到外部Python脚本进行处理。

  • 日志捕获 D:表示级别 “zj2595"这个是标签

Frida常用API

1. Hook普通方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
//定义一个名为hookTest1的函数
function hookTest1(){
        //获取一个名为"类名"的Java类,并将其实例赋值给JavaScript变量utils
    var utils = Java.use("类名");
    //修改"类名"的"method"方法的实现。这个新的实现会接收两个参数(a和b)
    utils.method.implementation = function(a, b){
            //将参数a和b的值改为123和456。
        a = 123;
        b = 456;
        //调用修改过的"method"方法,并将返回值存储在`retval`变量中
        var retval = this.method(a, b);
        //在控制台上打印参数a,b的值以及"method"方法的返回值
        console.log(a, b, retval);
        //返回"method"方法的返回值
        return retval;
    }
}

2. Hook重载参数

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
// .overload()
// .overload('自定义参数')
// .overload('int')
function hookTest2(){
    var utils = Java.use("com.zj.wuaipojie.Demo");
    //overload定义重载函数,根据函数的参数类型填
    utils.Inner.overload('com.zj.wuaipojie.Demo$Animal','java.lang.String').implementation = function(ab){
        b = "aaaaaaaaaa";
        this.Inner(a,b);
        console.log(b);
    }
}

3. Hook构造函数

1
2
3
4
5
6
7
8
9
function hookTest3(){
    var utils = Java.use("com.zj.wuaipojie.Demo");
    //修改类的构造函数的实现,$init表示构造函数
    utils.$init.overload('java.lang.String').implementation = function(str){
        console.log(str);
        str = "52";
        this.$init(str);
    }
}

4. Hook字段

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
function hookTest5(){
    Java.perform(function(){
        //静态字段的修改
        var utils = Java.use("com.zj.wuaipojie.Demo");
        //修改类的静态字段"flag"的值
        utils.staticField.value = "我是被修改的静态变量";
        console.log(utils.staticField.value);
        //非静态字段的修改
        //使用`Java.choose()`枚举类的所有实例
        Java.choose("com.zj.wuaipojie.Demo", {
            onMatch: function(obj){
                    //修改实例的非静态字段"_privateInt"的值为"123456",并修改非静态字段"privateInt"的值为9999。
                obj._privateInt.value = "123456"; //字段名与函数名相同 前面加个下划线
                obj.privateInt.value = 9999;
            },
            onComplete: function(){

            }
        });
    });

}

5. 枚举所有类与方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
function hookTest7() {
    Java.perform(function () {
        Java.enumerateLoadedClasses({
            onMatch: function (name) {
                console.log(name);
            },
            onComplete: function () {}
        });
    });
}
Licensed under CC BY-NC-SA 4.0
前途似海,来日方长。

<