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,一经查实,立即删除!

相关文章

【PHP】获取今日0点、昨日0点、本月初、上月初等时间戳方法总结

目录 1.今日0点 2.昨日0点 3.上个月初 4.本月初 5.本周、上周起始时间 6.N天、周、月、年以前的时间 1.今日0点 // 方法一: $today strtotime(date(Y-m-d)); echo $today// 方法二: $today strtotime(today); echo $today// 方法三: $…

【软件项目管理_软件工程】软件项目管理课后相关习题

(1)需求分析是回答系统必须(A)的问题。 A.做什么 B.怎么做 C.何时做 D.为谁做(2)WBS非常重要,下列哪项不是其很重要的原因(D)。 A.帮助组织工作 B.防止遗漏工作 C.为项目估算提供…

实现公共字段自动填充 (苍穹外卖)

问题 有些字段,如 : create_time,create_user , update_time , update_user是公共的,每次赋值都要重新编写代码,会造成代码冗余 ; 序号字段名含义数据类型1create_time创建时间datetime2create_user创建人idbigint3update_time修…

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…

712 - S-Trees (UVA)

题目链接如下&#xff1a; Online Judge 我的代码如下&#xff1a; #include <cstdio> // #define debugint n, m, kase 0; char loc[3], terminal[130], vva[8]; int order[7];int main(){#ifdef debugfreopen("0.txt", "r", stdin);freopen(&q…

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

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

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

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

ApolloCarla联合仿真基本操作

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

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

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

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

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

MCU FT61F14x入门

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

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

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

学习Vue全局事件总线总结

今天学习了Vue的全局事件总线和消息订阅与发布&#xff0c;它们两个都是为了实现任意组件之间的通信&#xff0c;全局事件总线是利用了Vue的一个重要的内置关系&#xff0c;就是组件构造函数原型的对象原型指向的是Vue原型&#xff0c;知道这个重要的指向之后&#xff0c;我们通…

经典目标检测YOLO系列(一)复现YOLOV1(5)模型的训练及验证

经典目标检测YOLO系列(一)复现YOLOV1(5)模型的训练及验证 之前&#xff0c;我们依据《YOLO目标检测》(ISBN:9787115627094)一书&#xff0c;提出了新的YOLOV1架构&#xff0c;继续按照此书进行YOLOV1的复现。 经典目标检测YOLO系列(一)YOLOV1的复现(1)总体架构 经典目标检测Y…

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

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

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

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

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

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