【Frida实战】浅析Java层静态方法与实例方法的Hook技术及其应用

引言*

在移动安全研究领域,动态代码插桩工具Frida以其强大的功能和灵活的特性深受广大研究人员喜爱。本文将聚焦Frida在Java层面上对静态方法和实例方法的Hook过程,通过一个具体的Android应用示例,详细介绍其Hook原理和操作步骤。

Hook静态方法与实例方法

在使用Frida编写Hook脚本时,我们需要遵循一定的组织结构。主要逻辑应封装在Java.perform方法中,该方法接收一个匿名函数作为参数,在此匿名函数内部编写具体的Hook代码。值得注意的是,在Hook静态方法或实例方法时,无需关注它们的修饰符,统一采用Java.use进行Hook操作,仅在主动调用时区分两者。

实战Hook演示

我们以一款已安装的Android测试应用为例,通过jadx反编译工具查看其源码,目标为com.xiaojianbang.hook.Money类中的静态方法setFlag和非静态方法getInfo。原始Java代码如下:

package com.xiaojianbang.hook;public class Money {private static String flag;private int amount;private String currency;public static void setFlag(String str) {flag = str;}public String getInfo() {return this.currency + ": " + this.amount + ":" + flag;}
}

首先,我们Hook setFlag 静态方法。由于它属于Money类,所以需通过Java.use("com.xiaojianbang.hook.Money")定位到该类,然后使用implementation方法覆写静态方法setFlag。当Android应用调用setFlag时,实际上执行的是我们覆写后的代码。在覆写函数中,根据原方法参数数量添加相应参数(类型无需指定),并可通过this.setFlag(a)调用原始方法返回结果。

接下来,Hook非静态方法getInfo,同样采用相同方式覆写。在调用原方法获取返回值的同时,插入console.log语句输出相关参数或返回值。具体的Hook脚本如下:

function test() {Java.perform(function () {var money = Java.use("com.xiaojianbang.hook.Money");money.setFlag.implementation = function (a) {console.log("money.setFlag param : ", a);return this.setFlag(a);//原始方法也会执行};money.getInfo.implementation = function () {var result = this.getInfo();//原始方法也会执行console.log("money.getInfo : ", result);return result;};});test();
}

为了确保Hook脚本在应用启动之初就能生效,我们可以借助Frida框架的命令行参数主动启动目标应用并注入脚本。常用命令行参数包括:

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

例如,启动命令如下:

frida -U -f com.xiaojianbang.app -l test.js -o fridaHook.txt --no-pause

执行上述命令后,Frida会自动启动USB连接设备上的com.xiaojianbang.app应用,并实时输出setFlag方法的参数以及getInfo方法的返回值至命令行。

对于修改方法参数和返回值的需求,只需调整Hook脚本。例如,若想改变setFlag方法的参数,只需在调用原方法的地方替换参数值:

money.setFlag.implementation = function (a) {console.log("money.setFlag param : ", a);return this.setFlag("这是修改后的参数");
};

经过这样的修改并重新运行脚本后,可以看到Money类中的setFlag方法参数已被成功更改。

总结,本文通过实际操作演示了如何使用Frida框架Hook Android应用中的Java静态方法和实例方法,并展示了如何在Hook过程中监控、修改方法参数和返回值,为移动应用逆向工程与安全分析提供了实用的技术手段。

问题

以上内容hook相应方法之后,原来的还会执行吗

在使用Frida进行方法Hook后,原有的方法仍然会被执行,但是其执行流程会发生变化。当我们使用implementation属性覆写某个方法时,实际上是替换了原有方法的实现。这意味着,当目标方法被调用时,将执行我们提供的Hook代码,而非原始方法体内的代码。

然而,在Hook代码中,通常我们会保留对原始方法的调用(如上面例子中的return this.setFlag(a);和var result = this.getInfo();),这样在Hook代码执行完额外的操作(如打印日志)之后,会继续执行原始方法的功能,从而保证原有业务逻辑不受影响。如果在Hook代码中没有调用原始方法,则原有的方法逻辑将不会被执行。

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

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

相关文章

浅谈2024 年 AI 辅助研发趋势!

目录 ​编辑 引言 一、AI辅助研发现状 1. 技术发展 2. 工具集成 3. 应用场景 二、AI辅助研发趋势 1. 更高的自动化程度 2. 更高的智能化程度 3. 更多的领域应用 4. 更高的重视度 三、结论 四. 完结散花 悟已往之不谏,知来者犹可追 创作不易&#xff…

业务场景: arraylist我有1000条数据我现在要往每条数据后面加一个123,除了循环添加还有什么方法?

在Java中,如果您有一个ArrayList包含1000条数据,并且想要往每条数据后面添加一个固定的字符串(比如"123"),那么循环遍历这个列表并逐个修改元素是最直接的方法。不过,如果您想要避免显式的for循环…

Golang 方法的接收器 receiver 指针和值的区别

一、如果receiver是指针类型 package mainimport "fmt"type Count struct {count int }func main() {c : Count{count: 0}c.incr()fmt.Println(c.count)c2 : &cc2.incr()fmt.Println(c2.count) }func (c *Count) incr() {c.count }//打印结果 1 2 incr 方法的 …

Windows系统Starting the Docker Engine 一直转圈解决方法

Windows系统Starting the Docker Engine 一直转圈解决方法 – 蓝队云 docker初始化安装时的WSL两个问题_unexpected wsl error-CSDN博客 docker desktop 因为某些原因无法打开报错wsl_docker desktop something went wrong-CSDN博客

【金三银四】刷刷八股吧,准备新的一周的到来

目录 前言1、Java中和equals有什么区别?2、String, StringBuffer, StringBuilder区别3、项目中对泛型的使用4、运行时数据区是怎样的?线程安全(即线程私有)的有哪些?5、对象实例、类信息、常量、静态变量分别在运行时数…

(南京观海微电子)——I3C协议介绍

特点 两线制总线:I2C仅使用两条线——串行数据线(SDA)和串行时钟线(SCL)进行通信,有效降低了连接复杂性。多主多从设备支持:I2C支持多个主设备和多个从设备连接到同一总线上。每个设备都有唯一…

题目 2036: 散列存储

题目描述: 给出了几个长度为n(n<20)的全排列&#xff0c;求某个全排列是否在上述的位置出现过。 代码: package lanqiao;import java.util.*;public class Main{public static void main(String[] args) {Scanner sc new Scanner(System.in);int n sc.nextInt();int m …

Python脚本,用于从MagicEden和HowRare API获取指定集合的拍卖列表和稀有度信息,并计算每个NFT的稀有度价格

一个Python脚本,用于从MagicEden和HowRare API获取给定集合的拍卖列表和稀有度信息,并计算每个NFT的稀有度价格。 代码的主要功能如下: 1. 导入所需的模块:`sys`,`time`,`requests`。 2. 定义了一个延迟时间`delay`,用于在每个API请求之间添加一定的延迟。 3. 定义了一个…

Mac安装oh-my-zsh

目录 命令下载 卸载命令 注意 命令下载 curl -L https://raw.github.com/robbyrussell/oh-my-zsh/master/tools/install.sh | sh 卸载命令 uninstall_oh_my_zsh 注意 终端init的时候并不会执行~/.bash_profile、~/.bashrc等脚本了&#xff0c; 这是因为其默认启动执行脚本…

017-$route、$router

$route、$router 1、$route2、$router 1、$route $route 对象表示当前的路由信息&#xff0c;包含了当前 URL 解析得到的信息。包含当前的路径&#xff0c;参数&#xff0c;query对象等。 使用场景&#xff1a; 获取路由传参&#xff1a;this.$route.query、this.$route.par…

C语言---位运算符练习(二)---单身狗问题

C语言—位运算符练习(二)—单身狗问题 文章目录 前言一、单身狗问题&#xff08;1&#xff09;1.题目2.思路3.参考代码 二、单身狗问题&#xff08;2&#xff09;1.题目2.思路3.代码的实现 前言 上一篇博客&#xff0c;我们留了一个思考题—单身狗问题&#xff0c;下面咱们对这…

【布局:1688,阿里海外的新筹码?】1688重新布局跨境海外市场:第一步开放1688API数据采集接口

2023年底&#xff0c;阿里巴巴“古早”业务1688突然成为“重头戏”&#xff0c;尤其宣布正式布局跨境业务的消息&#xff0c;一度引发电商圈讨论。1688重新布局跨境海外市场&#xff1a;第一步开放1688API数据采集接口 2023年11月中旬&#xff0c;阿里财报分析师电话会上&…

VUE——v-cloak指令

VUE——v-cloak指令 属性选择器&#xff0c;可以控制vue实例化完成前的dom样式 功能&#xff1a;利用vue实例化后v-cloak属性会消失&#xff0c;设置其样式 官网介绍 没用前效果&#xff1a;当vue没渲染完前&#xff0c;界面效果会看到{{aboutCloak}}字符&#xff0c;影响用户…

【万题详解】DFS搜索专题合集(中)

课前C小程序&#xff08;关机&#xff0c;休眠&#xff0c;注销程序&#xff09; 有的时候我们需要让电脑在一段时间工作而不能关机&#xff0c;但是工作完成之后不关机会造成用电浪费&#xff0c;那么使用自动关机命令&#xff0c;就不用担心电脑一直开着会浪费电啦。夜里看电…

UDP与TCP:了解这两种网络协议的不同之处

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

pytorch升级打怪(一)

基础介绍 学习基础知识机器学习的基本流程 快速入门一个简单的目标分类任务执行过程 学习基础知识 机器学习的基本流程 数据处理创建模型优化模型参数保存训练的模型 快速入门 一个简单的目标分类任务 识别衣服的类型 import torch from torch import nn from torch.util…

红包题第一弹

下载附件&#xff0c;发现有86个压缩包 现每个压缩包里面都有图片&#xff0c;010打开图片末尾都有base64部分&#xff0c;并且每个压缩包里面图片末尾的base64长度一样&#xff0c;刚好每一张的base64长度为100。猜测需要拼接起来然后解码 写个python脚本 import os import …

sql server 数据删除操作

删除 DELETE FROM table_name WHERE id < 10000; DELETE FROM [allmedia_restore] WHERE [SYS_DOCUMENTID] < 10000; 清空表 truncate table tableA truncate table [allmedia_restore].[dbo].[DOM_4_DOCLIB] 倒序排序 order by [字段] desc SELECT TOP 1000 [SYS_…

阿里云服务器9元1个月优惠价格表

阿里云服务器9元1个月优惠价格表&#xff0c;用不上9元&#xff0c;又降价了&#xff0c;只要5元。阿里云服务器一个月多少钱&#xff1f;最便宜5元1个月。阿里云轻量应用服务器2核2G3M配置61元一年&#xff0c;折合5元一个月&#xff0c;2核4G服务器30元3个月&#xff0c;2核2…

详解Mysql中redo log、undo log、bin log

目录 1 redo log&#xff08;重做日志&#xff09;2 undo log&#xff08;回滚日志&#xff09;3 Binlog&#xff08;二进制日志&#xff09;4 两阶段提交4.1 执行过程4.2 系统崩溃后重启如何刷新数据4.3 redo log 和 bin log区别 MySQL是一个关系型数据库管理系统&#xff0c;…