Hook框架frida,让逆向更简单

frida简介

Frida 是一款基于 Python + JavaScript 的 Hook 与调试框架。
Firda 是一款易用的跨平 Hook 工具, Java 层到 Native 层的 Hook 无所不能,是一种 动态的插桩工具,可以插入代码到原生 App 的内存空间中,动态的去监视和修改行为,原生平台包括Win、Mac、Linux、Android、iOS 全平台。

下面的操作使用python3.7.9+frida16.0.1+frida-tools12.0.1

安装frida【PC】

pip install frida==16.0.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装frida-tools【PC】

pip install frida-tools==12.0.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

frida-server【手机端】

  1. 查看CPU架构

    adb shell getprop ro.product.cpu.abi
    
  2. 下载frida-server
    frida-server-github地址
    按照架构类型进行选择下载
    在这里插入图片描述

  3. 上传到手机
    下载的是一个压缩包,需要将压缩包解压,然后将解压出来的文件(非文件夹)上传至手机的/data/local/tmp/目录下。

  • 1.【电脑】文件上传到设备

    adb push D:\frida-server-16.0.1-android-arm64 /sdcard/
    
  • 2.【手机】将frida-server…文件移动到手机的 /data/local/tmp 目录

    	adb shell
    	su -
    	cd sdcard
    	mv frida-server-16.0.1-android-arm64  /data/local/tmp/
    
  • 3.【进入】

    cd /data/local/tmp
    
  • 4.【授权】授予可执行的权限

    chmod 777 frida-server-16.0.1-android-arm64
    

启动和Hook

  1. 手机端

    adb shell
    su -
    cd /data/local/tmp/
    ./frida-server-16.0.1-android-arm64
    
  2. PC端

    • 1.端口转发

      adb forward tcp:27042 tcp:27042
      adb forward tcp:27043 tcp:27043
      
    • 2.获取进程

      # 枚举手机上的所有进程 & 前台进程
      import frida
      
      # 获取设备信息
      rdev = frida.get_remote_device()
      print(rdev)
      
      # 枚举所有的进程
      processes = rdev.enumerate_processes()
      for process in processes:
          print(process)
      
      # 获取在前台运行的APP
      front_app = rdev.get_frontmost_application()
      print(front_app)
      
    • 3.hook脚本-密码(此处以hook某软件登陆为例)

      import frida
      import sys
      
      # 连接手机设备
      rdev = frida.get_remote_device()
      
      # Hook手机上的那个APP(app的包名字)
      # session = rdev.attach("com.che168.autotradercloud")  # 车智赢+   或 进程ID
      session = rdev.attach("车智赢+") 
      
      scr = """
      Java.perform(function () {
      
          // 包.类
          var UserModel = Java.use("com.che168.autotradercloud.user.model.UserModel");
      
          // Hook,替换
          UserModel.loginByPassword.implementation = function(str,str2,str3,str4,str5,responseCallback){
              console.log(str,str2,str3,str4,str5);
      
              // 执行原来的方法
              this.loginByPassword(str,str2,str3,str4,str5,responseCallback);
          }
      
      });
      """
      
      script = session.create_script(scr)
      def on_message(message, data):
          print(message, data)
      
      
      script.on("message", on_message)
      script.load()
      sys.stdin.read()
      
    • 4.hook脚本-md5加密(此处以hook某软件登陆为例)

      import frida
      import sys
      
      # 连接手机设备
      rdev = frida.get_remote_device()
      
      # Hook手机上的那个APP(app的包名字)
      # session = rdev.attach("com.che168.autotradercloud")  # 车智赢+  或 进程ID
      session = rdev.attach("车智赢+")
      
      scr = """
      Java.perform(function () {
      
          // 包.类
          var UserModel = Java.use("com.che168.autotradercloud.user.model.UserModel");
          var SecurityUtil = Java.use("com.autohome.ahkit.utils.SecurityUtil");
          
      
          // Hook,替换
          UserModel.loginByPassword.implementation = function(str,str2,str3,str4,str5,responseCallback){
              console.log(str,str2,str3,str4,str5);
      
              // 执行原来的方法
              this.loginByPassword(str,str2,str3,str4,str5,responseCallback);
          }
          
          
          // Hook,替换
          SecurityUtil.encodeMD5.implementation = function(str){
              console.log("md5加密,明文:",str);
              var res = this.encodeMD5(str);
              console.log("md5加密,密文:",res);
              return res;
          }
          
      
      });
      """
      
      script = session.create_script(scr)
      def on_message(message, data):
          print(message, data)
      
      
      script.on("message", on_message)
      script.load()
      sys.stdin.read()
      
    • 5.hook脚本-查看调用栈
      Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new())
      加上这一句就可以查看调用栈了

      import frida
      import sys
      
      rdev = frida.get_remote_device()
      
      session = rdev.attach("车智赢+")
      
      scr = """
      Java.perform(function () {
           // 包.类
          var SPUtils = Java.use("com.che168.autotradercloud.util.SPUtils");
      
          // Hook,替换
          SPUtils.saveDeviceId.implementation = function(str){
              console.log("执行了,参数:",str); 
              console.log(Java.use("android.util.Log").getStackTraceString(Java.use("java.lang.Throwable").$new()));
              
              // 执行原来的方法
              this.saveDeviceId(str);
          }
      });
      """
      
      script = session.create_script(scr)
      
      script.load()
      sys.stdin.read()
      

效果图:
在这里插入图片描述

至此,hook的使用就结束啦~~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值