首页
社区
课程
招聘
[原创]Frida Hook 所有类的方法以及重载
发表于: 2023-7-16 18:21 12429

[原创]Frida Hook 所有类的方法以及重载

2023-7-16 18:21
12429

0x01 前言

理论上我们可以通过反射的思想,写出一个脚本hook住所有的类,以及类的方法和重载,这样也就不用考虑定位了,自动化的实现我们快速hook的需求,将hook的所有日志保留,然后我们去搜索我们需要的东西。现在人工智能、大数据、AI这么火,怎么让我们逆向也变得智能呢?输入一个简单的指令,程序自我hook,快速计算,然后反馈关键的类、方法给我们。也许这样的工具已经有大佬实现了。

0x02 枚举所有的加载的类

enumerateLoadedClassesSync 列出当前已经加载的类,但是有很多,打印出来的数据多的看不清,全部hook APP 肯定会奔溃。

1
2
3
4
5
6
7
8
Java.perform(function(){
 
        var classz = Java.enumerateLoadedClassesSync()
        console.log(classz)
    })
 
on.Animator$AnimatorListener,android.animation.AnimatorSet$SeekState,android.os.Registrant,android.app.ActivityManager$StackId,com.android.internal.telephony.ISub$Stub$Proxy,android.widget.FastScroller$6,android.media.EncoderCapabilities,android.hardware.camera2.CaptureResult$2,android.app.job.JobInfo$TriggerContentUri,android.app.ApplicationPackageManager$OnPermissionsChangeListenerDelegate,android.text.method.TextKeyListener,android.app.job.JobService,android.widget.GridLayout$5,android.app.WindowConfiguration,android.widget.TextView$3,android.app.ActivityManager$RunningAppProcessInfo,android.security.net.config.CertificateSource,android.app.assist.AssistStructure$ViewNode,android.media.Utils,android.database
...

可以过滤出我们需要的类

1
2
3
4
5
6
7
8
9
10
Java.perform(function(){
 
    var classz = Java.enumerateLoadedClassesSync();
    for(var i=0;i<classz.length;i++){
        if (classz[i].indexOf("com.xiaojianbang.app") != -1){
            console.log(classz[i])
 
        }
    }
})

返回的结果,可以看出,从几百,几千缩减了到几个几十个,在对他们进行hook,此时问题应该不大。先来看结果:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Xiaomi MI 8::HookTestDemo]-> com.xiaojianbang.app.DESede
com.xiaojianbang.app.Money$innerClass
com.xiaojianbang.app.Money
com.xiaojianbang.app.MainActivity$1
com.xiaojianbang.app.MainActivity
com.xiaojianbang.app.SHA
com.xiaojianbang.app.RSA
com.xiaojianbang.app.MAC
com.xiaojianbang.app.Utils
com.xiaojianbang.app.AES
com.xiaojianbang.app.DES
com.xiaojianbang.app.NativeHelper
com.xiaojianbang.app.RSAHex
com.xiaojianbang.app.MD5
com.xiaojianbang.app.ShufferMap

0x03 枚举一个类的所有方法

现在我们要 获取一个类的所有方法:

1
2
3
4
5
var MainActivity = Java.use("com.xiaojianbang.app.MainActivity");
var methods = MainActivity.class.getDeclaredMethods();
for(var i=0;i<methods.length;i++){
    console.log(methods[i].getName())
}

返回结果:

1
2
3
4
5
[Xiaomi MI 8::HookTestDemo]-> decrypt
onClick
onCreate
showMap_
toastPrint

对比源代码 太多了所以部分截图,方法名也是一一对上的。
图片描述

0x04 hook 一个类其中的某个方法的所有重载

如果方法的重载只有2、3个可以手动写,但是有10个?100个?所有看代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
         var Utils = Java.use("com.xiaojianbang.app.Utils");
        Utils["test"].implementation = function () {
            console.log("test is called");
            var ret = this.test();
            console.log('test ret value is ' + ret);
            return ret;
        };
 
 
结果:可以看出有三个重载
[Xiaomi MI 8::HookTestDemo]-> Error: test(): has more than one overload, use .overload(<signature>) to choose from:
        .overload()
        .overload('com.xiaojianbang.app.Money')
        .overload('int')
    at throwOverloadError (frida/node_modules/frida-java-bridge/lib/class-factory.js:1020)
    at frida/node_modules/frida-java-bridge/lib/class-factory.js:707

利用反射的思想,来一次性hook住他们

1
2
3
4
5
6
7
8
9
10
11
12
13
var Utils = Java.use("com.xiaojianbang.app.Utils");
var overloads  = Utils["test"].overloads;
for (var i=0;i< overloads.length;i++){
    overloads[i].implementation = function () {
       var params = "";
       for(var j=0;j<arguments.length;j++){
        params = params +arguments[j]+" "
       }
       console.log("params",params)
        
        return this.test.apply(this,arguments);
    };
}

0x05 综合上面所有的,一次性hook多个类的所有方法及重载

完整代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
var classz = Java.enumerateLoadedClassesSync();
for (var i = 0; i < classz.length; i++) {
    if (classz[i].indexOf("om.xiaojianbang.app.Utils") != -1) {
        var class_name = classz[i];
     
        console.log("class_name", class_name);
 
        var cz = Java.use(class_name);
        var methods = cz.class.getDeclaredMethods();
        for (var i1 = 0; i1 < methods.length-1; i1++) {
            var classz_method_name = methods[i1].getName();
      
            console.log("classz_method_name => ", class_name, classz_method_name)
            try {
                var overloadAyy = cz[classz_method_name].overloads;
                console.log(overloadAyy)
                if (overloadAyy && overloadAyy.length>0){
                    for (var i2 = 0; i2 < overloadAyy.length; i2++) {
                        overloadAyy[i2].implementation = function () {
                            var params = "";
                            for (var j = 0; j < arguments.length; j++) {
                                params = params + arguments[j] + " "
                            }
                            console.log("params", class_name, classz_method_name, params)
                            return this[classz_method_name].apply(this, arguments);
 
                        };
                    }
                }else{
                    cz[classz_method_name].implementation = function () {
                        var params = "";
                        for (var j = 0; j < arguments.length; j++) {
                            params = params + arguments[j] + " "
                        }
                        console.log("params", class_name, classz_method_name, params)
                        return cz[classz_method_name].apply(this, arguments);
 
                        
                    };
                }
                
 
            } catch (error) {
                console.log("异常类的加载,请特殊处理", class_name, classz_method_name)
                
            }
 
        }
 
    }
}

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 10
支持
分享
最新回复 (13)
雪    币: 1363
活跃值: (1989)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
感谢分享
2023-7-16 20:22
0
雪    币: 3525
活跃值: (31011)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
感谢分享
2023-7-16 23:29
1
雪    币: 2053
活跃值: (1776)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
感谢分享
2023-7-17 07:57
0
雪    币: 6573
活跃值: (3938)
能力值: (RANK:200 )
在线值:
发帖
回帖
粉丝
5
感谢分享
2023-7-20 11:13
0
雪    币: 520
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
6
你是小肩膀学员吧
2023-7-20 14:44
0
雪    币: 4308
活跃值: (5605)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
7
aqingadmin 你是小肩膀学员吧
哈哈哈 不是的。小肩膀的课B站有呢,课太贵了买不起呢
2023-7-20 21:20
0
雪    币: 2575
活跃值: (502)
能力值: ( LV2,RANK:85 )
在线值:
发帖
回帖
粉丝
8
西贝巴巴 哈哈哈 不是的。小肩膀的课B站有呢,课太贵了买不起呢
那是哪机构的学员?你的文章像内部学习资料似的
2023-7-21 19:33
0
雪    币: 4308
活跃值: (5605)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
9
小肩膀有本安卓逆向的书,内容还是很精辟的,推荐看下,对frida的介绍还是很详细的。还有肉师傅的课,看完会有不一样的体会。
2023-7-22 10:31
0
雪    币: 713
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
西贝巴巴 小肩膀有本安卓逆向的书,内容还是很精辟的,推荐看下,对frida的介绍还是很详细的。还有肉师傅的课,看完会有不一样的体会。[em_27]
请问小肩膀出的逆向书叫什么
2023-8-14 09:05
0
雪    币: 165
活跃值: (241)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
感谢分享
2024-2-19 18:10
0
雪    币: 707
活跃值: (35)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
谢谢分享,但是看类名怎么感觉是小肩膀的课程啊
2024-2-27 15:32
0
雪    币: 184
活跃值: (410)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13

var methods = cz.class.getDeclaredMethods();
        for (var i1 = 0; i1 < methods.length-1; i1++) {
            var classz_method_name = methods[i1].getName(); //getName()返回很多重复的方法名 下面代码使用classz_method_name会有问题
}

最后于 2024-5-22 22:52 被蓝色之冰编辑 ,原因:
2024-5-22 22:51
0
雪    币: 4308
活跃值: (5605)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
14
蓝色之冰 var&nbsp;methods&nbsp;=&nbsp;cz.class.getDeclaredMethods();&nbsp;&nbsp;&nbsp ...

好的,感谢指出问题。一个类下除了方法重载,还能用到很多重复的方法名?(内部类/匿名类?继承?)APP样本能发我一份吗,互相学习下

最后于 2024-5-23 09:23 被西贝巴巴编辑 ,原因:
2024-5-23 09:11
0
游客
登录 | 注册 方可回帖
返回
//