一些常用的frida脚本

2024-06-09 19:04
文章标签 常用 脚本 frida

本文主要是介绍一些常用的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脚本的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1046035

相关文章

Java 字符数组转字符串的常用方法

《Java字符数组转字符串的常用方法》文章总结了在Java中将字符数组转换为字符串的几种常用方法,包括使用String构造函数、String.valueOf()方法、StringBuilder以及A... 目录1. 使用String构造函数1.1 基本转换方法1.2 注意事项2. 使用String.valu

java脚本使用不同版本jdk的说明介绍

《java脚本使用不同版本jdk的说明介绍》本文介绍了在Java中执行JavaScript脚本的几种方式,包括使用ScriptEngine、Nashorn和GraalVM,ScriptEngine适用... 目录Java脚本使用不同版本jdk的说明1.使用ScriptEngine执行javascript2.

VUE动态绑定class类的三种常用方式及适用场景详解

《VUE动态绑定class类的三种常用方式及适用场景详解》文章介绍了在实际开发中动态绑定class的三种常见情况及其解决方案,包括根据不同的返回值渲染不同的class样式、给模块添加基础样式以及根据设... 目录前言1.动态选择class样式(对象添加:情景一)2.动态添加一个class样式(字符串添加:情

解决Cron定时任务中Pytest脚本无法发送邮件的问题

《解决Cron定时任务中Pytest脚本无法发送邮件的问题》文章探讨解决在Cron定时任务中运行Pytest脚本时邮件发送失败的问题,先优化环境变量,再检查Pytest邮件配置,接着配置文件确保SMT... 目录引言1. 环境变量优化:确保Cron任务可以正确执行解决方案:1.1. 创建一个脚本1.2. 修

python写个唤醒睡眠电脑的脚本

《python写个唤醒睡眠电脑的脚本》这篇文章主要为大家详细介绍了如何使用python写个唤醒睡眠电脑的脚本,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 环境:win10python3.12问题描述:怎么用python写个唤醒睡眠电脑的脚本?解决方案:1.唤醒处于睡眠状

多模块的springboot项目发布指定模块的脚本方式

《多模块的springboot项目发布指定模块的脚本方式》该文章主要介绍了如何在多模块的SpringBoot项目中发布指定模块的脚本,作者原先的脚本会清理并编译所有模块,导致发布时间过长,通过简化脚本... 目录多模块的springboot项目发布指定模块的脚本1、不计成本地全部发布2、指定模块发布总结多模

shell脚本快速检查192.168.1网段ip是否在用的方法

《shell脚本快速检查192.168.1网段ip是否在用的方法》该Shell脚本通过并发ping命令检查192.168.1网段中哪些IP地址正在使用,脚本定义了网络段、超时时间和并行扫描数量,并使用... 目录脚本:检查 192.168.1 网段 IP 是否在用脚本说明使用方法示例输出优化建议总结检查 1

Linux使用nohup命令在后台运行脚本

《Linux使用nohup命令在后台运行脚本》在Linux或类Unix系统中,后台运行脚本是一项非常实用的技能,尤其适用于需要长时间运行的任务或服务,本文我们来看看如何使用nohup命令在后台... 目录nohup 命令简介基本用法输出重定向& 符号的作用后台进程的特点注意事项实际应用场景长时间运行的任务服

Java 枚举的常用技巧汇总

《Java枚举的常用技巧汇总》在Java中,枚举类型是一种特殊的数据类型,允许定义一组固定的常量,默认情况下,toString方法返回枚举常量的名称,本文提供了一个完整的代码示例,展示了如何在Jav... 目录一、枚举的基本概念1. 什么是枚举?2. 基本枚举示例3. 枚举的优势二、枚举的高级用法1. 枚举

IDEA常用插件之代码扫描SonarLint详解

《IDEA常用插件之代码扫描SonarLint详解》SonarLint是一款用于代码扫描的插件,可以帮助查找隐藏的bug,下载并安装插件后,右键点击项目并选择“Analyze”、“Analyzewit... 目录SonajavascriptrLint 查找隐藏的bug下载安装插件扫描代码查看结果总结Sona