Frida脚本

Frida脚本就是 利用Frida动态插桩框架,
使用Frida导出的 Api和方法,对 内存空间里的对象方法 进行 监控、修改和替换
的一段代码
Frida的Api是用 JavaScript实现的,
所以可以充分利用 JavaScript的匿名函数的优势 以及 大量的Hook钩子函数 和 回调函数的 Api
  • 1.在手机上使用Frida-Server运行起来

    • 查看当前运行的App

      frida-ps -U

  • 2.Hook基础

    import frida
    import sys
    
    # 获取手机设备
    rdev = frida.get_remote_device()
    # 通过attach模式注入app
    session = rdev.attach("com.zdwh.wwdz")
    
    scr = """
    function main(){
        console.log('Frida script loads success.');
        // Java.perform 将脚本的内容注入到Java运行库中
        Java.perform(function () {
            // Java.user() 传入需要Hook的方法所在的类的类名(字符串类型)
            // 为Java类动态获取一个JavaScript Wrapper,通俗的理解为一个JavaScript对象
            let b = Java.use("com.zdwh.wwdz.wwdznet.l.b");
            // implementation 表示实现了b类的a方法,"=" 后面跟着匿名函数,
            // 通过this.a()重新执行原方法,前后可以console.log()输出处理前后的参数值
            b.a.implementation = function(){
                var result = this.a();
                console.log(result);
                return result;
            }
        });
    }
    setTimeout(main, 0);  // 等同于setImmediate 立即执行
    """
    script = session.create_script(scr)
    script.load()
    sys.stdin.read()
    
  • 3.Java层主动调用

    强制调用一个方法去执行
    Java中包括静态方法、实例方法
    1. 静态方法,直接使用Java.use() 找到类直接调用(static 修饰的方法)
    2. 实例方法, 直接使用Java.choose() 在Java的堆中找到类的实例去调用方法
    
    • 静态方法的主动调用

      Java.perform(function () {
          let b = Java.use("com.zdwh.wwdz.wwdznet.l.b");
          b.a();
      });
      
    • 实例方法的主动调用

      Java.perform(function () {
          Java.choose('com.zdwh.wwdz.wwdznet.l.b', {
              onMatch: function(instance){
                  console.log('找到实例:', instance);
                  instance.a();
              },
              onComplete: function(){
                  console.log('完成实例方法的调用');
              }
          });
      });
      
  • 4.重载传参,以及输出Map类型数据

    可以overload Java的类型参数,或者自定义的Java类型

    Java.perform(function () {
        var b = Java.use("b.j.a.a.c.a");
        b.a.overload("java.util.Map", "java.lang.String").implementation = function(map, str){
    
            var Map = Java.use('java.util.HashMap');
            var map_x = Java.cast(map, Map);
            send(map_x.toString());
            console.log(str)
            return this.a(map,str);
        }
    });
    
  • 5.RPC调用

    导出方法供外部调用,参考:https://www.cnblogs.com/pymkl/articles/16333598.html

posted on 2022-06-12 21:44  _tiny_coder  阅读(504)  评论(1编辑  收藏  举报