1. 前言

编写 frida JavaScript 脚本是一件 very 普遍的事情在 Android Reverse 中。为了方便编写,配置相关的环境使其能够自动补全是很关键的,即通过类名就能够获取该类的所有对外接口信息,这是面向对象编程的核心优势,可惜我没有对象。

首先我们还是要有一个信仰,相信这是能够配置好的,这个原因很简单,因为 frida 的控制台中就给出了相应的补全操作,只是因为操作不方便我才要去 VSCode 中配置。
在这里插入图片描述

2. 配置

In C/C++ 中我们只需要 #include 相应的头文件就能够达到在编写源码时的自动补全了,后续的补全操作都是由 MicrosoftIntelliSense 组件完成的。

同样的在 JavaScript 中包含相应的 .ts (TypeScript)文件就能够达到这样的效果。当然 .ts 绝对不是用来干这个的,只是我找到的 frida-gum 的相关文件是 .ts 的。相应的下载地址在这 @types/frida-gum。我下载的是 19.0.0 版本的,对应的 frida-17.2.* 这个版本的 APIfrida-16.1.0 是不同的,配置的时候需要找到对应版本的 index.d.ts 文件。

安装 node.js 后可以直接使用其附带的 npm 进行下载。After 下载,@types/frida-gum 目录下的 index.d.ts 复制到 Frida JavaScript 目录下即可。在文件开头添加下面的代码进行包含即可。

/// <reference path="./frida.d.ts" />

当然如果不 want 下载 node.js 可以直接从网页端产看代码,然后全选,复制到文件中保存,这里我要吐槽一下 npm 管理了,代码都展示出来了却不提供下载的接口。

完成包含后就可以在 VSCode 使用 Frida 的自动补全了。
在这里插入图片描述
[Append]:
我发现一个新的配置方式,能够将 Java 也配置好 in the meanwhile. Frida JavaScript API 中给出一个配置的方案,只需要去下载相应的 example 就可以了。不过在这里面也需要使用 npm,如果不 want 下载可以直接去看 package_lock.json 文件中的下载地址,只需要下载 frida-gumfrida-java-bride 就可以了。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

当然需要注意的一点是 TM frida-17 做了大改,把 Java 的相关 API 定义弄到了单独的文件中去,而在 17 之前则一个 frida-gum 就够了。
在这里插入图片描述

3. API 变化

frida-17.2.5frida-16.1.0API 是不一样的,这里我只能说我亲身体会到的一个例子,这个 Bug 我找了好久,修完之后 I just wanna say sun your mum frida

下面的代码是 frida-16.1.0 以及很多网上教程中常用的用来 Hook Android 加载库时的操作。但在 frida-17.2.5 中这样的操作是不行的。

Module.findExportByName(null, "dlopen");

当输入上述 JavaScript 之后会在得到这样的报错信息,出现这样错误的原因是 frida-17.2.5 中没有相应的 API 实现。
在这里插入图片描述
When 我去查看相应的 API 描述 in @type/frida-gum-19.0.0 时,发现在 Module 中只有一个 findExportByName 的实现,而其参数列表只接受一个参数,并且函数没有 static 关键字修饰,必须要实例化之后才能使用。
在这里插入图片描述

While in @type/frida-gum-15.2.0 中则是另一种情况,在其 Module 中有两个 findExportByName 的实现,并且其中一个使用 static 关键字修饰,即不需要实例化也能使用。这就是代码 Module.findExportByName(null, "dlopen") 为什么在 frida-16.1.0 中能够正常使用的原因。
在这里插入图片描述

4. Some Code

这部分是我用来记录自己写的 JavaScript 代码的位置,主要是给自己以后查阅。使用的是 frida-17.2.5。包括:查找 API 函数输出调用栈颜色字

/// <reference path="./frida.d.ts" />
const CMD_RED = "\x1b[31m";
const CMD_GREEN = "\x1b[32m";
const CMD_YELLOW = "\x1b[33m";
const CMD_BLUE = "\x1b[34m";
const CMD_MAGENTA = "\x1b[35m";
const CMD_CYAN = "\x1b[36m";
const CMD_WHITE = "\x1b[37m";
// Store original console.log
const originalLog = console.log;
// Override console.log
console.log = function(...args) {originalLog(args, CMD_WHITE);
};console.log(CMD_GREEN + "[+] Enter Hook");/*** get a export function by its name* @param {string} strName : the function you want to hook* @returns {fnPoint} : the address of the function*/
function FindExportByName(strName) {var fn = null;const Modules = Process.enumerateModules();for(let i = 0; i < Modules.length; i++) {fn = Modules[i].getExportByName(strName);if(fn) {console.log(`In Module : ${Modules[i].name}, Address is : ${fn}`);break;}};return fn;
}/*** print out a thread calling stack * @param {context} Context : the context of current Thread, can be obtained in Interceptor.attach() callback*/
function TraceStack(Context) {try {const backtrace = Thread.backtrace(Context, Backtracer.ACCURATE).map(DebugSymbol.fromAddress).map(sym => sym.name + CMD_YELLOW +'[' + sym.moduleName + ']');console.log(CMD_YELLOW + 'Backtrace:');backtrace.forEach((frame, i) => console.log(CMD_GREEN + "\t" + `${i}: ${frame}`));}catch(e) {console.log(CMD_RED + "\tStack trace unavailable");console.log(CMD_RED + `\t${e}`);}console.log(CMD_GREEN + "End Trace");
}// record which lib are loaded
var setLoged = new Set(["libstats_jni.so"]);
/*** if the module isn't record in setLoged, then print it.* @param {string} libPath : the module name that is loaded* @returns : if the first that load it return 1 else return 0.*/
function LogLib(libPath) {if(libPath && !setLoged.has(libPath)) {setLoged.add(libPath);console.log(CMD_CYAN + `Load Module : ${libPath}`);return 1;}return 0;//console.log(CMD_RED + `00: ${this}`);
}function TraceModuleLoad() {var fnOpen = FindExportByName("android_dlopen_ext");if(fnOpen) {var bThere = 0;var libPath;Interceptor.attach(fnOpen, {onEnter(args) {libPath = args[0].readCString();bThere = LogLib(libPath);//Thread.sleep(10);if(bThere) {TraceStack(this.context);}},onLeave(retval) {}})console.log("Complete dlopen hook install");}
}
// get all the load module when apk start
TraceModuleLoad();console.log(CMD_YELLOW + "[-] Hook Installed");

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

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

相关文章

FPGA矩阵算法实现

简介 现如今设计上对速度的要求越来越高&#xff0c;而矩阵相乘含有大量的乘法和加法计算&#xff0c;造成计算时间长从而影响性能&#xff0c;本章节利用FPGA实现浮点型矩阵运算&#xff0c;可在极短时间内完成矩阵运算。 知识介绍 矩阵计算公式如下&#xff1a; 需要保证A的…

C#可空类型详解:从基础到高级应用

C#可空类型详解&#xff1a;从基础到高级应用 在C#编程中&#xff0c;可空类型是一个非常重要的概念&#xff0c;它允许我们为值类型&#xff08;如int、bool、DateTime等&#xff09;分配null值&#xff0c;从而增强了代码的表达能力和灵活性。本文将详细介绍C#中可空类型的各…

Elasticsearch:异常检测入门

在我之前的文章里&#xff0c;我有讲述很多有关使用机器学习来针对数据做异常监测的文章。你可以在 “开发者上手指南” 里的 “机器学习” 章节中找到。在今天的练习中&#xff0c;我将使用最新的 Elastic Stack 9.0.2 来展示如何在 Elasticsearch 中使用机器学习的方法来进行…

ARuler3.1.3 | 高级版测量应用,利用AR技术测量所有

ARuler是一款非常便捷的测量应用程序&#xff0c;专为需要精确测量的用户设计。它不仅具备强大的3D测量功能&#xff0c;还利用增强现实&#xff08;AR&#xff09;技术&#xff0c;为用户提供多种测量选项&#xff0c;包括角度、长度、宽度、高度、面积和体积等。无论是日常生…

MapReduce分布式计算框架:从原理到实战

大家好&#xff01;今天我们来聊聊大数据处理领域的一个重要框架——MapReduce。作为Google提出的经典分布式计算模型&#xff0c;MapReduce极大地简化了海量数据的处理流程。无论你是大数据新手还是有一定经验的开发者&#xff0c;这篇文章都会让你对MapReduce有更深入的理解。…

Redis 7 及更高版本的脚本化方案

一、背景与动机 传统的 Redis 脚本机制依赖于客户端加载 EVAL 脚本&#xff0c;存在以下局限&#xff1a; 网络与编译开销 每次调用都要传输脚本源码或重新加载 SHA1。缓存失效风险 重启、主从切换、SCRIPT FLUSH 后脚本缓存丢失&#xff0c;事务易失败。调试与运维困难 SHA1…

Java项目:基于SSM框架实现的云端学习管理系统【ssm+B/S架构+源码+数据库+毕业论文】

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对课程学习信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性差…

【压力测试之_Jmeter链接Oracle数据库链接】

Oracle数据库链接 欢迎来到挖坑避坑课堂链接数据库 欢迎来到挖坑避坑课堂 之前性能测试都是业务之类的&#xff0c;数据库压测很少涉及&#xff0c;就会出现很多各式各样的问题&#xff0c;首要问题就是Jmeter链接数据库的问题&#xff0c;本篇主要讲解Jmeter链接Oracle数据库…

Appium与Appium Inspector配置教程

一、连接设备 首先将手机的开发者模式打开&#xff0c;不同手机的开启方法不同&#xff0c;这里演示的测试机为vivoS1&#xff0c;其他机型的开启方法大家可以自行AI搜索。 1.手机授权 &#xff08;1&#xff09;点击手机的【设置】选项 &#xff08;2&#xff09;打开手机…

【web出海】深度拆解 FLUX.1 kontext:这不仅是AI绘画的革命,更是 MicroSaaS 创业者的黄金机遇

前言 近日&#xff0c;Black Forest Labs 发布的 FLUX.1 Kontext 模型在AI圈掀起了波澜。它不仅仅是又一个文生图工具&#xff0c;其独特的“在情境中&#xff08;in-context&#xff09;”编辑、惊人的角色一致性、精准的局部修改和强大的文字渲染能力&#xff0c;标志着一个技…

Git 安装闭坑指南(仅 Windows 环境)

&#x1f4bb; Git 安装闭坑指南&#xff08;仅 Windows 环境&#xff09; 适用人群&#xff1a;刚开始用 Git 的 Windows 用户&#xff1b;重新配置开发环境的程序员&#xff1b;不想踩坑的团队小伙伴 目标&#xff1a;快速、稳定地安装 Git&#xff0c;在各种常见场景下避免“…

2025年4月SCI-吕佩尔狐优化算法Rüppell’s fox optimizer-附Matlab免费代码

引言 本期介绍一种新的元启发式算法——吕佩尔狐优化算法Rppell’s fox optimizer&#xff0c;RFO。RFO的灵感来自于吕佩尔狐狸在白天和晚上自然而聪明的集体觅食行为。优化器利用吕佩尔狐敏锐的视觉、听觉和嗅觉对其各种主要觅食活动进行数学模拟&#xff0c;在优化过程中兼顾…

SwiftUI 中的模糊效果详解:.blur、.material、UIVisualEffectView

模糊效果&#xff08;Blur Effect&#xff09;是 iOS 用户界面设计的重要组成部分&#xff0c;它被广泛应用于系统控制中心、通知背景、弹窗蒙版等场景&#xff0c;营造出“毛玻璃”的视觉层次感。 本文将深入解析 SwiftUI 中实现模糊效果的三种主流方式&#xff1a;.blur(radi…

Euler2203安装.NetCore6.0环境操作步骤

# 1. 下载.NET二进制包 wget https://download.visualstudio.microsoft.com/download/pr/xxxx/dotnet-sdk-6.0.xxx-linux-x64.tar.gz把dotnet-sdk-6.0.428-linux-x64.tar.gz放到一个目录里面# 2. 创建安装目录sudo mkdir -p /usr/share/dotnetsudo tar -zxf dotnet-sdk-6.0.428…

解决安装SunloginClient问题记录(Ubuntu 24.04.2)

成功安装流程&#xff08;Ubuntu 24.04.2&#xff09; 1. 首次尝试安装&#xff08;失败&#xff0c;缺少依赖&#xff09; sudo dpkg -i ./SunloginClient_15.2.0.63064_amd64.deb sudo apt-get install -f # 修复依赖&#xff08;此时提示缺少 libgconf-2-4&#xff09; …

wordpress安装教程

一、安装软件 1、apache sudo apt install apache2 -y 2、mysql sudo apt install mysql-server -y 3、PHP及其扩展 sudo apt install php libapache2-mod-php php-mysql php-curl php-gd php-mbstring php-xml php-xmlrpc php-soap php-intl php-zip php-fpm -y 重启ap…

C#,VB.NET从JSON数据里提取数组中的对象节点值

在VB.NET中&#xff0c;若要从 JSON 数据里提取Data.DataList数组中的CategoryId&#xff0c;并将其转换为VB.NET数组&#xff0c;可借助Json.NET&#xff08;Newtonsoft.Json&#xff09;库来实现。下面为你详细介绍具体的实现步骤和代码示例&#xff1a; 一、实现 JSON 到数…

Flutter 进阶:实现带圆角的 CircularProgressIndicator

在 Flutter 中&#xff0c;我们经常使用 CircularProgressIndicator 来展示加载进度。但是你是否注意到&#xff1a;它的进度端始终是“平头”的&#xff08;直角&#xff09;&#xff1f; 这在一些 UI 设计中并不美观&#xff0c;特别是想实现类似 Apple 健身环那样“前端圆清…

解决CentOS7下载docker-compose出现没有可用软件包问题

1 问题描述 今天在使用虚拟机CentOS 7系统安装docker-compose时&#xff0c;用的是aliyun镜像&#xff0c;出现没有可用软件包的问题&#xff0c;这就说明不是因为网络&#xff0c;而是因为aliyun镜像没有该软件包。 2 解决办法 这里推荐最稳定的解决办法&#xff0c;去docker-…

基于SpringBoot+Vue的酒类仓储管理系统

文档包含用例图、系统架构图、系统功能结构图、实体属性图、总体e-r图。一.系统开发工具与环境搭建1.系统设计开发工具后端使用Java编程语言的Spring boot框架项目架构&#xff1a;B/S架构运行环境&#xff1a;win10/win11、jdk17前端&#xff1a;技术&#xff1a;框架Vue.js&a…