常用的 Android frida hook 代码片段

【Frida Hook 学习记录】Frida Hook Android 常用方法 Frida hook 常用方法 1 概述 在逆向过程中,Frida是非常常用的Hook工具,这个工具在日常使用的过程中,有很多通用方法,这里记录一下,方便查阅 参考文章 Android逆向之旅—Hook神器家族的Frida工具使用详解 2 待测试案例 xxxxx 3 方法汇总 3.1 Hook 构造函数—使用$init 3.2 Hook 构造对象—使用$new 3.3 Hook 一般函数—使... 阅读详情

1.获取 com.example.ClassName类,并修改其中的 getVip(i) 方法。

Java.perform(function () {
    var targetClass= Java.use('com.example.ClassName')//改为需要hook的类名
    //重写其中的getVip(i) 函数
    targetClass.getVip.implementation = function (i) {
      console.log('i: ', i);
      var result = this.getVip(i);
      console.log('result: ', result);
      return result;
    }
});

2.从内存中寻找包含 com.example.ClassName的类,并打印出来

Java.perform(function() {
    Java.enumerateLoadedClasses({
        onMatch: function(className) {
            if (className.includes('com.example.ClassName')) {////改为需要hook的类名
                console.log(className);
            }
        },
        onComplete: function() {
            console.log('Class enumeration complete');
        }
    });
});

3.获取某类中的所有成员变量 打印:名称+数值+类型

Java.perform(function() {
    // 找到目标类
    var targetClass = Java.use('com.example.ClassName');//改为需要hook的类名
    // hook指定函数从而找到实例,打印实例中所有的字段
    targetClass.e.implementation = function(str) {
        var fields = this.class.getDeclaredFields();
        for (var i = 0; i < fields.length; i++) {
            fields[i].setAccessible(true);//确保可以访问
            console.log("[*] Field " + fields[i].getName() + ": " + fields[i].get(this)," Type: ",fields[i].getType().getName());
            
        }
    }
});

4.Hook 已经存在的实例,通过构造函数或内存查找找到实例,从而调用其中的函数。不通过拦截某函数的方式。

global.instances = [];// 存储实例的全局数组
Java.perform(function () {
    // 获取目标类
    var MyClass = Java.use('com.example.ClassName');

    // Hook构造函数以捕获新创建的实例,重写构造函数时需要具体修改传入的变量类型'java.lang.String'
    MyClass.$init.overload('java.lang.String').implementation = function (str) {
        console.log('MyClass instance created');
        var instance = this;
        // 将实例存储到全局数组中
        global.instances.push(instance);
        return this.$init(str);
    };

    // 查找所有已经存在的实例
    Java.choose('com.example.ClassName', {
        onMatch: function (instance) {
            console.log('Found instance: ' + instance);
            global.instances.push(instance);
        },
        onComplete: function () {
            console.log('Instance search complete');
        }
    });
    
    // 调用方法示例
    Java.perform(function () {
        if (global.instances.length > 0) {
            var instance = global.instances[0]; // 获取第一个实例
            console.log('Calling myMethod on: ' + instance);
            instance.myMethod(); // 调用方法
        } else {
            console.log('No instances found');
        }
    });
});

5.打印构造函数的调用堆栈(通过抛出错误来获取)

Java.perform(function () {
    // 替换`com.example.ClassName`为你要监控的类名
    var targetClass = 'com.example.ClassName';
    var targetConstructor = Java.use(targetClass).$init.overload('long', 'java.lang.ref.WeakReference', 'boolean');//参数需要根据具体的构造方法修改
    
    targetConstructor.implementation = function (param1, param2, param3) {
        console.log('Constructor of ' + targetClass + ' called with parameters:');
        console.log('param1: ' + param1);
        console.log('param2: ' + param2);
        console.log('param3: ' + param3);
        
        // 获取当前的调用堆栈
        var stackTrace = Java.use('android.util.Log').getStackTraceString(Java.use('java.lang.Exception').$new());
        console.log(stackTrace);
        
        // 调用原始构造函数
        return targetConstructor.call(this, param1, param2, param3);
    };
});

6.当某实例类作为参数传入时,通过反射来修改其实例类中的私有字段

Java.perform(function() {
    // 找到目标类
    var targetClass = Java.use('com.example.ClassName');

    // hook指定函数从而找到实例,打印实例中所有的字段
    targetClass.D0.implementation = function(userInfo) {
        console.log("==================");

        // 使用反射来访问和修改字段
        var fieldName = 'someFieldName'; // 替换为实际的字段名
        var field = userInfo.class.getDeclaredField(fieldName);
        field.setAccessible(true); // 确保可以访问
        
        // 打印原始字段值
        console.log("[*] Before modification: " + field.get(userInfo));
        
        // 修改字段值
        field.set(userInfo, 'newValue'); // 替换'newValue'为你想设置的值
        fields.set(this, Long.$new(6666));//设置的值必须复合要求的格式
        
        // 打印修改后的字段值
        console.log("[*] After modification: " + field.get(userInfo));

        // 调用原始函数
        this.D0(userInfo);
        return;
    };
});

7.其他:

获取内部类:

const className = Java.use('外部类$内部类') //通过添加 $ 符号

当变量与函数名称一样时,修改变量的值:

this._a.value='1'; //在要修改的变量名前面加下划线_

获取匿名类:
匿名类根据内存生成,没有显式的类名,通过 smali 代码来判断,获取到的可能像下面这样:

const className = Java.use('包名.MainActivity$1') // 匿名类名称:1,调用类似内部类

获取所有类:

Java.enumerateLoadedClassesSync() // 同步获取已加载所有类,返回一个数组
Java.enumerateLoadedClasses() // 异步

加载类下所有方法,属性:

const Utils = Java.use('com.example.ClassName')
const methods = Utils.class.getDeclaredMethods() // 方法
const constructors = Utils.class.getDeclaredConstructors() // 构造函数
const fields = Utils.class.getDeclaredFields() // 字段
const classes = Utils.class.getDeclaredClasses() // 内部类
const superClass = Utils.class.getSuperclass() // 父类(抽象类)
const interfaces = Utils.class.getInterfaces() // 所有接口

类型转换:
将 variable 转换为 String类型

var StringClass=Java.use("java.lang.String");
var NewTypeClass=Java.cast(variable,StringClass);

自己初始化一个实例并调用参数:

var ClassName=Java.use("com.example.ClassName");
var instance = ClassName.$new();//创建一个实例,$new 实际代表调用构造方法
instance.func();

8.函数参数类型表示:

当重载某个函数时,frida需要根据参数的类型来找到特定的重载函数,参数类型如果是基本类型,可直接用其Java/JavaScript中的名称,如果是基本类型数组需要左括号加缩写,如果是普通类型,则需要类名全拼。如下:

  1. 基本类型不变:int short char byte boolean float double long
类型重载时
boolean[][Z
byte[][B
char[][C
double[][D
float[][F
int[][I
long[][J
short[][S
  1. 任意类: 完整类名 例如:java.lang.String
  2. 对象数组:加左括号 例如: [java.lang.String

不同的 frida 版本的区别:

  1. frida-clr-16.3.0:
    这是一个用于 .NET/CLR (Common Language Runtime) 平台的 Frida 版本。它允许在 .NET 应用程序中进行动态分析和调试。
  2. frida-core-devkit-16.3.0:
    这是 Frida 核心库的开发工具包,提供了核心 API 的头文件和库,用于开发自定义的 Frida 应用。
  3. frida-gadget-16.3.0:
    Frida Gadget 是一个轻量级的嵌入式版本,适合于将 Frida 集成到现有的应用程序中,特别是移动设备上的应用。
  4. frida-gum-devkit-16.3.0:
    Gum 是 Frida 的低级 API,用于提供跨平台的代码注入功能。这个开发工具包包含了使用 Gum 的必要文件。
  5. frida-gumjs-devkit-16.3.0:
    这是一个基于 Gum 的 JavaScript 引擎开发工具包,使开发者可以使用 JavaScript 进行跨平台的代码注入。
  6. frida-inject-16.3.0:
    这是 Frida 用于将代码注入到目标进程的工具,允许用户在运行时将脚本注入到应用程序中。
  7. frida-portal-16.3.0:
    Frida Portal 是一个 Web 界面,用于管理和监控 Frida 实例,方便用户进行远程操作。
  8. frida-qml-16.3.0:
    这是用于 QML (Qt Modeling Language) 应用程序的 Frida 版本,适用于 Qt 开发者。
  9. frida-server-16.3.0:
    Frida Server 是运行在目标设备上的一个服务,使得远程设备可以被 Frida 控制和调试。常用于 Android 和 iOS 设备。
  10. frida-v16.3.0-electron:
    这是一个预编译的 Frida 版本,适用于基于 Electron 框架的应用程序,方便开发者进行调试和分析。
  11. frida-v16.3.0-node:
    这是一个预编译的 Frida 版本,适用于 Node.js 应用程序,帮助开发者在 Node.js 环境中进行动态分析。
  12. frida_16.3.0_appletvos:
    这是 Frida 适用于 Apple TV (tvOS) 的版本,帮助开发者在 Apple TV 上进行应用分析和调试。
  13. frida_16.3.0_iphoneos:
    这是 Frida 适用于 iOS 设备 (如 iPhone、iPad) 的版本,帮助开发者在 iOS 设备上进行应用分析和调试。

Android逆向之旅—Hook神器Frida使用详解 一、前言 在逆向过程中有一个Hook神器是必不可少的工具,之前已经介绍了Xposed和Substrate了,在不同场景下面这两个框架工具具备各自的用途,当然Xposed现在也是我最常用的框架工具,不了解的同学可以看这两篇文章:Android中Hook神器Xposed工具介绍和Android中Hook神器SubstrateCydia工具介绍这两篇文章非常重要一个是Hook Java层的时候最... 阅读详情

相关推荐

一文搞懂如何使用 Frida Hook Android App

根据自己的 android 版本,降级或升级 frida、frida-tool、frida-server的版本即可,比如 android10 实测可用的版本如下。创建 frida-server-upload.bat,实现拖入 frida-server 直接推送到设备并添加执行权限。在安装 frida 时候提示找不到 frida-14.2.18-py3.8-win-amd64.egg。创建 frida-server-start.bat,实现一键启动 frida-server 并转发端口。

3088

Frida Hook 代码片段

jnitrace是一个Frida模块,跟踪Android应用程序中JNIAPI的使用情况。使用DroidSSLUnpinning项目,这是github上开源项目,把想Hook的类的完整包名,卸载distClassArr数组中。参数-o,指定Frida的输出日志到文件。同样是github上开源项目,工具的下面这个命令,直接将。

lihuayong的专栏 793

Frida Android hook

From:https://eternalsakura13.com/2020/07/04/frida/ 目录 1、r0ysue 大佬 2、Frida 环境 2.1 pyenv 2.2 frida 安装 2.3 安装 objection 2.4 frida 使用 frida 帮助 和 frida-server 帮助 2.5 frida 开发...

墨鱼菜鸡 4735

frida的hook代码:在python中格式,以及常用hook方法

简单的聊了一些frida在python中使用的格式: Java.perform(),以及Java.use或者Java.choose ,还有对重载方法的调用。

u011863822的博客 4117

安卓安装frida-server Hook

刚开始学习安卓逆向, 遇到的一大堆坑, 所以先记录下来, 不管是用于分享学习或者用于日记记录也好 首先你需要有一台Root了的手机, 如果没有用3.2版本的雷电模拟器或者买一台Google的pixel 1 前置需求就不多说了, adb jdk python环境之类的安装, root, 开发者选项打开usb调试, OEM解锁 安装frida和frida-tools 首先先去下载frida-server所需文件https://github.com/frida/frida/releases frida f

qq_43181451的博客 4366

Android逆向-Frida的Hook之旅

有多长,所以我读取了256个字节,那这256个字节肯定不是我全想要的,我们知道文件名中肯定不能存在0x00字节,而且C语言中字符串是要以0x00**‘\0’作为截断的,所以我用 split(b’\x00’)[0]分割字符串并且取列表中的第一项输出到文件。细心的同学可能会发现,我这次没有用spawn()函数来启动chrome应用,因为如果你想hook的动作如果不是在程序开始就进行的话,而是可控的动作,那么你直接attach到其相应的进程上就好了,这样可以避免我从程序一开始就大量hook open,

LiuJP的博客 1558

Frida—HOOK 学习笔记2

frida

天在等我,菜鸟想飞 4040

安卓hook工具Frida怎么安装

虽然网上一堆教程,但是我能说我搞定整个环境用了整整3天!! 中间踩了一堆坑,总之就是frida需要的各部分版本需要能互相兼容!最后我成功的版本是python3.7+frida 12.7.5+ frida-server x86 +win10+夜神模拟器安卓5.1,每一部分的版本我都换过才解决了所有问题,所以不想浪费时间的就老老实实得装一样的版本吧。 首先本机安装python3的frida模块和fri...

Memory_and_Dream的博客 1535

技术分享 | Frida 实现 Hook 功能的强大能力

Frida 通过 C 语言将 QuickJS 注入到目标进程中,获取完整的内存操作权限,达到在程序运行时实时地插入额外代码和数据的目的。官方将调用代码封装为 python 库,当然你也可以直接通过其他的语言调用 Frida 中的 C 语言代码进行操作。

hogwarts_beibei的博客 808

基于frida的so函数hook实战

一、环境 win10、python38、frida库、夜神模拟器 (1)安装frida环境 (a)frida python -m pip install frida //运行python38版本 //python -m module_name相当于python /path/to/module.py(当我们知道一个模块的名字,但不知道它的路径时,我们可以通过 -m 参数) 假如以上方法出错,建议本地下载frida包安装 https://pypi.org/project/frida/#files(选择f

Haward 1万+

安卓 Frida 实战指南:从环境搭建到 Hook 攻防,手把手玩转动态插桩

Frida作为动态插桩领域的佼佼者,为开发者提供了强大的调试与分析能力,无论是应用调试、安全审计还是逆向研究,都能发挥重要作用。但同时,开发者也需重视应用安全防护,通过合理的技术手段平衡功能与安全。掌握Frida的核心用法,将为你的移动开发与安全研究之路增添一项关键技能。赶紧动手实践起来,体验动态插桩的魅力吧!

VBP_2025的博客 2531

【FridaHook整理】Frida安装及Hook安卓常用脚本

1 概述 在逆向过程中,Frida是非常常用的Hook工具,这个工具在日常使用的过程中,有很多通用方法,这里记录一下,方便查阅,部分函数使用的时候,可能需要稍微修改一下,本文记录是Android的方法,不涉及其他的 主要是搬迁的一下参考文章的片段 Android逆向之旅—Hook神器家族的Frida工具使用详解 Frida官方文档 看雪 Frida官方手册 - JavaScript API(篇一) 看雪 Frida官方手册 - JavaScript API(篇二) Js中几种String Byte转换方法

杰孑的博客 4万+

frida加密参数通杀hook代码(免脱壳)

【代码】frida加密参数通杀hook代码(免脱壳)

云霄IT的博客 4746

Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控

Frida Hook 常用函数、java 层 hook、so 层 hook、RPC、群控

freeking101的博客 2万+

python之frida安卓逆向之hook大法好

pip install frida-tools pip install frida 运行以上代码安装frida

云霄IT的博客 5982

frida server android arm

frida server android arm frida 相对应的server版本:(注意要跟frida的版本一致) 解压缩之后使用 Frida 分为客户端和服务端。 客户端:PC(控制端) 服务器:手机设备(被控制端) 客户端编写的 Python 代码,用于连接远程设备,提交要注入的 JS 代码到服务端,接受服务端发来的消息。 服务端中需要用 JS 代码注入到目标进程,操作内存数据,给客户端发送消息。

Frida 安卓逆向破解辅助Hook

用到的工具 Frida 夜神模拟器或者手机 Python3.7.2 Window系统 安装python Python3.7.2 下载地址 win+R 输入cmd,在控制台中输入python,看到如下信息说明安装成功 安装Frida 在命令行中输入 pip install frida 安装完成后再命令行中输入 frida --version 安装成功 安装模拟器 或者使用手机(这里使用模拟器) 夜神模拟器下载地址 下载安装frida-server 并安装到模拟器或者手机上 需要使用和f

wodejiaoaoa的博客 5973

北京联通IPTV组播实战:OpenWRT软路由配置全解析

本文详细解析了在北京联通IPTV环境下,利用OpenWRT软路由和udpxy工具实现组播转单播的实战配置。内容涵盖网络接口设置、防火墙规则、udpxy安装配置、直播源M3U文件处理以及全平台播放指南,帮助用户无需机顶盒即可在家庭局域网内任何设备上流畅观看电视直播。

weixin_29313547的博客 1410

10.安卓逆向2-frida hook技术-frida基本使用-frida指令(用于hook)

安卓逆向 安卓协议分析 app协议分析 保姆级攻略 app逆向 Android apk逆向 Frida

计算机王的博客 2817

从零开始掌握Simscape Multibody:机械系统建模与仿真入门

本文为机械系统建模与仿真入门指南,详细介绍了如何从零开始使用Simscape Multibody。通过构建曲柄摇块机构的实战案例,系统讲解了刚体、关节、约束等核心模块的使用,以及模型验证、参数化设计和多领域系统集成等进阶技巧,帮助工程师和学生高效进行虚拟设计与测试。

weixin_29229261的博客 310

MacOS下Mixly 2.0安装避坑指南:从Java环境到终端权限全解析

本文详细解析了在MacOS系统上安装Mixly 2.0时可能遇到的核心问题与解决方案。针对Java环境版本不兼容、MacOS Gatekeeper安全机制拦截以及终端权限不足三大常见障碍,提供了从检查并配置正确Java版本、安全设置绕过到彻底解决应用内部工具链权限的完整避坑指南,帮助用户顺利完成安装并正常使用。

weixin_29231725的博客 503
上一篇: 使用 frida hook Android app
下一篇: Android frida 实战: 分析全民K歌的判断逻辑
nothing one
博客等级 码龄6年 691粉丝 14原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值