getPortsAndAddresses() 地址端口查询
🌐 根据 socket fd 查询本次收/发的源/目的地址与端口。
📎 源码在线查看:
script.js#L219-L253(getPortsAndAddresses)
签名
javascript
function getPortsAndAddresses(sockfd, isRead)
// 返回 { src_port, src_addr, dst_port, dst_addr }| 参数 | 含义 |
|---|---|
sockfd | socket 文件描述符(由 SSL_get_fd(ssl) 拿到) |
isRead | true=SSL_read(对端流入本端),false=SSL_write(本端流出) |
为什么用 Frida 内置 Socket API
javascript
var sockAddr = Socket.localAddress(sockfd) // 或 Socket.peerAddress(sockfd)用 Frida 内置的 Socket.localAddress / Socket.peerAddress,比原生 getsockname/getpeername 更稳,且能处理 IPv6 / Unix domain socket 等情况。若 socket 已被关闭(超时/对端断开),返回 0 地址。
方向异或逻辑
javascript
var src_dst = ["src", "dst"];
for (var i = 0; i < src_dst.length; i++) {
if ((src_dst[i] == "src") ^ isRead) {
var sockAddr = Socket.localAddress(sockfd)
} else {
var sockAddr = Socket.peerAddress(sockfd)
}
...
}| 场景 | src 应取 | dst 应取 | src 分支条件 (=="src")^isRead |
|---|---|---|---|
| SSL_read (isRead=true, 收) | 对端 peer | 本端 local | true^true=false → else → peer ✔ |
| SSL_write (isRead=false, 发) | 本端 local | 对端 peer | true^false=true → if → local ✔ |
地址解析
javascript
if (sockAddr == null) {
message[src_dst[i] + "_port"] = 0
message[src_dst[i] + "_addr"] = 0
} else {
message[src_dst[i] + "_port"] = (sockAddr.port & 0xFFFF)
message[src_dst[i] + "_addr"] = ntohl(ipToNumber(sockAddr.ip.split(":").pop()))
}sockAddr.port & 0xFFFF:取低 16 位端口sockAddr.ip.split(":").pop():处理::ffff:192.168.1.1(IPv4-mapped IPv6),取最后一段纯 IPv4ipToNumber→ntohl:点分 IP → 小端 uint32 → 大端 uint32(网络序)
sockAddr 为 null 的降级
网络超时或其他原因导致 socket 被关闭时,Socket.localAddress/peerAddress 返回 null,此时地址端口置 0。Python 端 inet_ntop 会渲染成 0.0.0.0:0,pcap 里该包仍会写入但地址无效。