安卓逆向——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: 枚举指定类的活动实例- 第一个参数: 完整类名
- 第二个参数: 包含
onMatch和onComplete回调的对象
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>){
/* 自定义实现 */
}
});
五、注意事项
- Android组件(如Activity)不能直接实例化,必须通过
Java.choose获取现有实例 - 涉及UI操作必须在主线程执行
- 构造函数Hook通过
$init实现 - 使用
console.log输出调试信息 - 确保脚本在目标应用启动后执行
六、总结
本文介绍了Frida在Java层的两种核心用法:
- 通过
Java.choose获取现有实例并调用方法 - 通过Hook
$init修改构造函数行为
这些技术可以绕过常规逻辑检查、修改运行时行为,是Android逆向工程的基础技能。后续将介绍Native层的进阶用法。