字节系app通用抓包方案

查看 114|回复 9
作者:Slimu   
字节系app通用抓包脚本

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

原理
获取SSL_CTX_set_custom_verify的参数3(回调函数)
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;
}


17049426510968.jpg (70.22 KB, 下载次数: 0)
下载附件
2024-1-11 12:06 上传

让回调函数的返回值保持为0, 即ssl_verify_ok即可
enum ssl_verify_result_t BORINGSSL_ENUM_INT {
    ssl_verify_ok,
    ssl_verify_invalid,
    ssl_verify_retry,
};
代码编写
首先获取一下SSL_CTX_set_custom_verify
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个:
[ol]
  • setTimeout(main, 3000);延时执行函数
  • hook系统函数, 监听so加载
    [/ol]
    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即可
    效果图


    17049453058755.jpg (34.53 KB, 下载次数: 0)
    下载附件
    2024-1-11 12:06 上传



    17049455165907.jpg (33.89 KB, 下载次数: 0)
    下载附件
    2024-1-11 12:06 上传


    完整代码已经上传至github

    函数, 下载次数

  • iamafailor   

    反手一个star
    fc1314   

    这是什么工具的怎么用的大佬讲解一下
    yyzzy   

    怎么用啊?
    782335921   

    插眼zsbd
    Dragoun   

    插眼,大佬666
    sunzhw   

    收藏学习,感谢分享
    gracenshan   

    这个也行啊,厉害
    枕下的悲情   

    收藏学习,感谢分享
    javascript2014   

    chayan,学习
    您需要登录后才可以回帖 登录 | 立即注册

    返回顶部