c - 当我在我的机器上调用 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。
解决方案
不要引用我的话,但是... ;-)
ssl_write
是ssl_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)。
推荐阅读
- python - Python 从路径导入 Argparse
- java - 使用 Camera2 拍摄第二张照片时 setPreviewTexture 失败
- excel - 将列表框的内容导出为pdf
- javascript - 组件根目录上的 Vue 2 事件监听器
- c++ - 在 C++ 中的类赋值运算符和向量中默认初始化的问题
- python - 如何处理丑陋的代码格式化程序输出?(黑色的)
- python - 如何为子图提供两行多列
- sql-server - T-SQL 2012 charindex比较几个字符串不匹配
- jmeter - 如何使用 Swagger 代码生成生成 jmeter 客户端?
- python - 切片多索引的两个不同级别时出错