一些常用的frida脚本
这里整理一些常用的frida脚本,和ghidra 一起食用风味更佳~
Trace RegisterNatives
注意到从java到c的绑定中,可能会在JNI_OnLoad动态的执行RegisterNatives方法来绑定java层的函数到c行数,可以通过这个方法,来吧运行时时绑定的地址关联起来。
获取地址之后,ghidra 按G填入地址即跳转到目标位置
let nativeMethods = {"methods":[]}
let addrRegisterNatives = null
var yeshen_module_base = undefinedconst OURLIB = "libEngineNative.so" // Replace with yoursProcess.enumerateModules().forEach(function (m) { Module.enumerateSymbolsSync(m.name).forEach(function (s) { if (s.name.includes("RegisterNatives") && (!s.name.includes("CheckJNI"))) { addrRegisterNatives = s.address} })
})Interceptor.attach(addrRegisterNatives, {// jint RegisterNatives(JNIEnv *env, jclass clazz, const JNINativeMethod *methods, jint nMethods);onEnter: function (args) {var calledFromLibnOffset = String(DebugSymbol.fromAddress(this.returnAddress))if(!calledFromLibnOffset.includes(OURLIB)){ // Filter out a few calls return}// console.log("\nenv->RegisterNatives()")var nMethods = parseInt(args[3]);// console.log("\tnMethods="+nMethods);var class_name = Java.vm.tryGetEnv().getClassName(args[1]);// console.log("\tclazz.name="+class_name)// console.log("\tmethods[]:");var methods_ptr = ptr(args[2]);for (var i = 0; i < nMethods; i++) {var name_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize*3));var methodName = Memory.readCString(name_ptr);var sig_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize*3 + Process.pointerSize));var sig = Memory.readCString(sig_ptr);// console.log("\t\t"+methodName+"(), sig:", sig)var fnPtr_ptr = Memory.readPointer(methods_ptr.add(i * Process.pointerSize*3 + Process.pointerSize*2));var find_module = Process.findModuleByAddress(fnPtr_ptr);yeshen_module_base = find_module.base;var fnPtr_ptr_ghidra = ptr(fnPtr_ptr).sub(find_module.base).add(0x00100000)// console.log("\t\t\tfnPtr:", fnPtr_ptr, " ghidraOffset:", fnPtr_ptr_ghidra);nativeMethods["methods"].push({ghidraOffset : fnPtr_ptr_ghidra,methodName : class_name+"."+methodName})}}
})// let the script run for a bit,
// then dump the "nativeMethods" object on the Frida interpreter
// or uncomment the console.log statements to dump all invocations like below:// env->RegisterNatives()
// nMethods=1
// clazz.name=com.app.jni.PhoneControllerHelper
// methods[]:
// handleSendIM2Message(), sig: (Lcom/app/jni/MessageWrite;)Z
// fnPtr: 0x733a924280 ghidraOffset: 0x1d7280
Trace sprintf
注意到sprintf可能会把关键的信息拼接出来,所以挂一个,把目标so的这个函数调用打出来
var libyeshenbaseModule = "libyeshen.so"
const sprintfAddress = Module.findExportByName(libyeshenbaseModule, "sprintf");
Interceptor.attach(sprintfAddress, {onEnter: function (args) {this.args1 = args[0];var fnPtr_ptr_ghidra = ptr(this.returnAddress).sub(yeshen_module_base).add(0x00100000)var caller = DebugSymbol.fromAddress(this.returnAddress);this.args2 = "sprintf is called from: " + caller + ",ghidraOffset:" + fnPtr_ptr_ghidra;},onLeave: function (retval) {ALOGE("sprintf result: " + Memory.readUtf8String(this.args1) + "," + this.args2);}
});
Trace opendir
禁止目标so对opendir的访问和记录。
var libyeshenbaseModule = "libyeshen.so"
Interceptor.attach(Module.findExportByName(libyeshenbaseModule, 'opendir'), {onEnter: function (args) {var filename = Memory.readUtf8String(args[0]);if(filename.startsWith("/proc/self/net") || filename.startsWith("/sbin") || filename == "/"|| filename == "/sys/devices/system/cpu"){args[0] = ptr(0);ALOGE("opendir:" + filename + " forbidden.");}else{ALOGE("opendir:" + filename);}},onLeave: function (retval) {}
});
Trace readdir
Interceptor.attach(Module.findExportByName(libyeshenbaseModule, 'readdir'), {onEnter: function (args) {var filename = Memory.readUtf8String(args[0]);ALOGE("readdir:" + filename);},onLeave: function (retval) {}
});
Trace fread
Interceptor.attach(Module.findExportByName(libyeshenbaseModule, 'fread'), {onEnter: function (args) {var buffer = args[0];var size = args[1];var nmemb = args[2];var file = args[3];// var data = Memory.readUtf8String(buffer, size);ALOGE("fread:" + buffer + ", size: " + size + ", nmemb: " + nmemb + ", file: " + file );//+ ',data:' + data);// ALOGE("--fread end")},onLeave: function (retval) {}
});
Trace open & read
Interceptor.attach(Module.findExportByName(libyeshenbaseModule, 'open'), {onEnter: function (args) {var path = Memory.readUtf8String(args[0]);// if(path.startsWith("/proc") && path.endsWith("/maps")){if (path == "/data" || path == "/data/app" || path == "/mnt" || path == "/system/framework" || path == "/sbin" || path == "/proc/cpuinfo" || path == "/proc/self/net" || path == "/proc/self/net/unix"){ALOGE("Access to " + path + " is denied"); args[0] = ptr("-1");// 修改返回值为 -1,表示打开文件失败}else if (path.startsWith("/proc") && (path.endsWith("/maps") || path.endsWith("/status") || path.endsWith("/cmdline") || path.endsWith("/meminfo") || path.endsWith("/stat"))) {ALOGE("Access to " + path + " is denied"); args[0] = ptr("-1");// 修改返回值为 -1,表示打开文件失败}else {ALOGE('open path:' + path);}}
});Interceptor.attach(Module.findExportByName(libyeshenbaseModule, 'read'), {onEnter: function (args) {var fd = args[0].toInt32();var buffer = args[1];var count = args[2].toInt32();var data = Memory.readUtf8String(buffer, count);ALOGE('---read fd:' + fd + ', count: ' + count + ',data:' + data);ALOGE("---read end")}
});
Trace custom address read in ghidra
var target_ptr_ghidra_1 = 0x001063e8;
var target_ptr_apply_1 = ptr(target_ptr_ghidra_1).sub(0x00100000).add(yeshen_module_base);
Interceptor.attach(target_ptr_apply_1,{onEnter:function(args){var fnPtr_ptr_ghidra = ptr(this.returnAddress).sub(yeshen_module_base).add(0x00100000)this.input = ",input:" + Memory.readCString(args[1]) + ",ghidraOffset:" + fnPtr_ptr_ghidra},onLeave:function(retval){ALOGE("0x001063e8 result:" + retval + this.input);// 0x001063e8 result:0x0,inputx86,ghidraOffset:0x11ab68retval.replace(0);}
});
Replace custom address‘s function to void
var target_ptr_ghidra_root = 0x11e7b0;
var target_ptr_apply_root = ptr(target_ptr_ghidra_root).sub(0x00100000).add(yeshen_module_base)
Interceptor.replace(target_ptr_apply_root, new NativeCallback(() => {// ALOGE("void 0x1e7b0 called")
}, 'void', []));
相关文章:
一些常用的frida脚本
这里整理一些常用的frida脚本,和ghidra 一起食用风味更佳~ Trace RegisterNatives 注意到从java到c的绑定中,可能会在JNI_OnLoad动态的执行RegisterNatives方法来绑定java层的函数到c行数,可以通过这个方法,来吧运行…...
计算机二级Access操作题总结——简单应用
查询设计 创建一个查询,能够在客人每次结账时根据客人的姓名提示统计这个客人已住天数和应交金额,并显示“姓名”、“房间号”、“已住天数”和“应交金额”,所建查询命名为“qT2”。 注:输入姓名时应提示“请输入姓名”。已住天…...
C#操作MySQL从入门到精通(21)——删除数据
前言: 谈到数据库,大家最容易脱口而出的就是增删改查,本文就是来详细介绍如何删除数据。 本文测试使用的数据库如下: 1、删除部分数据 使用delete 关键字,并且搭配where条件使用,否则会导致表中数据全部被删除 string sql = string.Empty;if (radioButton_DeletePart…...
【iOS】JSONModel源码阅读笔记
文章目录 前言一、JSONModel使用二、JSONModel其他方法转换属性名称 三、源码分析- (instancetype)initWithDictionary:(NSDictionary*)dict error:(NSError **)err[self init]__setup____inspectProperties - (BOOL)__doesDictionary:(NSDictionary*)dict matchModelWithKeyMa…...
如何离线下载 Microsoft Corporation II Windows Subsystem for Android
在本文中,我们将指导您通过一个便捷的步骤来离线下载 Microsoft Corporation II Windows Subsystem for Android。这个过程将利用第三方工具来生成直接下载链接,从而让您能够获取该应用程序的安装包,即使在没有访问Microsoft Store的情况下也…...
使用 flask + qwen 实现 txt2sql 流式输出
前言 一般的大模型提供的 api 都是在提问之后过很久才会返回对话内容,可能要耗时在 3 秒以上了,如果是复杂的问题,大模型在理解和推理的耗时会更长,这种展示结果的方式对于用户体验是很差的。 其实大模型也是可以进行流式输出&a…...
植物大战僵尸杂交版最新2.0.88手机+电脑+苹果+修改器
在这个充满奇妙的平行宇宙中,植物和僵尸竟然能够和谐共存!是的,你没听错!一次意外的实验,让这两个看似对立的生物种类发生了基因杂交,创造出了全新的生物种类——它们既能够进行光合作用,也具备…...
Vite - 开发初体验,以及按需导入配置
目录 开始 创建一个 Vite 项目 项目结构 /src/main.js index.html package.json vite.config.js Vite 项目中使用 vue-router Vite 组件的“按需引入” 传统的方式引入一个组件 传统方式引入带来的问题 解决办法(配置 按需引入 插件) 示例&…...
推荐云盘哪个好,各有各的优势
选择合适的云盘服务是确保数据安全、便捷分享和高效协作的关键。下面将从多个维度对目前主流的云盘服务进行详细的对比和分析: 速度性能 百度网盘青春版:根据测试,其上传和下载确实不限速,但主要定位是办公人群,适用于…...
面试题之webpack与vite系列
今天继续来分享面试题,今天要分享的技术是webpack和vite的一些区别,下面我列举了最常见的关于webpack和vite的面试题,主要有以下几个: 1.说说你对webpack的理解?plugin和loader有什么区别? Webpack是一个…...
单调队列 加 二分
雾粉与最小值(简单版) 链接: 牛客 思路 题意是 给定我们数组a让我们完成{x,l,r}询问,判断是否在a中存在子数组满足长度在l,r之间且子数组最小值大于等于x,输出yes 或者 on 一个数组,长度越长,其最小值越小ÿ…...
Node.js 和 Vue 的区别的基本知识科普
Node.js和Vue.js在多个方面存在显著的区别。以下是这两者的主要区别,按照清晰的分点表示和归纳: Node.js 服务器端环境: Node.js是一个基于Chrome V8引擎的JavaScript运行环境,它使JavaScript能够在服务器端运行。为JavaScript提供服务器端的环境服务,方便地搭建响应速度…...
统计信号处理基础 习题解答10-10
题目 在本题中,我们讨论再生PDF。回顾前面 其中分母与无关。如果选择一个,使得它与相乘时,我们得到与相同形式的PDF,那么后验PDF 将有和相同的形式。例10.1的高斯PDF正是这样的一种情况。现在假设在条件下的的PDF是指数形式&…...
【蓝桥杯】C语言常见高级算法
🌸个人主页:Yang-ai-cao 📕系列专栏:蓝桥杯 C语言 🍍博学而日参省乎己,知明而行无过矣 目录 🌸个人主页:Yang-ai-cao 📕系列专栏:蓝桥杯 C语言 &a…...
FastJson
目录 FastJson 新建一个SpringBoot项目 pom.xml 一、JavaBean与JSON数据相互转换 LoginController FastJsonApplication启动类 编辑二、FastJson的JSONField注解 Log实体类 TestLog测试类 三、FastJson对JSON数据的增、删、改、查 TestCrud FastJson 1、JSON使用手册…...
Web3设计风格和APP设计风格
Web3设计风格和传统APP设计风格在视觉和交互设计上有一些显著的区别。这些差异主要源于Web3技术和理念的独特性,以及它们在用户体验和界面设计中的具体应用。以下是Web3设计风格与传统APP设计风格的主要区别。北京木奇移动技术有限公司,专业的软件外包开…...
使用React和GraphQL进行CRUD:完整教程与示例
在本教程中,我们将向您展示如何使用GraphQL和React实现简单的端到端CRUD操作。我们将介绍使用React Hooks读取和修改数据的简单示例。我们还将演示如何使用Apollo Client实现身份验证、错误处理、缓存和乐观UI。 什么是React? React是一个用于构建用户…...
matplotlib 动态显示训练过程中的数据和模型的决策边界
文章目录 Github官网文档简介动态显示训练过程中的数据和模型的决策边界安装源码 Github https://github.com/matplotlib/matplotlib 官网 https://matplotlib.org/stable/ 文档 https://matplotlib.org/stable/api/index.html 简介 matplotlib 是 Python 中最常用的绘图…...
【学术小白成长之路】02三方演化博弈(基于复制动态方程)期望与复制动态方程
从本专栏开始,笔者正式研究演化博弈分析,其中涉及到双方演化博弈分析,三方演化博弈分析,复杂网络博弈分析等等。 先阅读了大量相关的博弈分析的文献,总结了现有的研究常用的研究流程,针对每个流程进行拆解。…...
短剧看剧系统投流版系统搭建,前端uni-app
目录 前言: 一、短剧看剧系统常规款短剧系统和投流版的区别? 二、后端体系 1.管理端: 2.代理投流端 三、功能区别 总结: 前言: 23年上半年共上新微短剧481部,相较于2022年全年上新的454部࿰…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...
linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
RocketMQ延迟消息机制
两种延迟消息 RocketMQ中提供了两种延迟消息机制 指定固定的延迟级别 通过在Message中设定一个MessageDelayLevel参数,对应18个预设的延迟级别指定时间点的延迟级别 通过在Message中设定一个DeliverTimeMS指定一个Long类型表示的具体时间点。到了时间点后…...
边缘计算医疗风险自查APP开发方案
核心目标:在便携设备(智能手表/家用检测仪)部署轻量化疾病预测模型,实现低延迟、隐私安全的实时健康风险评估。 一、技术架构设计 #mermaid-svg-iuNaeeLK2YoFKfao {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg…...
智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...
安宝特方案丨XRSOP人员作业标准化管理平台:AR智慧点检验收套件
在选煤厂、化工厂、钢铁厂等过程生产型企业,其生产设备的运行效率和非计划停机对工业制造效益有较大影响。 随着企业自动化和智能化建设的推进,需提前预防假检、错检、漏检,推动智慧生产运维系统数据的流动和现场赋能应用。同时,…...
汇编常见指令
汇编常见指令 一、数据传送指令 指令功能示例说明MOV数据传送MOV EAX, 10将立即数 10 送入 EAXMOV [EBX], EAX将 EAX 值存入 EBX 指向的内存LEA加载有效地址LEA EAX, [EBX4]将 EBX4 的地址存入 EAX(不访问内存)XCHG交换数据XCHG EAX, EBX交换 EAX 和 EB…...
使用 SymPy 进行向量和矩阵的高级操作
在科学计算和工程领域,向量和矩阵操作是解决问题的核心技能之一。Python 的 SymPy 库提供了强大的符号计算功能,能够高效地处理向量和矩阵的各种操作。本文将深入探讨如何使用 SymPy 进行向量和矩阵的创建、合并以及维度拓展等操作,并通过具体…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
AI病理诊断七剑下天山,医疗未来触手可及
一、病理诊断困局:刀尖上的医学艺术 1.1 金标准背后的隐痛 病理诊断被誉为"诊断的诊断",医生需通过显微镜观察组织切片,在细胞迷宫中捕捉癌变信号。某省病理质控报告显示,基层医院误诊率达12%-15%,专家会诊…...
