真是惭愧2024年12月12日了,才开始了解frida,是个好东西。

  1. 安装

    pip install frida-tools
    #看手机类型
    adb shell
    getprop ro.product.cpu.abi
  2. 下载到手机上frida-server-16.5.7-android-arm64,对应相应的版本

    直接adb推过去。
    adb push frida-server /data/local/tmp/`

  3. 解压后,拷贝到手机/data/local/tmp里,改权限777,然后启动fr服务器

    adb shell
    $ su
    cd /data/local/tmp
    ./fr
    查看手机上frida的版本
    ./fr16 --version

    在电脑上新开一个cmd,运行frida-ps -U命令,可看到手机中的进程。

  4. 在开一个终端,frida -U 进程名 -l hook.js
    我的天,时时显示啊,修改完hook直接就有效了,还不用重启。
  5. 一些基本api

    Hook框架模板
     复制代码 隐藏代码
    function main(){
     Java.perform(function(){
         hookTest1();
     });
    }
    setImmediate(main);
    Frida常用API
    1.Hook普通方法、打印参数和修改返回值
     复制代码 隐藏代码
    //定义一个名为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重载参数
     复制代码 隐藏代码
    // .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(a,b){
         b = "aaaaaaaaaa";
         this.Inner(a,b);
         console.log(b);
     }
    }
    3.Hook构造函数
     复制代码 隐藏代码
    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字段
     复制代码 隐藏代码
    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.Hook内部类
     复制代码 隐藏代码
    function hookTest6(){
     Java.perform(function(){
         //内部类
         var innerClass = Java.use("com.zj.wuaipojie.Demo$innerClass");
         console.log(innerClass);
         innerClass.$init.implementation = function(){
             console.log("eeeeeeee");
         }
    
     });
    }
    6.枚举所有的类与类的所有方法
     复制代码 隐藏代码
    function hookTest7(){
     Java.perform(function(){
         //枚举所有的类与类的所有方法,异步枚举
         Java.enumerateLoadedClasses({
             onMatch: function(name,handle){
                     //过滤类名
                 if(name.indexOf("com.zj.wuaipojie.Demo") !=-1){
                     console.log(name);
                     var clazz =Java.use(name);
                     console.log(clazz);
                     var methods = clazz.class.getDeclaredMethods();
                     console.log(methods);
                 }
             },
             onComplete: function(){}
         })
     })
    }
    7.枚举所有方法
     复制代码 隐藏代码
    function hookTest8(){
     Java.perform(function(){
         var Demo = Java.use("com.zj.wuaipojie.Demo");
         //getDeclaredMethods枚举所有方法
         var methods =Demo.class.getDeclaredMethods();
         for(var j=0; j < methods.length; j++){
             var methodName = methods[j].getName();
             console.log(methodName);
             for(var k=0; k<Demo[methodName].overloads.length;k++){
                 Demo[methodName].overloads[k].implementation = function(){
                     for(var i=0;i<arguments.length;i++){
                         console.log(arguments[i]);
                     }
                     return this[methodName].apply(this,arguments);
                 }
             }
         }
     })
    }
    8.主动调用
    静态方法
    
     复制代码 隐藏代码
    var ClassName=Java.use("com.zj.wuaipojie.Demo"); 
    ClassName.privateFunc("传参");
    非静态方法
    
     复制代码 隐藏代码
     var ret = null;
     Java.perform(function () {
         Java.choose("com.zj.wuaipojie.Demo",{    //要hook的类
             onMatch:function(instance){
                 ret=instance.privateFunc("aaaaaaa"); //要hook的方法
             },
             onComplete:function(){
                     //console.log("result: " + ret);
             }
         });
     })
     //return ret;

    太神奇了。

标签: none

添加新评论