0
1
简介
本文详细介绍了接口、抽象类的实现类hook方式;在开发中,有些类会实现接口/抽象类并实现其中的方法。在逆向分析中,单击这些方法跳转到定义处时,可能会跳转到接口/抽象类中声明的方法上,而不是跳转到该接口/抽象类的实现类的方法上;因此往往很难快速定位到具体实现类的方法,通过frida hook的方式可以快速定位出具体实现方法
0
2
概念
抽象类:可以包含抽象方法(没有方法体的方法)和具体方法,不能被实例化,用于为子类提供通用的属性和方法定义。
接口:只包含抽象方法和常量,用于定义一组规范,实现接口的类必须实现其中的所有方法。
0
3
接口实现类Hook
代码示例
//定义接口
public interface PikasecInterface {
void test1();
void test2(String a, String b)
}
//定义接口的实现类
public class PikasecClass implements PikasecInterface {
public void test1() {
System.out.println("hi, i am test1")
}
public void test2(String a, String b) {
String c = a + b
System.out.println("hi ,i am test2 method,i will"+c)
}
}
Hook 脚本
setImmediate(function () {
Java.perform(function () {
console.log("(*) Enumerating classes...");
// 使用 enumerateLoadedClasses 枚举所有已加载的类
Java.enumerateLoadedClasses({
onMatch: function (className) {
// 筛选出路径以 "com.pika" 开始的类
if (className.startsWith("com.pika")) {
console.log("(*) Found instance of '" + className + "'");
// 使用 Java.use 获取 Frida 包装后的类
const clazz = Java.use(className);
// 获取该类实现的所有接口
const interfaces = clazz.class.getInterfaces();
// 遍历接口
for (const iface of interfaces) {
// 检查是否包含指定接口
if (iface.toString() === "com.pika.app.PikasecInterface") {
console.log("(*) Found class implementing PikasecInterface: " + className);
}
}
}
},
onComplete: function () {
console.log("(*) Class enumeration complete");
},
});
});
});
脚本解析:
-
setImmediate
:将一个函数注册到 JavaScript 运行时,使其尽快执行。 -
Java.perform
:表示在 Java 运行时环境中执行后续的代码。 -
Java.enumerateLoadedClasses
:用于枚举所有已加载的类。它有两个回调函数,onMatch
会为每个匹配的类名被调用,onComplete
在枚举完所有类后被调用一次。 -
className.startsWith("com.pika")
:筛选出类名以 “com.pika” 开始的类。 -
Java.use(className)
:通过类名获取 Frida 包装后的类对象。 -
clazz.class.getInterfaces()
:获取该类实现的所有接口数组。 -
通过遍历接口数组,检查是否包含指定的接口
com.pika.app.PikasecInterface
。如果包含,则打印出相关信息。
0
4
抽象类实现类Hook
代码示例
//定义接口
public interface PikasecAbstractClass {
abstract void test3();
abstract void test4(String a, String b)
}
//定义接口的实现类
public class PikasecClass extends PikasecAbstractClass
{
public void test3() {
System.out.println("hi, i am test3")
}
public void test4(String a, String b) {
String c = a + b
System.out.println("hi ,i am test4 method,i will"+c)
}
}
Hook 脚本
Java.perform(function () {
// 枚举所有已加载的类
Java.enumerateLoadedClasses({
onMatch: function (className) {
// 筛选出路径以 "com.pikasec" 开始的类
if (className.startsWith("com.pikasec")) {
var clazz = Java.use(className);
// 获取父类
var superClass = clazz.class.getSuperclass();
// 判断父类是否为 "com.pikasec.app.PikasecAbstractClass"
if (superClass && superClass.getName() === "com.pikasec.app.PikasecAbstractClass") {
console.log("找到接口的实现类: " + className);
}
}
},
onComplete: function () {}
});
});
脚本解析:
-
Java.perform(function () {...})
:确保在 Java 环境中执行后续代码。 -
Java.enumerateLoadedClasses({...})
:枚举所有已加载的类。 -
onMatch: function (className) {...}
:对于每个匹配的类名,执行其中的代码。 -
if (className.startsWith("com.pikasec"))
:筛选出路径以 “com.pikasec” 开始的类。 -
var clazz = Java.use(className)
:使用Java.use
获取 Frida 包装后的类对象。 -
var superClass = clazz.class.getSuperclass()
:通过 Java 反射机制获取该类的父类。 -
if (superClass && superClass.getName() === "com.pikasec.app.PikasecAbstractClass")
:检查父类是否为指定的抽象类,如果是,则打印出该类名。
·end·
—如果喜欢,快分享给你的朋友们吧—
我们一起愉快的学安全吧
原文始发于微信公众号(暴暴的皮卡丘):Frida Hook(七)- 安卓接口与抽象类Hook