frida的hook代码:在python中格式,以及常用hook方法

news2024/11/20 20:18:02

js 写hook格式

首先frida的hook代码是通关JavaScript进行实现的,而且调用是通关python进行调用的

如果单独写一个js,就需要通关frida 命令进行启动了

首先聊一下frida的几个常用命令:

  • -U:连接USB设备。
  • -F:附加最前面的应用。
  • -f:主动启动进程。
  • -l:加载script脚本文件。
  • -o:输出日志。
  • -no-pause:启动主线程运行应用。

所以frida再dos窗口调用test.js 文件hook app如下

frida -U -f  app的进程包名   -l  test.js -o  窗口输出信息文件   -no-pause

但是习惯用python开发,所以再python中调用,具体如下:

一般其格式如下:

js_hook='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzz=Java.use("包名+类名");
  //  hook 目标方法
   clazz.方法名.implementation=function([参数]){
   
    //  对方中的数据进行修改  一般还会再使用 this.方法名  运行程序本身的方法,这样不会影响程序正常运行
   
   }

  )

'''
  • 因在python中写多行会方便一些,所以采用字符串多行模式标记:

    '''字符串内容'''
    
  • Java.perform() :这个是固定写法

  • Java.use(“包名+类名”) : 也是固定写法 首先找到目标类,才能hook方法

  • clazz.方法名.implementation=function([参数]){}: 这个也是固定方法

然后再通关两种pyhon进行调用

具体格式如下:

一般会有一个方法

def on_message(message,dada):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)

可以看下官网解释:在这里插入图片描述

也就是一个监控,注入进程的任何信息。一般的时候,都写上。

import frida,sys
def on_message(message,dada):
    if message['type'] == 'send':
        print("[*] {0}".format(message['payload']))
    else:
        print(message)

#hook js
test='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzz=Java.use("包名+类名");
  //  hook 目标方法
   clazz.方法名.implementation=function([参数]){
   
    //  对方中的数据进行修改  一般还会再使用 this.方法名  运行程序本身的方法,这样不会影响程序正常运行
   
   }

  )

'''

# 启动方式1
process = frida.get_usb_device(-1).attach('app的包名')
script = process.create_script(test)
script.on('message', on_message)
script.load()
sys.stdin.read()

# 启动方式2 spawn 重启APP 可以hook APP启动阶段
device = frida.get_usb_device(-1)
pid = device.spawn(['app的包名'])
process = device.attach(pid)
script = process.create_script(test)
script.on('message', on_message)
script.load()
device.resume(pid)
sys.stdin.read()

hook 各种方法

hook 静态方法或者实例方法

格式如下:

test='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzz=Java.use("包名+类名");
  //  hook 目标方法 如果有参数,参数不需要写类型
   clazz.方法名.implementation=function([参数]){
   
    //  对方中的数据进行修改  一般还会再使用 this.方法名  运行程序本身的方法,这样不会影响程序正常运行
   
   }

  )

'''

来一个例子:

目标代码:

com.xiaozhudi
class A{
    
   public static void testA(){
       
       
   }
    
}


hook的js

test='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzz=Java.use("com.xiaozhudi.A");
  //  hook 目标方法 如果有参数,参数不需要写类型
   clazz.testA.implementation=function(){
   // 如果是 有返回值 记得使用 return   this.方法名()
      this.testA();
   
   }

  )

'''

hook 构造方法

test='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzz=Java.use("包名+类名");
  //  hook 目标方法 如果有参数,参数不需要写类型
   clazz.$init.implementation=function([参数]){
   
   }

  )

'''

来一个例子:

com.xiaozhudi
class A{
   private String a1;
   public A (String a1){
       this.a1=a1;
   } 
    
   public String getA1(){
       return  this.a1
   }
       
}

写的hook js如下:

test='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzz=Java.use("com.xiaozhudi.A");
  //  hook 目标方法 如果有参数,参数不需要写类型
   clazz.$init.implementation=function(a1){
 // 因为这个是js 所以用console.log 打印数据
      console.log('a1参数在实例化时值为',a1) ;  
      
      return this.$init('可以传入自己想实例化的值或者使用a1')
   
   }

  )

'''
hook的方法 参数是一个对象

比如这样比如下面B类调用了A类:

com.xiaozhudi

class A{
   private String a1;
   public A (String a1){
       this.a1=a1;
   } 
    
   public String getA1(){
       return  this.a1
   }
       
}    
    
class B{
   //这个传递的类A
   public String getB1 (A a){
       return a.getA1();
   } 
  
       
}

如果只是单纯的hookB中的getA1方法可以如下操作:

test='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzzb=Java.use("com.xiaozhudi.B");
 
   clazzb.getB1.implementation=function(a){
 // 因为a本身就是一个对象可以可可以直接调用直接的方法 
      console.log('a1实例化时值为',a.getA1()) ;  
      
      return this.getB1(a);
   
   }

  )

'''

但是如果如果想修改A的对象可以如下操作,一般对象类中有set方法比如setA1(String a1),但是我估计不写是了为引出另一个关键字$new

test='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzza=Java.use("com.xiaozhudi.A");
     var calzzb=Java.use("com.xiaozhudi.B");
 
   clazzb.getB1.implementation=function(a){
 // 因为a本身就是一个对象可以可可以直接调用直接的方法 
      console.log('a1实例化时值为',a.getA1()) ;  
      
      //如果A 有set方法可以如下写:
      //a.setA1('新的值');
      //return this.getB1(a);
      
      // 估计不写 所以需要这样写  签名也需要得到这个类 var calzza=Java.use("com.xiaozhudi.A");
      return this.getB1(calzza.$new('新的值')); 
   
   }

  )

'''
补充 :对已有的对象查找 Java.choose

对于静态的类,不会使用这种方式,对于实例可能就需要中方式了,

得到实例有两种方式:

  • 创建对象:这种需要$new 创建一个新的实例

  • 获得以后的实例,这个就需要Java.choose

    具体如下:

    test='''
      Java.perform(
      // 也就是增加需要hook的方法所在的类
         var calzza=Java.use("com.xiaozhudi.A");
         
         var aobject=  calzza.choose("com.xiaozhudi.A",{
         // 这个里面有两个回调函数 第一个如果找到实例:
         onMathch:function(obj){       
             // 找到了可以进行操作
             console.log(obj)
         },
         // 当然还有一种情况,那就是找不到,这个还是就调用这个方法
         onComplete:function(){
                console.log('找不到啊')
         
       }
         
         }) 
     
    
    
      )
    
    '''
    

hook 重载方法

安卓和java其实溯本同源是一样,所以自然多态的一个特性:方法重载。

简单说,就是一个类中有两个或两个以上的相同方法名的方法,如下:

com.xiaozhudi
class A{
    
   public static void testA(){
       
       
   }
   public static void testA(int a1){
       
       
   }
}


如果按照java的理解如下写:

test='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzz=Java.use("com.xiaozhudi.A");
  //   
   clazz.testA.implementation=function( ){
  
      
      return this.testA();
   
   }

  )

'''

这个不会自动选择调用无参的构造方法,而是会报错:

其中最重要的是:

Error: testA(): has more than one overload,use overload ( < signature > ) to choose from :
.overload()
.overload('int')
…………

不过根据报错,如何hook 有参的testA方法如下:

test='''
  Java.perform(
  // 也就是增加需要hook的方法所在的类
     var calzz=Java.use("com.xiaozhudi.A");
  //   hook  有参的方法
   clazz.testA.overload('int').implementation=function(a){
      
      return this.testA(a);
   
   }

  )

'''
hook 所有的重载方法
  • 最笨的方法,那就是 将所有的重载方法,都写一遍:

    test='''
      Java.perform(
      // 也就是增加需要hook的方法所在的类
         var calzz=Java.use("com.xiaozhudi.A");
      
       clazz.testA.overload().implementation=function(){
          
          return this.testA();
       
       }
      //   hook  有参的方法
       clazz.testA.overload('int').implementation=function(a){
          
          return this.testA(a);
       
       }
    
      )
    
    '''
    
  • 使用循环方式:

    需要知道三个点知识:
    
    方法.overloads  : 这个返回一个重载方法的数组
    
    在方法体中使用 arguments : 这个是js中常用的一个方式,如果想了解可以看我另一篇文章:https://blog.csdn.net/u011863822/article/details/121062463
    
    还有一个js中可以改变this的关键字apply : 如果了解详情可以看我另一篇文章:https://blog.csdn.net/u011863822/article/details/121255682
    

    因此可以将hook的全部重载方法,如下写:

    test='''
     Java.perform(
      // 也就是增加需要hook的方法所在的类
         var calzz=Java.use("com.xiaozhudi.A");
      // 得到所有重载方法 返回一个数组
         var overload_arr=clazz.testA.overloads;
      //  得到数组的长度
         var len=overload_arr.length;
         
         for(var i=0;i<len;i++){
             overload_arr[i],implementation=function(){
               // 如果想知道参数的每个值可以如下操作
               var params="";
               for(var j=0;j<arguments.length;j++){
                   params+=arguments[j]+"   "
                   }
               console.log('调用的参数值是',params) 
               // 这里如果还需要运行正确的方法可以如下
               
               this.testA.apply(this,arguments)
               
             }
    
         }
      
       
       }
    
      )
    
    
    
    '''
    

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1269364.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

全球高纯铜靶材总体规模分析:行业现状及发展趋势

高纯铜靶材是指采用纯度在 4N&#xff08;Cu≥99.99%&#xff09;以上的金属铜生产的靶材&#xff08;N 即代表铜的纯度&#xff0c;N 前面的数字越大铜纯度越高&#xff09;。 高纯铜靶材是一种用于薄膜沉积工艺的材料&#xff0c;具有极高的纯度和特定的物理和化学性质。它通…

HotSpot 虚拟机中的对象

1、对象的创建 Java 是一门面向对象的编程语言&#xff0c;程序运行过程中无时无刻都有对象被创建出来。在语言层面上&#xff0c;创建对象通常仅仅是一个 new 关键字&#xff0c;而虚拟机中&#xff0c;对象&#xff08;仅限于普通 Java 对象&#xff0c;不包括数组和 Class …

【批处理常用命令及用法大全】

文章目录 1 echo 和 回显控制命令2 errorlevel程序返回码3 dir显示目录中的文件和子目录列表4 cd更改当前目录5 md创建目录6 rd删除目录7 del删除文件8 ren文件重命名9 cls清屏10 type显示文件内容11 copy拷贝文件12 title设置cmd窗口的标题13 ver显示系统版本14 label 和 vol设…

C51--LCD1602显示屏

LCD602显示&#xff1a; 1、概述 LCD602是一种工业字符型液晶&#xff0c;能够同时显示16x02&#xff0c;即32字符&#xff08;16列&#xff0c;2行&#xff09; 2、引脚&#xff1a; VSS&#xff1a;电源地VDD&#xff1a;电源正极——5V电源VO&#xff1a; 液晶显示偏压 …

【深度学习笔记】06 softmax回归

06 softmax回归 softmax运算损失函数对数似然Fashion-MNIST数据集读取数据集读取小批量整合所有组件 softmax回归的从零开始实现初始化模型参数定义softmax操作定义模型定义损失函数分类精度训练预测 softmax回归的简洁实现 softmax运算 softmax函数能够将未规范化的预测变换为…

数字系列——数字经济(2)​

上次呢&#xff0c;已经为大家捋了什么是数字经济&#xff1f;、数字经济的特点有哪些&#xff1f;和数字经济的构成&#xff0c;对于数字经济有了基础性的了解&#xff0c;今天继续为大家捋一捋。 数字经济的发展 1.互联网的普及 互联网作为数字经济的坚实基础&#xff0c;其…

P27 C++this 关键字

目录 前言 01 this关键字的引入 02 this关键字 前言 本章的主题是 C 中的 this 关键字。 以前第一次学qt的时候就遇到了this关键字&#xff0c;那时候还不是很会C&#xff0c;所以有点懵&#xff0c;现在我们就来讲解以下C中的this关键字 C 中有一个关键字 this&#xff0…

致敬成长:借助昇腾AI,00后开发者如何破解睡眠呼吸辅助诊断难题

导读&#xff1a;两年&#xff0c;如何从AI小白到优秀开发者&#xff1f; 打呼噜正在成为人们身边隐形的“健康杀手”。据《2017年中国人睡眠质量及科普报告》显示&#xff0c;约5000万人在睡眠中发生过呼吸暂停。30~69岁成年人中&#xff0c;阻塞性睡眠呼吸暂停综合征&#xf…

Python接口自动化测试如何设计接口测试用例(详解)

简介 上篇我们已经介绍了什么是接口测试和接口测试的意义。在开始接口测试之前&#xff0c;我们来想一下&#xff0c;如何进行接口测试的准备工作。或者说&#xff0c;接口测试的流程是什么&#xff1f;有些人就很好奇&#xff0c;接口测试要流程干嘛&#xff1f;不就是拿着接口…

柯桥学英语,商务外贸英语,BEC中级写作冲刺干货

think of… as 把……认为 eager to… 渴望 look forward to Ving 期待/盼望…… accept…as 接受……为 be certain of 对……确信 in contact with 与……接触 in accordance with 与……相符/一致 remind…of 提醒……关于 be advantageous to 有利于…… assure…of使……放…

嵌入式八股 | 校招秋招 | 笔试面试 | 精选题目

欢迎关注微信公众号【赛博二哈】获取八股PDF 并加入嵌入式求职交流群。提供简历模板、学习路线、岗位整理等 欢迎加入知识星球【嵌入式求职星球】获取完整嵌入式八股。 提供简历修改、项目推荐、求职规划答疑。另有各城市、公司岗位、笔面难题、offer选择、薪资爆料等 嵌入式…

[ISCTF2023] Crypto/PWN/Reverse

最近新生赛还挺多&#xff0c;不过这个开始后注册页面就被删了&#xff0c;没注册上。拿别人的附件作了下。 Crypto 七七的欧拉 这题只给了n,e,c这种情况一般正常没法解&#xff0c;猜n不正常 import gmpy2 import libnum from crypto.Util.number import *flagbISCTF{****…

通过抖音商城小程序门店服务预约效果如何

抖音已然成为众多企业商家经营的重要平台之一&#xff0c;尤其本地生活服务商家更可通过抖音实现套餐销售、门店引流等&#xff0c;而借势平台高额流量&#xff0c;也确实有非常高的效果。 而在实际运营中&#xff0c;随着私域化程度加快&#xff0c;无论微信还是抖音&#xf…

英语不好,能够学习编程语言吗?

可以&#xff0c;编程英语是不涉及语法、时态、人称的&#xff0c;比如&#xff1a; System.out.print("你好");此处的&#xff0c;System表示"系统"&#xff0c;out表示"在…外面"&#xff0c;print表示"打印"&#xff0c;每一个单词…

App的测试,和传统软件测试有哪些区别?应该增加哪些方面的测试用例?

从上图可知&#xff0c;测试人员所测项目占比中&#xff0c;App测试占比是最高的。 这就意味着学习期间&#xff0c;我们要花最多的精力去学App的各类测试。也意味着我们找工作前&#xff0c;就得知道&#xff0c;App的测试点是什么&#xff0c;App功能我们得会测试&#xff0…

解决tomcat 启动 , 中文乱码问题

解决tomcat 启动 , 中文乱码问题. 第一步找到server.xml, 找到连接器, 添加 URIEncoding"UTF-8" 注意是英文的引号. 第二步, 找到 logging.properties , 在其中找到 第三步,启动服务, 观察现象,亲测有效.

【Java学习笔记】 74 - 本章作业

1.验证电子邮件格式是否合法 规定电子邮件规则为 1.只能有一个 2. 前面是用户名,可以是a-z A-Z 0-9 _ - 字符 3. 后面是域名&#xff0c;并且域名只能是英文字母&#xff0c;比如sohu.com或者tsinghua.org.cn 4.写出对应的正则表达式&#xff0c;验证输入的字符串是否为满…

PC端ssh连接到Android手机的Termux部署http服务器

1. 下载并安装Termux至Android手机 Releases termux/termux-app (github.com) https://github.com/termux/termux-app/releases 2. 手机端启动Termux&#xff0c;安装openssh #更新仓库 pkg up pkg install openssh #安装好后&#xff0c;启动sshd sshd问题1&#xff1a;如…

STM32g70开启定时器死机原因

在做低功耗产品时&#xff0c;检查发现由于之前开启了BOOTLOADER升级程序&#xff0c;修改了中断向量FALSH起始地址&#xff0c;只在KEIL TARGET IROM1中修改了&#xff0c; 而忘记在程序文件system_stm32f10x.c里修改中断向量表flash起始地址 system_stm32f10x.c里&#xff0…

去北京医院预约,需要医保卡号,但是社保卡不在身边,北京的医保卡号咋网上查询

目录 1 问题2 查询 1 问题 要去北京某一个医院预约挂号&#xff0c;预约的时候选择的医保&#xff0c;需要写医保卡号&#xff0c;但是自己的社保卡不在身边&#xff0c;怎么办 记住&#xff0c;医保卡号不是社保卡号&#xff0c;是不一样的 北京医保卡号是12位 2 查询 登陆这…