首页 > 解决方案 > 当我在我的机器上调用 OpenSSL 中的 s->method->ssl_write 时,如何找到运行的实际源代码?

问题描述

OpenSSL 有一个名为 的方法SSL_write,如下所述:https ://www.openssl.org/docs/man1.1.1/man3/SSL_write.html

此方法的源代码可在此处的可用源中找到:https ://github.com/openssl/openssl in ssl/ssl_lib.c

int SSL_write(SSL *s, const void *buf, int num)
{
    int ret;
    size_t written;

    if (num < 0) {
        ERR_raise(ERR_LIB_SSL, SSL_R_BAD_LENGTH);
        return -1;
    }

    ret = ssl_write_internal(s, buf, (size_t)num, &written);
    /* more code omitted */

ssl_write_internal在最终产生之前进行一些检查:

int ssl_write_internal(SSL *s, const void *buf, size_t num, size_t *written)
{
    /* checking and async logic omitted */
        return s->method->ssl_write(s, buf, num, written);

不过,这就是我卡住的地方——我似乎无法在ssl_write任何地方找到一个名为实际执行写作的函数。

我知道 OpenSSL 涉及很多元编程和间接寻址。你能帮我弄清楚当ssl_write被调用时我们在代码中跳转的位置吗?如果这涉及对特定 TLS 版本或操作系统的假设,我们假设 Linux 和 TLS v1.2。

标签: copenssl

解决方案


不要引用我的话,但是... ;-)

ssl_writessl_method_st结构的成员。ssl_local.h具有三个创建该结构实例的宏。让我们关注IMPLEMENT_tls_meth_func(参见ssl_local.h:2234)。它ssl3_write用于该成员,这不是宏的参数。ssl3_write实际上是一个函数(参见s3_lib.c:4422):

clear_sys_error();
if (s->s3.renegotiate)
    ssl3_renegotiate_check(s, 0);

return s->method->ssl_write_bytes(s, SSL3_RT_APPLICATION_DATA, buf, len,
                                  written);

这同样适用于ssl_write_bytes,它似乎正在做困难的部分,基于其 315 行的长度:-) (参见rec_layer_s3.c:349)。


推荐阅读