23
2023-6
今天距2024年191天
这是鸣谦安全第152次推文
本文1526字,阅读约需3分钟
objection可以查看到类,但是hook不到
这是因为没有切换 ClassLoader
模板如下:
1
function
hook
(
)
{
2
Java.perform(
function
(
)
{
3
console
.log(
"start"
)
4
Java.enumerateClassLoaders({
5
onMatch
:
function
(
loader
)
{
6
try
{
7
if
(loader.findClass(
"类名"
)) {
8
console
.log(
"Successfully found loader"
)
9
console
.log(loader);
10
Java.classFactory.loader = loader;
11
}
12
}
13
catch
(error) {
14
console
.log(
"find error:"
+ error)
15
}
16
},
17
onComplete
:
function
(
)
{
18
console
.log(
"end1"
)
19
}
20
})
21
Java.use(
"类名"
).count.implementation =
function
(
参数
)
{
22
return
this
.count(参数);
23
24
}
25
})
26
}
遍历类的所有方法
遍历类的所有方法,用的就是反射的 getDeclaredMethod
1
function
traceClass
(
类名
)
{
2
Java.perform(
function
(
)
{
3
var
hook = Java.use(类名);
4
var
methods = hook.class.getDeclaredMethods();
5
hook.$dispose;
6
methods.forEach(
function
(
method
)
{
7
console
.log(method)
8
});
9
})
10
}
hook 类的重载方法
实现一次性 hook 所有重载方法
1
function
traceMethod
(
)
{
2
3
var
targetClass =
"类名"
4
var
targetMethod =
"重载方法名"
5
Java.perform(
function
(
)
{
6
var
hook = Java.use(targetClass);
7
// 获取重载的数量
8
var
overloadCount = hook[targetMethod].overloads.length;
9
10
console
.log(
"Tracing "
+ targetMethod +
" ["
+ overloadCount +
" overload(s)]"
);
11
12
for
(
var
i =
0
; i < overloadCount; i++) {
13
// 进行 hook
14
hook[targetMethod].overloads[i].implementation =
function
(
)
{
15
console
.warn(
"n*** entered "
+ targetMethod);
16
// 打印参数
17
for
(
var
j =
0
; j <
arguments
.length; j++) {
18
console
.log(
"arg["
+ j +
"]: "
+
arguments
[j]);
19
}
20
// 打印调用栈
21
var
bt = Java.use(
"android.util.Log"
).getStackTraceString(Java.use(
"java.lang.Exception"
).$
new
());
22
console
.log(
"nBacktrace:n"
+ bt);
23
24
// 打印返回值
25
var
retval =
this
[targetMethod].apply(
this
,
arguments
);
26
console
.log(
"nretval: "
+ retval);
27
console
.warn(
"n*** exiting "
+ targetMethod);
28
return
retval;
29
30
}
31
};
32
})
33
}
hook类的所有方法
将二三结合,就可以实现 hook 类的所有方法。
1
function
uniqBy
(
array, key
)
{
2
var
seen = {};
3
return
array.filter(
function
(
item
)
{
4
var
k = key(item);
5
return
seen.hasOwnProperty(k) ?
false
: (seen[k] =
true
);
6
});
7
}
8
9
function
traceMethod
(
targetClassMethod
)
{
10
var
delim = targetClassMethod.lastIndexOf(
"."
);
11
if
(delim ===
-1
)
return
;
12
var
targetClass = targetClassMethod.slice(
0
, delim)
13
var
targetMethod = targetClassMethod.slice(delim +
1
, targetClassMethod.length)
14
Java.perform(
function
(
)
{
15
var
hook = Java.use(targetClass);
16
var
overloadCount = hook[targetMethod].overloads.length;
17
18
console
.log(
"Tracing "
+ targetClassMethod +
" ["
+ overloadCount +
" overload(s)]"
);
19
20
for
(
var
i =
0
; i < overloadCount; i++) {
21
22
hook[targetMethod].overloads[i].implementation =
function
(
)
{
23
console
.warn(
"n*** entered "
+ targetClassMethod);
24
25
for
(
var
j =
0
; j <
arguments
.length; j++) {
26
console
.log(
"arg["
+ j +
"]: "
+
arguments
[j]);
27
}
28
29
var
bt = Java.use(
"android.util.Log"
).getStackTraceString(Java.use(
"java.lang.Exception"
).$
new
());
30
console
.log(
"nBacktrace:n"
+ bt);
31
32
var
retval =
this
[targetMethod].apply(
this
,
arguments
);
33
console
.log(
"nretval: "
+ retval);
34
console
.warn(
"n*** exiting "
+ targetClassMethod);
35
return
retval;
36
}
37
}
38
});
39
40
}
41
42
function
traceClass
(
targetClass
)
{
43
Java.perform(
function
(
)
{
44
var
hook = Java.use(targetClass);
45
var
methods = hook.class.getDeclaredMethods();
46
hook.$dispose;
47
var
parsedMethods = [];
48
methods.forEach(
function
(
method
)
{
49
parsedMethods.push(method.toString().replace(targetClass +
"."
,
"TOKEN"
).match(
/sTOKEN(.*)(/
)[
1
]);
50
});
51
var
targets = uniqBy(parsedMethods,
JSON
.stringify);
52
targets.forEach(
function
(
targetMethod
)
{
53
traceMethod(targetClass +
"."
+ targetMethod);
54
});
55
})
56
}
使用方法,进入 frida 后,输入 traceClass("类名")
参考链接:
https://github.com/r0ysue/AndroidFridaSeniorBook/blob/main/Chap05/hookXposed.js
原文始发于微信公众号(鸣谦安全):Frida遍历脚本整理
免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论