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")
:检查父类是否为指定的抽象类,如果是,则打印出该类名。
原文始发于微信公众号(暴暴的皮卡丘):Frida Hook(七)- 安卓接口与抽象类Hook
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论