首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从C中的SSL/ssl_st结构中获取远程/对等IP地址?

如何从C中的SSL/ssl_st结构中获取远程/对等IP地址?
EN

Stack Overflow用户
提问于 2020-05-28 18:08:29
回答 2查看 1.2K关注 0票数 2

我以前尝试过的事情是从SSL_get_wfd获取套接字fd,然后将它传递给getpeername。我还查看了BIO对象/函数,但没有任何运气。试图查看openSSL在/usr/include/openssl中的实现,但还是没有结果。

有人知道如何获取连接openSSL套接字的远程IP地址(和端口)吗?

一些背景:

代码语言:javascript
复制
socket fd: 64 // the file descriptor doesn't look incorrect (to me)
after getaddress, socklen: 28 // the length of the plausible address also looks correct
sockaddr ptr: 0x7b0b0fcac0, val: 0x0 // the pointer is empty despite being allocated :(

编辑:我的工作所依据的文档:st.html

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-30 13:53:12

Frida具有与插座相关的优秀特性。

代码语言:javascript
复制
        var address = Socket.peerAddress(fd);
        // Assert address not null
        console.log(fd, address.ip + ':' + address.port);

查看套接字活动;

代码语言:javascript
复制
Process
  .getModuleByName({ linux: 'libc.so', darwin: 'libSystem.B.dylib', windows: 'ws2_32.dll' }[Process.platform])
  .enumerateExports().filter(ex => ex.type === 'function' && ['connect', 'recv', 'send', 'read', 'write'].some(prefix => ex.name.indexOf(prefix) === 0))
  .forEach(ex => {
    Interceptor.attach(ex.address, {
      onEnter: function (args) {
        var fd = args[0].toInt32();
        if (Socket.type(fd) !== 'tcp')
          return;
        var address = Socket.peerAddress(fd);
        if (address === null)
          return;
        console.log(fd, ex.name, address.ip + ':' + address.port);
      }
    })
  })

输出示例

代码语言:javascript
复制
$ frida -Uf com.example.app -l script.js --no-pause
[Android Model-X::com.example.app]-> 
117 write 5.0.2.1:5242
117 read 5.0.2.1:5242
135 write 5.0.2.1:4244
135 read 5.0.2.1:4244
135 read 5.0.2.1:4244
票数 0
EN

Stack Overflow用户

发布于 2021-04-15 05:37:13

这有点老了,“呼呼”的链接已经死了。但这是在搜索的时候想到的,因为它是为我做的。

我进行了测试,而且SSL_get_wfd()和/或SSL_get_rfd()确实返回套接字描述符。在我的例子中,要么返回相同的套接字索引。

至少对于使用基于套接字的BIO,当然,您必须已经连接、接受等等,以便已经为SSL上下文创建了一个套接字。

这将是验证从其中一个或两个函数中得到什么的第一步。如果失败,它们将返回a-1(不是有效的描述符)。

假设您像我一样有一个套接字,那么它就变成了一个套接字问题(而不是OpenSSL问题)。您可以使用套接字的getpeername()获取一个“sockaddr",然后使用它调用getnameinfo(),这将为您提供IP地址的主机名或数字字符串表示。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62071595

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档