安卓逆向——Frida的基础用法(下)
字数 904 2025-08-22 12:23:18

Frida基础用法详解:Java层操作指南

一、概述

本文档详细讲解Frida在Android逆向工程中Java层的七种基础用法,重点介绍如何通过Frida框架动态调用Java方法、Hook构造函数等技术。

二、在现有实例上调用方法

1. 问题场景

当目标方法属于Activity类且未被直接调用时(如示例中的flag方法),直接创建实例会导致错误,因为Android组件需要特定上下文。

2. 解决方案

使用Java.choose()枚举运行时已存在的实例:

Java.performNow(function() {
    Java.choose('com.ad2001.frida0x5.MainActivity', {
        onMatch: function(instance) {
            console.log("Instance found");
            instance.flag(1337); // 调用目标方法
        },
        onComplete: function() {}
    });
});

3. 关键点说明

  • Java.performNow: 确保代码在Java运行时环境中执行
  • Java.choose: 枚举指定类的活动实例
    • 第一个参数: 完整类名
    • 第二个参数: 包含onMatchonComplete回调的对象
  • onMatch: 对每个匹配实例执行的操作
  • 此方法适用于Activity等Android组件类

三、Hook构造函数

1. 问题场景

当需要修改对象初始化参数时(如示例中Checker类的构造参数),可以通过Hook构造函数实现。

2. 解决方案

Hook类的$init方法(构造函数):

Java.perform(function(){
    var a = Java.use("com.ad2001.frida0x7.Checker");
    a.$init.implementation = function(a, b){
        console.log("Origin num:", a, b);
        this.$init(1000, 1000); // 修改构造参数
    }
})

3. 关键点说明

  • Java.use: 获取目标类的引用
  • $init: 表示类的构造函数
  • implementation: 重写方法实现
  • 可以在新实现中修改传入参数或完全改变构造行为

四、通用脚本模板

1. 对象参数调用方法模板

Java.performNow(function() {
    Java.choose('<Package>.<class_Name>', {
        onMatch: function(instance) {
            var <class_reference> = Java.use("<package_name>.<class>");
            var <class_instance> = <class_reference>.$new();
            /* 设置实例参数 */
            instance.<method>(class_instance);
        },
        onComplete: function() {}
    });
});

2. Hook构造函数模板

Java.perform(function() {
    var <class_reference> = Java.use("<package_name>.<class>");
    <class_reference>.$init.implementation = function(<args>){
        /* 自定义实现 */
    }
});

五、注意事项

  1. Android组件(如Activity)不能直接实例化,必须通过Java.choose获取现有实例
  2. 涉及UI操作必须在主线程执行
  3. 构造函数Hook通过$init实现
  4. 使用console.log输出调试信息
  5. 确保脚本在目标应用启动后执行

六、总结

本文介绍了Frida在Java层的两种核心用法:

  1. 通过Java.choose获取现有实例并调用方法
  2. 通过Hook$init修改构造函数行为

这些技术可以绕过常规逻辑检查、修改运行时行为,是Android逆向工程的基础技能。后续将介绍Native层的进阶用法。

Frida基础用法详解:Java层操作指南 一、概述 本文档详细讲解Frida在Android逆向工程中Java层的七种基础用法,重点介绍如何通过Frida框架动态调用Java方法、Hook构造函数等技术。 二、在现有实例上调用方法 1. 问题场景 当目标方法属于Activity类且未被直接调用时(如示例中的 flag 方法),直接创建实例会导致错误,因为Android组件需要特定上下文。 2. 解决方案 使用 Java.choose() 枚举运行时已存在的实例: 3. 关键点说明 Java.performNow : 确保代码在Java运行时环境中执行 Java.choose : 枚举指定类的活动实例 第一个参数: 完整类名 第二个参数: 包含 onMatch 和 onComplete 回调的对象 onMatch : 对每个匹配实例执行的操作 此方法适用于Activity等Android组件类 三、Hook构造函数 1. 问题场景 当需要修改对象初始化参数时(如示例中 Checker 类的构造参数),可以通过Hook构造函数实现。 2. 解决方案 Hook类的 $init 方法(构造函数): 3. 关键点说明 Java.use : 获取目标类的引用 $init : 表示类的构造函数 implementation : 重写方法实现 可以在新实现中修改传入参数或完全改变构造行为 四、通用脚本模板 1. 对象参数调用方法模板 2. Hook构造函数模板 五、注意事项 Android组件(如Activity)不能直接实例化,必须通过 Java.choose 获取现有实例 涉及UI操作必须在主线程执行 构造函数Hook通过 $init 实现 使用 console.log 输出调试信息 确保脚本在目标应用启动后执行 六、总结 本文介绍了Frida在Java层的两种核心用法: 通过 Java.choose 获取现有实例并调用方法 通过Hook $init 修改构造函数行为 这些技术可以绕过常规逻辑检查、修改运行时行为,是Android逆向工程的基础技能。后续将介绍Native层的进阶用法。