Frida遍历脚本整理

admin 2023年6月24日00:27:04评论11 views字数 3356阅读11分11秒阅读模式
VOL 152

Frida遍历脚本整理

23

2023-6

今天距2024年191天

这是鸣谦安全第152次推文

本文1526字,阅读约需3分钟

objection可以查看到类,但是hook不到

这是因为没有切换 ClassLoader

模板如下:

 1function 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

 1function 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 所有重载方法

 1function 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 类的所有方法。

 1function 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
 9function 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
42function 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遍历脚本整理

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年6月24日00:27:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Frida遍历脚本整理http://cn-sec.com/archives/1829071.html

发表评论

匿名网友 填写信息