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

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

2024-1-11 12:28
12256

字节系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


[培训]《安卓高级研修班(网课)》月薪三万计划,掌 握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

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