【Frida】【Android】02_JAVA层HOOK

news2024/11/20 16:35:57

🛫 系列文章导航

  • 【Frida】【Android】01_手把手教你环境搭建 https://blog.csdn.net/kinghzking/article/details/136986950
  • 【Frida】【Android】02_JAVA层HOOK https://blog.csdn.net/kinghzking/article/details/137008446
  • 【Frida】【Android】03_RPC https://blog.csdn.net/kinghzking/article/details/137050967

▒ 目录 ▒

    • 🛫 系列文章导航
    • 🛫 导读
      • 开发环境
    • 1️⃣ Android App 代码介绍
      • 中文内部类和方法
      • 重载函数
      • 成员变量及静态函数
    • 2️⃣ 普通函数HOOK
      • Java.perform
      • 操作步骤
    • 3️⃣ 重载函数HOOK
    • 4️⃣ 构造函数HOOK
    • 5️⃣ 函数主动调用
    • 🛬 文章小结
      • frida api释义
    • 📖 参考资料

🛫 导读

开发环境

版本号描述
文章日期2024-03-24
操作系统Win11 - 22H222621.2715
node -vv20.10.0
npm -v10.2.3
夜神模拟器7.0.5.8
Android9
python3.9.9
frida16.2.1
frida-tools12.3.0
objection1.11.0

1️⃣ Android App 代码介绍

在本小节中,我们将开始学习Frida在Android Java中的Hook功能。为了清楚地了解App的运行内容,这里先编写一个简单的App用于练习。其主要使用逻辑为,通过点击测试按钮,触发各种函数调用。通过adb logcat | findstr yemao查看运行结果。
在这里插入图片描述

中文内部类和方法

该类逻辑相对简单,包含一个中文方法,内部打印一句话。
除此之外,编译器会生成一个默认的构造函数

在这里插入图片描述

设计这个类的原因有以下几点:

  • 演示普通函数HOOK
  • 演示构造函数HOOK
  • 为了测试中文相关名称处理方法
  • 演示子类Smali命名规则

重载函数

在入口类MainActivity中添加了两个相同名称的函数(重载函数),接受不同的参数,用于演示重载函数HOOK功能。

public class MainActivity extends AppCompatActivity {

    void fun(int x , int y ){
        Log.d("yemao.sum" , String.valueOf(x+y));
    }
    String fun(String x){
        return x.toLowerCase();
    }
}

成员变量及静态函数

除此之外,还预留了成员变量及静态函数,用于下面几个测试:

  • 修改成员变量
  • 主动调用静态函数
  • frida rpc测试
public class MainActivity extends AppCompatActivity {
    private String total = "hello";

    void secret(){
        total += " secretFunc";
        Log.d("yemao.secret" , "this is secret func");
    }
    static void staticSecret(){
        Log.d("yemao.secret" , "this is static secret func");
    }

}

2️⃣ 普通函数HOOK

这里以com.yemao.demo.MainActivity.非重载测试类的方法普通函数为例,介绍普通函数HOOK,其它hook在此基础上进行解释。

Java.perform

用Frida的API函数Java.perform()将脚本中的内容注入到Java运行库,这个API的参数是一个函数,函数内容是监控和修改Java函数逻辑的主体内容。
注意,这里的Java.perform()函数非常重要,任何对App中Java层的操作都必须包裹在这个函数中,否则Frida运行起来后就会报错。


function main() {
  普通函数()
  重载函数()
  构造函数()
  函数主动调用()
}


Java.perform(main)

操作步骤

  • 首先调用了Frida的API函数Java.use(),这个函数的参数是Hook的函数所在类的类名,参数的类型是一个字符串类型,比如Hook的中文方法()函数所在类的全名为com.roysue.demo02.MainActivity$非重载测试类,那么传递给这个函数的参数就是com.roysue.demo02.MainActivity$非重载测试类。这个函数的返回值动态地为相应Java类获取一个JavaScript Wrapper,可以通俗地理解为一个JavaScript对象。
    这里特别注意的是,内部类命名需要使用$连接!!!
  • 接着,通过JavaScript Wrapper获取其方法函数对象,有以下两种方法:
    • 如果是英文,直接通过.即可,例如cls.fun。(也可以使用cls['fun']
    • 对于中文,则需要使用[]获取方法对象:cls['中文方法']
  • 然后加上implementation 关键词表示实现,通过对其进行赋值,替换原有函数逻辑。
    通过this['中文方法']()函数再次调用原函数,并把原本的参数传递给这个函数。简而言之,就是重新执行原函数的内容,最后将这个函数的返回值直接通过return指令返回。

function 普通函数() {
  var cls = Java.use('com.yemao.demo.MainActivity$非重载测试类')
  console.log("Java.Use.Successfully!") //定位类成功!
  cls['中文方法'].implementation = function(x: number, y: number) {
      console.log("[普通函数] x => ",x,", y => ",y)
      // this['中文方法'] 可以获得Hook之前的函数,可以直接调用之前的函数
      // 这时候,可以根据自己的需求,修改参数等!!!
      var ret_value = this['中文方法'](x, y);
      return ret_value
  }
}

ps: 在Hook一个函数时,还有一个地方需要注意,那就是最好不要修改被Hook的函数的返回值类型,否则可能会引起程序崩溃等问题,比如直接通过调用原函数将原函数的返回值返回。

3️⃣ 重载函数HOOK

重载函数HOOK逻辑如果使用普通函数HOOK中的代码,会报错Error: fun(): has more than one overload。这是函数的重载导致Frida不知道具体应该Hook哪个函数而出现的问 题。 其 实 Frida 已 经 提 供 了 解 决 方 案 ( use .overload(<signature>), 就 是 指 定 函 数 签 名 , 将 报 错 中的.overload(‘java.lang.String’)者.overload(‘int’, ‘int’)添加到要Hook的函数名后、关键词implementation之前。


function 普通函数() {
  var MainAcitivity = Java.use('com.yemao.demo.MainActivity')
  console.log("Java.Use.Successfully!") //定位类成功!
  MainAcitivity.fun.overload('int', 'int').implementation = function(x: number, y: number) {
    console.log("[重载函数] x => ",x,", y => ",y)
    var ret_value = this.fun(x, y);
    return ret_value
  }
}

4️⃣ 构造函数HOOK

构造函数比普通函数,只有函数命名上特殊一点,frida采用了$init代表构造函数。
本例子使用的是内部类,相对于普通类,会多传递一个参数外部类对象,这是java语法特性,可以通过查看Smali代码看出该参数的传递,所以

  • 必须增加该参数mainAcitivity,否则程序会崩溃的!!!
  • 必须增加该参数mainAcitivity,否则程序会崩溃的!!!
  • 必须增加该参数mainAcitivity,否则程序会崩溃的!!!

function 普通函数() {
  var cls = Java.use('com.yemao.demo.MainActivity$非重载测试类')
  console.log("Java.Use.Successfully!") //定位类成功!
  cls.$init.implementation = function(mainAcitivity) {
      console.log("[构造函数] ===")
      var ret_value = this.$init(mainAcitivity);
      return ret_value
  }
}

5️⃣ 函数主动调用

在Java中,类中的函数可分为两种:类函数实例方法。通俗地讲,就是静态的方法和动态的方法。类函数使用关键字static修饰,和对应类是绑定的,如果类函数还被public关键词修饰着,在外部就可以直接通过类去调用;实例方法则没有关键字static修饰,在外部只能通过创建对应类的实例再通过这个实例去调用。
如果是类函数的主动调用,直接使用Java.use()函数找到类进行调用即可;
如果是实例方法的主动调用,则需要在找到对应的实例后对方法进行调用。这里用到了Frida中非常重要的一个API函数Java.choose(),这个函数可以在Java的堆中寻找指定类的实例。


function 函数主动调用() {
  var MainAcitivity = Java.use('com.yemao.demo.MainActivity')
  console.log("Java.Use.Successfully! 函数主动调用") //定位类成功!
    
  // 静态函数主动调用
  MainAcitivity.staticSecret();

  // Error: secret: cannot call instance method without an instance
  // MainAcitivity.secret();


  // 动态函数主动调用
  Java.choose('com.yemao.demo.MainActivity',{
    onMatch: function(instance){
      console.log('instance found',instance)
      instance.secret()
    },
    onComplete: function(){
      console.log('search Complete')
    }
  })
}

🛬 文章小结

frida api释义

函数名参数返回值含义
Java.perform函数任何对App中Java层的操作都必须包裹在这个函数
中,否则Frida运行起来后就会报错
Java.useclassNameJavaScript wrapper动态获取类实例对象
MainAcitivity.fun.implementation函数实现
MainAcitivity.fun.overload参数数组重载函数中,区分不同的函数
Java.chooseclassName, callbacks枚举className的实例对象,调用callbacks处理回调逻辑

📖 参考资料

  • 《安卓Frida逆向与抓包实战》
  • 【Frida】 00_简单介绍和使用 https://blog.csdn.net/kinghzking/article/details/123225580
  • 本节源码地址 https://gitcode.com/android8/AndroidFridaBeginnersBook

ps: 文章中内容仅用于技术交流,请勿用于违规违法行为。

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

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

相关文章

【C语言】三种方法模拟实现 strlen 函数

前言 这篇文章将要带我们去实现模拟一个stelen()函数 首先我们要知道strlen()函数的定义 strlen()定义和用法 我们先看一下strlen在cplusplus网站中的定义 链接: 点击跳转 这里我们可以知道strlen的用法 size_t strlen ( const char * str );获取字符串长度 返回 C 字符串…

【分布式】——降级熔断限流

降级&熔断&限流 ⭐⭐⭐⭐⭐⭐ Github主页&#x1f449;https://github.com/A-BigTree 笔记仓库&#x1f449;https://github.com/A-BigTree/tree-learning-notes 个人主页&#x1f449;https://www.abigtree.top ⭐⭐⭐⭐⭐⭐ 如果可以&#xff0c;麻烦各位看官顺手点…

搭建 Apple Mac M1 stm32 开发环境

近期想学习 stm32 开发,看了些书和视频,买了开发板。开发板到了后就迫不及待的的进行尝试。由于我目前使用的电脑是 Apple M1 Pro,目前用的比较多的是 windows + keil。我先是在 mac 使用虚拟机,安装 win 环境来使用,但是我分别使用了 VMware 和 parallels desktop ,keil…

机器学习笔记(4)—逻辑回归(Logistic Regression)

文章目录 逻辑回归&#xff08;Logistic Regression&#xff09;分类问题假说表示判定边界代价函数简化的成本函数和梯度下降多类别分类&#xff1a;一对多 逻辑回归&#xff08;Logistic Regression&#xff09; 分类问题 分类问题中&#xff0c;我们要预测的变量 y y y是一…

论文阅读笔记——Rethinking Pointer Reasoning in Symbolic Execution

文章目录 前言Rethinking Pointer Reasoning in Symbolic Execution12.1、基本情况概述12.2、摘要12.3、引言12.4、方法12.4.1、基本版本12.4.1.1、内存加载和存储12.4.1.2、状态合并 12.4.2、改进12.4.2.1、地址范围选择12.4.2.2、内存清理12.4.2.3、符号化的未初始化内存12.4…

RelayAttention:让大型语言模型更高效地处理长提示符

一、前言 虽然大型语言模型 (LLM) 近年来取得了非常显著的进展&#xff0c;也在各种自然语言处理任务中展现出强大的能力。然而&#xff0c;LLM 的在实际的应用落地层面也面临着一些实际挑战&#xff0c;其中之一就是效率和成本问题&#xff0c;导致了在垂直行业实际落地的应用…

网际协议 - IP

文章目录 目录 文章目录 前言 1 . 网际协议IP 1.1 网络层和数据链路层的关系 2. IP基础知识 2.1 什么是IP地址? 2.2 路由控制 3. IP地址基础知识 3.1 IP地址定义 3.2 IP地址组成 3.3 IP地址分类 3.4 子网掩码 IP地址分类导致浪费? 子网与子网掩码 3.5 CIDR与…

笔记本如何调节亮度?笔记本亮度调节方法

对于经常长时间面对笔记本电脑的小伙伴们来说&#xff0c;屏幕亮度过暗或者过亮&#xff0c;都会对眼睛造成伤害。那么&#xff0c;我们如何调节笔记本亮度至适中呢?下面为大家介绍3种简单的调节屏幕亮度的方法&#xff0c;一起来看看吧! 笔记本亮度调节方法一&#xff1a; 1、…

【MySQL】4.MySQL日志管理与数据库的备份和恢复

备份的目的只要是为了灾难恢复&#xff0c;备份还可以测试应用&#xff0c;回滚数据&#xff0c;修改和查询历史数据&#xff0c;审计等 日志在备份、恢复中起着重要作用 一、数据库备份的重要性 在生产环境中&#xff0c;数据的安全性至关重要 任何数据丢失都可能产生严重的…

关系型数据库mysql(7)sql高级语句

目录 一.MySQL常用查询 1.按关键字&#xff08;字段&#xff09;进行升降排序 按分数排序 &#xff08;默认为升序&#xff09; 按分数升序显示 按分数降序显示 根据条件进行排序&#xff08;加上where&#xff09; 根据多个字段进行排序 ​编辑 2.用或&#xff08;or&…

centos 7 安装磐维(PanWeiDB)数据库(单机)

前置环境准备 文件系统环境要求 文件系统环境所要求的扇区必须为512bytes&#xff0c;查看方法如下&#xff1a; [rootdevops-core-highapp3-b-32 ~]#df -h /apps/ [rootdevops-core-highapp3-b-32 ~]#ll /dev/mapper/vg--docker-lvapp [rootdevops-core-highapp3-b-32 ~]#f…

Apache ActiveMQ OpenWire 协议反序列化命令执行漏洞分析 CVE-2023-46604

Apache ActiveMQ 是美国阿帕奇&#xff08;Apache&#xff09;软件基金会所研发的一套开源的消息中间件&#xff0c;它支持Java消息服务、集群、Spring Framework等。 OpenWire协议在ActiveMQ中被用于多语言客户端与服务端通信。在Apache ActiveMQ 5.18.2版本及以前&#xff0…

小程序富文本图片宽度自适应

解决这个问题 创建一个util.js文件,图片的最大宽度设置为100%就行了 function formatRichText(html) {let newContent html.replace(/\<img/gi, <img style"max-width:100%;height:auto;display:block;");return newContent; }module.exports {formatRichT…

2024-03-26 Android8.1 px30 WI-FI 模块rtl8821cu调试记录

一、kernel 驱动&#xff0c;我这里使用v5.8.1.2_35530.20191025_COEX20191014-4141这个版本&#xff0c;下载这个版本的驱动可以参考下面的文章。 2021-04-12 RK3288 Android7.1 USB wifi bluetooth 模块RTL8821CU 调试记录_rk平台rtl8821cu蓝牙调试-CSDN博客 二、Makefile文…

基于nodejs+vue考试信息报名系统python-flask-django-php

本文拟采用nodejs技术和express 搭建系统框架&#xff0c;后台使用MySQL数据库进行信息管理&#xff0c;设计开发的考试信息报名系统。通过调研和分析&#xff0c;系统拥有管理员、学生和教师三个角色&#xff0c;主要具备登录注册、个人信息修改、对系统首页、个人中心、学生管…

在项目中数据库如何优化?【MySQL主从复制(创建一个从节点复制备份数据)】【数据库读写分离ShardingJDBC(主库写,从库读)】

MySQL主从复制 MySQL主从复制介绍MySQL复制过程分成三步&#xff1a;1). MySQL master 将数据变更写入二进制日志( binary log)2). slave将master的binary log拷贝到它的中继日志&#xff08;relay log&#xff09;3). slave重做中继日志中的事件&#xff0c;将数据变更反映它自…

JS等比压缩图片方法

AI给出来的答案&#xff0c;AI真的能改变世界&#xff0c;以后程序员这个职业真的有可能不存在了。 function compressImage(image, callback) {// 创建一个 canvas 元素const canvas document.createElement(canvas);canvas.width 48;canvas.height 48;// 获取 canvas 的绘…

【学海拾贝】| 关于Python的 PEP 484规则了解:类型提示,函数注解

在实际的工厂在实际的工程代码的开发中&#xff0c;常常可以碰到这种情况 上网查了之后发现这是PEP484规则~ 文章目录 1 Type Hints for Variables&#xff08;变量在这里插入图片描述2 Function Annotations&#xff08;函数注解&#xff09;3 Type Checking Tools&#xff08…

【比特币】比特币的奥秘、禁令的深层逻辑与风云变幻

导语&#xff1a; 比特币(Bitcoin)&#xff0c;这个充满神秘色彩的数字货币&#xff0c;自诞生以来便成为各界瞩目的焦点。它背后所蕴含的Mining机制、禁令背后的深层逻辑以及市场的风云变幻&#xff0c;都让人欲罢不能。今天&#xff0c;我们将深入挖掘比特币的每一个角落&…

视觉图像处理与FPGA实现第七次作业——生成512深度、8位宽度的双端口存储器IP,并分析IP包资料构成

一、生成IP 打开Vivado&#xff0c;点击IP Catalog&#xff0c;搜索memory&#xff0c;双击对应IP核 调整参数为——512深度、8位宽度&#xff0c;双端口&#xff0c;然后一直默认点击OK 二、分析IP构成 查看IP细节&#xff0c;查看设计资源和仿真资源 双击打开文件 设计文件…