void SSL_CTX_set_custom_verify(SSL_CTX *ctx, int mode, ssl_custom_verify_callback callback);
参数解释:
之前2022年、2023年、2024年的版本
callback函数是编译在libboringssl.so和libsscronet.so库中的,而且验证函数非常好找,用IDA查看SSL_CTX_set_custom_verify函数的用例或者在IDA中搜索字符串“ VerifyCert”或者"HandlerVerifyResult"就可以定位callback函数,如下所示

image.png (78.99 KB, 下载次数: 0)
下载附件
2025-4-12 16:38 上传

image.png (101.17 KB, 下载次数: 0)
下载附件
2025-4-12 16:40 上传
现在,他学聪明了!!!他编译把这几个字符串隐藏了,可能是重写过相关函数。那怎么办?
其实很简单,他SSL_CTX_set_custom_verify函数没混淆,SSL_CTX_set_custom_verify() 通常在初始化 TLS/SSL 上下文时调用,也就是说:在你创建完 SSL_CTX,还没创建 SSL 对象前调用。
明白这个原理我们就可以通过hook SSL_CTX_set_custom_verify函数获取他的验证函数,因为SSL_CTX_set_custom_verify执行是app初始化的时候执行,所以我们需要先拦截dlopen在libttboringssl.so刚加载的时候就去hook SSL_CTX_set_custom_verify 这样比较保险

image.png (635.47 KB, 下载次数: 0)
下载附件
2025-4-12 16:49 上传
执行./spawn find_boringssl_custom_verify_func.js使用spawn方式启动运行脚本 hook效果,这里我们发现有两个callback函数被hook到了

image.png (165.07 KB, 下载次数: 0)
下载附件
2025-4-12 16:46 上传
最后我们可以用frida实现replace callback函数强行验证通过
最后执行./attach hook_verify_ok.js 打开socksdroid配置charles抓包,我们可以看到很验证函数本来返回1验证失败被我们强制替换成了0让app验证成功

image.png (580.39 KB, 下载次数: 0)
下载附件
2025-4-12 17:11 上传
抓包效果

image.png (414.09 KB, 下载次数: 0)
下载附件
2025-4-12 17:13 上传
hook_verify_ok.js实现就不给大家了,因为大家的版本不同也不适用,find_boringssl_custom_verify_func.js可以给大家,这个相对通用
https://github.com/CreditTone/hooker?tab=readme-ov-file#19-find_boringssl_custom_verify_funcjs