FridaHook(二)——Native层函数

By ruanruan,2022.04.19

0x00 前言

下面是学习用Frida hook Native层的导出函数和未导出函数的记录。

demo下载链接:https://pan.baidu.com/s/1ZCIeJXzeTpQ8uJ9Ew5nnGQ
提取码:z94i

0x01 Hook导出函数

1、apk相关信息

关键代码:

在这里插入图片描述

用IDA分析,查找函数

在这里插入图片描述

点击按钮,实现1+2=3的功能

在这里插入图片描述

2、js代码

修改输出值3为指定值。

Java.perform(function(){ //下面这一句代码是指定要Hook的so文件名和要Hook的函数名,函数名即IDA导出表中显示的函数名var nativePointer = Module.findExportByName("libfridaso.so", "Java_com_example_fridaso_FridaSoDefine_FridaSo"); send("native: " + nativePointer); Interceptor.attach(nativePointer, { onEnter: function(args){ //进入该函数前要执行的代码,第三个参数才是传入的参数send(args[0]); send(args[1]); send(args[2].toInt32()); send(args[3].toInt32()); //send(args[4].toInt32()); }, onLeave: function(retval){ send(retval.toInt32()); retval.replace(10000);//将输出值替换为10000send(retval.toInt32());} });
});

retval对象只在 onLeave函数作用域范围内有效。

3、frida hook

一般顺序为:

手机运行frida

在这里插入图片描述

转发端口

adb forward tcp:27043 tcp:2703

手机运行app

查看pid,执行hook脚本

frida-ps -U

在这里插入图片描述

frida -U -l fridaso.js 22467

点击按钮。

命令行和app都能看到被篡改的结果为10000,而不是3。

在这里插入图片描述

在这里插入图片描述

也可以先点击按钮,再执行hook脚本。

4、踩坑

遇到的问题:

(1)python代码不能根据包名指定进程

在这里插入图片描述

(2)不能通过pid查找进程

在这里插入图片描述

(3)找不到基地址

在这里插入图片描述

解决:

后两个问题在确定js脚本没有问题,更换模拟器为测试机后,可以成功hook

第一个问题在之后需注意,使用python脚本进行hook时不能指定pid,在调用进程时按照包名查找不一定成功,最好还是用js脚本指定相应pid进行hook。

0x02 Hook未导出函数

1、apk相关信息

页面功能:

点击按钮显示3

在这里插入图片描述

MainActivity:

在这里插入图片描述

进一步查看

在这里插入图片描述

在Ghidra查看该函数

在这里插入图片描述

2、查看函数地址
(1)通过IDA查看地址

在这里插入图片描述

脚本1.1:

Java.perform(function(){ var soAddr = Module.findBaseAddress("libfridaso.so"); send('soAddr: ' + soAddr); var MD5FinalAddr = soAddr.add(0x0770+1); //1768为函数偏移量 send('MD5FinalAddr: ' + MD5FinalAddr); Interceptor.attach(MD5FinalAddr, { onEnter: function(args){send(args[0]); send(args[1]);}, onLeave: function(retval){ send(retval); } }); 
});
(2)通过Ghidra查看地址(X86_64)

在这里插入图片描述

脚本1.2:

Java.perform(function(){ var soAddr = Module.findBaseAddress("libfridaso.so"); send('soAddr: ' + soAddr); var MD5FinalAddr = soAddr.add(0x05cf+1); //1768为函数偏移量 send('MD5FinalAddr: ' + MD5FinalAddr); Interceptor.attach(MD5FinalAddr, { onEnter: function(args){send(args[0]); send(args[1]); send(args[2].toInt32()); send(args[3].toInt32()); }, onLeave: function(retval){ send("result: "+retval.toInt32()); } }); 
});
(3)最终版
  • 通过已导出的hook方法获得地址值

    在这里插入图片描述

    得到偏移地址为0x7966b8d5dc

  • 通过Ghidra查看地址(arm64)

    在这里插入图片描述

Java.perform(function(){ var soAddr = Module.findBaseAddress("libfridaso.so"); send('soAddr: ' + soAddr); var MD5FinalAddr = soAddr.add(0x05db+1); //1768为函数偏移量 send('MD5FinalAddr: ' + MD5FinalAddr); Interceptor.attach(MD5FinalAddr, { onEnter: function(args){send("111");send(args[0]); send(args[1]); send(args[2].toInt32()); send(args[3].toInt32()); }, onLeave: function(retval){ send("result: "+retval.toInt32()); } }); 
});

hook结果:

在这里插入图片描述

3、修改返回值

找到正确的偏移地址,再修改返回值就很简单了

(1)hook.js
Java.perform(function(){ var soAddr = Module.findBaseAddress("libfridaso.so"); send('soAddr: ' + soAddr); var MD5FinalAddr = soAddr.add(0x05db+1); //1768为函数偏移量 send('MD5FinalAddr: ' + MD5FinalAddr); Interceptor.attach(MD5FinalAddr, { onEnter: function(args){send(args[0]); send(args[1]); send(args[2].toInt32()); send(args[3].toInt32()); }, onLeave: function(retval){ send("result1: "+retval.toInt32()); retval.replace(2022);send("result2: "+retval.toInt32());} }); 
});

在这里插入图片描述

(2)运行结果

在这里插入图片描述

(3)APP显示

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

4、踩坑记录
(1)环境相关
A、测试机安装同电脑版本的magiskfrida报错

在这里插入图片描述

解决:搜索引擎搜不到相关报错,但从错误来看 会比较底层。最终通过安装高版本的magiskfrida解决

B、很多报错能通过修改时间解决,但是在使用NTP时间服务器来修改时间但不准确

原因是刷机时的时区设置问题,修改时区即可解决

(2)脚本相关
A、如何正确查看偏移地址问题

要根据所用测试机、模拟器的系统架构(arm64、X86…),来选择对应的so文件,再用Ghidra分析查看函数地址。

直接运行frida命令查看只会返回基地址和偏移量地址,进不了Interceptor接口

在这里插入图片描述

如果地址错误就会一直报错:拦截器找不到该地址的函数,说明是找的偏移地址错了。

在这里插入图片描述

B、frida命令参数–no-pause

进程直接执行

对比是否使用–no-pause参数,在这个场景对参数地址的运行结果影响不大

使用参数运行:

在这里插入图片描述

不用参数运行:

在这里插入图片描述

(3)小技巧
  • 遇到问题看官方文档:https://frida.re/docs/gadget/
  • 在cmd调试hook脚本时会更快发现问题
  • frida-ps -U查看app进程时可以加个a来查看当前正在运行的进程软件:frida-ps -Ua

0x03 总结

Hook导出函数主要是根据so文件中函数名来确定被Hook的函数,较为简单。而Hook 未导出函数是根据函数偏移量来确定被Hook的函数,但是一定要注意在使用工具反编译时要选对架构。也可以用Hook 未导出函数的方法来Hook导出函数。

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

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

相关文章

GPT-4与DALL·E 3:跨界融合,开启绘画与文本的新纪元

在人工智能的发展浪潮中,MidTool(https://www.aimidtool.com/)的GPT-4与DALLE 3的集成代表了一个跨越式的进步。这一集成不仅仅是技术的结合,更是艺术与文字的完美融合,它为创意产业带来了革命性的变革。本文将探讨GPT…

HCIA-Datacom题库(自己整理分类的)_09_Telent协议【13道题】

一、单选 1.某公司网络管理员希望能够远程管理分支机构的网络设备,则下面哪个协议会被用到? RSTP CIDR Telnet VLSM 2.以下哪种远程登录方式最安全? Telnet Stelnet v100 Stelnet v2 Stelnet v1 解析: Telnet 明文传输…

C++模板——(4)C++泛型编程与标准模板库简介

归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言​📝 勤奋,机会,乐观…

Java环境准备:JDK与IDEA

新手小白学Java–环境准备篇 文章目录 新手小白学Java--环境准备篇第1节 JDK的下载与安装第2节 IDEA的下载与安装第3节 使用IDEA创建第一个Java项目第4节 使用小技巧查看电脑的操作系统版本显示出文件的后缀名IDEA 修改字体大小IDEA 修改显示主题色IDEA 修改单行注释的颜色IDEA…

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-4系统的可控性Controllability(LTI)线性时不变

本文仅供学习使用 本文参考: B站:DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-4系统的可控性Controllability-LTI线性时不变

软件开发平台应用价值高吗?

我们都知道,随着行业的进步和社会的发展,低代码开发平台也拥有了非常可观的发展前景。利用软件开发平台,可以实现提质增效的办公效率,办公流程化发展也将提上日程。那么,您知道软件开发平台都拥有哪些优势特点吗&#…

ApolloCarla联合仿真基本操作

Apollo 系统架构 CANBus:对接车辆的底盘,做一些数据的收发,如油门,方向盘转角 HDMap: 给localization提供定位图层的信息给perception一些车道线、道路拓扑、红绿灯的信息(超时空感知)&#x…

geemap学习笔记045:单波段图像梯度计算

前言 求图像的梯度,一般是指在灰度图像或者彩⾊图像上的操作。数字图像是离散的点值谱,也可以叫⼆维离散函数。图像的梯度就是这个⼆维离散函数的求导。下面将详细介绍earth engine中单波段图像的梯度计算。 1 导入库并显示地图 import ee import gee…

医药公司重金请我用Ruby采集国产药品官方数据

爬虫程序是由一系列的代码组成的,通过这些代码,爬虫程序可以从网页中获取信息。今天有个医药公司想要一些药品数据,让我里一共Ruby编写一个爬虫程序,采集一些他们需要的药品数据信息,术业有专攻所以就找我这位大神过去…

MCU FT61F14x入门

目录 前言一、CMIDE的使用二、系统时钟与睡眠2.1 上电复位 (POR)与系统复位2.2 振荡器和系统时钟2.3 SLEEP睡眠模式 (POWER-DOWN)2.4 低电压检测/比较器 (LVD) 三、I/O端口与中断四、串口USART五、定时器六、ADC七、EEPROM 前言 FT61F14x是辉芒微电子的微控制器,是一…

BFC 2024寻龙之旅奇幻启程,龙运市集化身沪上摩登祈福地

2024年1月20日起,BFC外滩金融中心(下称BFC)“有龙则灵LONGTIME”奇幻秘境重磅登陆外滩,以东方传统文化为载体,打造当代都市传奇新篇。巨型金红神龙空降BFC,以波澜壮阔之势开启新春之旅。外滩枫径龙运市集迎…

uni微信小程序强制用户更新版本

强制更新的代码参考官方文档 uni.getUpdateManager() | uni-app官网 我这边的如下: //检查版本更新const updateManager uni.getUpdateManager();updateManager.onCheckForUpdate(function (res) {// 请求完新版本信息的回调console.log(res.hasUpdate, "是…

【深度学习目标检测】十三、基于深度学习的血细胞识别(python,目标检测,yolov8)

血细胞计数是医学上一种重要的检测手段,用于评估患者的健康状况,诊断疾病,以及监测治疗效果。而目标检测是一种计算机视觉技术,用于在图像中识别和定位特定的目标。在血细胞计数中,目标检测技术可以发挥重要作用。 首先…

2023年全国职业院校技能大赛(高职组)“云计算应用”赛项赛卷⑨

2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷9 目录 需要竞赛软件包环境以及备赛资源可私信博主!!! 2023年全国职业院校技能大赛(高职组) “云计算应用”赛项赛卷9 模块一 …

Kubernetes/k8s的存储卷/数据卷

k8s的存储卷/数据卷 容器内的目录和宿主机的目录挂载 容器在系统上的生命周期是短暂的,delete,k8s用控制创建的pod,delete相当于重启,容器的状态也会回复到初始状态 一旦回到初始状态,所有的后天编辑的文件都会消失…

Java零基础教学文档第四篇:HTML_CSS_JavaScript(1)

今日新篇章 【CSS】 【主要内容】 CSS简介 CSS基础语法 CSS选择器 CSS常用属性 CSS元素分类 CSS定位 【学习目标】 1.CSS的简介 1.1 CSS定义与解释** CSS是Cascading Style Sheets(层叠样式表单)的简称,CSS就是一种叫做样式表&…

2024年了,Layui再战三年有问题不?

v2.9.3 2023-12-31 2023 收官。 form 优化 input 组件圆角时后缀存在方框的问题 #1467 bxjt123优化 select 搜索面板打开逻辑,以适配文字直接粘贴触发搜索的情况 #1498 Sight-wcgtable 修复非常规列设置 field 表头选项时,导出 excel 出现合计行错位的…

Ubuntu系统中指定端口防火墙状态查询与操作

浏览器访问: 如果遇到如山图所示的情况,既有可能是防火墙的问题。具体解决方案参照如下: 1.指定端口的防火墙状态查询 (1)查询命令 sudo ufw status | grep 8081/tcp #其中8081为要查询的端口号 如果端口是打开的…

TDengine 时序数据库 研究学习以及实战

下载地址:TDengine 发布历史及下载链接 | TDengine 文档 | 涛思数据 下载客户端和服务端 服务端和客户端的安装后 TDengine 客户端连接工具地址:Archive Files | DBeaver Community 添加驱动 新增 》 设置 选择驱动类后 设置里的类名就自动填写了&…

Jetson nano 实时性测试,使用stress-ng 和 cyclictest

系统:ubuntu18.04,Jetpack4.3 打上了实时补丁 安装stress-ng和cyclictest sudo apt-get install stress-ng sudo apt-get install rt-tests 无负载情况的实时性 让两个CPU满载运行60秒 两个CPU满载实时性: 测了一下,4个CPU满载的…