首页
社区
课程
招聘
[原创] 字节系app通用抓包方案
发表于: 2024-1-11 12:28 14929

[原创] 字节系app通用抓包方案

2024-1-11 12:28
14929

字节系app通用抓包脚本

已测试某音(28.4.0), 某茄小说(6.0.5.32)

原理

获取SSL_CTX_set_custom_verify的参数3(回调函数)

1
2
3
4
void SSL_CTX_set_custom_verify(SSL_CTX *ctx, int mode, enum ssl_verify_result_t (*callback)(SSL *ssl, uint8_t *out_alert)) {
    ctx->verify_mode = mode;
    ctx->custom_verify_callback = callback;
}

让回调函数的返回值保持为0, 即ssl_verify_ok即可

1
2
3
4
5
enum ssl_verify_result_t BORINGSSL_ENUM_INT {
    ssl_verify_ok,
    ssl_verify_invalid,
    ssl_verify_retry,
};

代码编写

首先获取一下SSL_CTX_set_custom_verify

1
2
3
4
5
6
function main() {
    Java.perform(function () {
        let SSL_CTX_set_custom_verify = Module.getExportByName('libsscronet.so', 'SSL_CTX_set_custom_verify');
    }
}
setImmediate(main);

spwan模式启动下应用frida -U -f com.ss.xxx.xxx.aweme -l byteDance.js

注入后提示报错: Error: unable to find module 'libsscronet.so'

很明显, 问题的原因在于注入的时机过早, so还没有加载进来, 解决办法有2个:

  1. setTimeout(main, 3000);延时执行函数
  2. hook系统函数, 监听so加载
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
function onLoad(name, callback) {
    //void* android_dlopen_ext(const char* filename, int flag, const android_dlextinfo* extinfo);//原型
    const android_dlopen_ext = Module.findExportByName(null, "android_dlopen_ext");
    if (android_dlopen_ext != null) {
        Interceptor.attach(android_dlopen_ext, {
            onEnter: function (args) {
                if (args[0].readCString().indexOf(name) !== -1) {
                    this.hook = true;
                }
            },
            onLeave: function (retval) {
                if (this.hook) {
                    callback();
                }
            }
        });
    }
}
 
onLoad(soName, () => {
    let SSL_CTX_set_custom_verify = Module.getExportByName('libsscronet.so', 'SSL_CTX_set_custom_verify');
    if (SSL_CTX_set_custom_verify != null) {
        Interceptor.attach(SSL_CTX_set_custom_verify, {
            onEnter: function (args) {
                Interceptor.attach(args[2], {
                    onLeave: function (retval) {
                        if (retval > 0x0) retval.replace(0x0);
                    }
                });
            }
        });
    }
});

当监听到so被加载时进行hook操作, hook到SSL_CTX_set_custom_verify后, 获取参数3并hook它, 让此函数执行完成后的返回值保持为0即可

效果图


完整代码已经上传至github


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

最后于 2024-1-11 12:31 被墨穹呢编辑 ,原因:
收藏
免费 7
支持
分享
最新回复 (11)
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
2
不错的思路,向大佬学习
2024-1-11 15:02
0
雪    币: 31
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
已经失效了,最新的版本改方法了
2024-1-12 19:13
0
雪    币: 9613
活跃值: (1670)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
4
错了而已~ 已经失效了,最新的版本改方法了
什么方法啊?
2024-1-12 20:07
0
雪    币: 3836
活跃值: (4142)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
感谢分享
2024-1-12 20:45
0
雪    币: 31
活跃值: (85)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
严启真 什么方法啊?
不知道啊
2024-1-13 13:58
0
雪    币: 15
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
7
最新的某柿里面已经没有这个导入函数的符号了,想要继续hook返回值也许可以inlinehook 或者patch的方式,patch可能会被热修复
2024-1-20 11:02
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
8
用iOS更简单点,只需改一个字段就可以抓包了
2024-1-25 16:13
0
雪    币: 15
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
9
mb_zzzqbbim 用iOS更简单点,只需改一个字段就可以抓包了
怎么改法呢?
2024-2-19 16:19
0
雪    币:
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
10
给力
2024-9-6 05:40
0
雪    币: 10
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
11
REHEroadchik 最新的某柿里面已经没有这个导入函数的符号了,想要继续hook返回值也许可以inlinehook 或者patch的方式,patch可能会被热修复
请问IOS如何修改呢
2024-9-6 07:08
0
雪    币: 187
活跃值: (91)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
12
REHEroadchik 最新的某柿里面已经没有这个导入函数的符号了,想要继续hook返回值也许可以inlinehook 或者patch的方式,patch可能会被热修复
大佬可以露一手
2024-11-28 11:07
0
游客
登录 | 注册 方可回帖
返回
//