Frida Hook(七)- 安卓接口与抽象类Hook

0

1

简介

Frida Hook(七)- 安卓接口与抽象类Hook

本文详细介绍了接口、抽象类的实现类hook方式;在开发中,有些类会实现接口/抽象类并实现其中的方法。在逆向分析中,单击这些方法跳转到定义处时,可能会跳转到接口/抽象类中声明的方法上,而不是跳转到该接口/抽象类的实现类的方法上;因此往往很难快速定位到具体实现类的方法,通过frida hook的方式可以快速定位出具体实现方法

Frida Hook(七)- 安卓接口与抽象类Hook

0

2

概念

Frida Hook(七)- 安卓接口与抽象类Hook

抽象类:可以包含抽象方法(没有方法体的方法)和具体方法,不能被实例化,用于为子类提供通用的属性和方法定义。

接口:只包含抽象方法和常量,用于定义一组规范,实现接口的类必须实现其中的所有方法。


0

3

接口实现类Hook

Frida Hook(七)- 安卓接口与抽象类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

Frida Hook(七)- 安卓接口与抽象类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

版权声明:admin 发表于 2024年7月13日 下午10:35。
转载请注明:Frida Hook(七)- 安卓接口与抽象类Hook | CTF导航

相关文章