微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在 macOS 上与 dtrace 连接打印 IP/端口

如何解决在 macOS 上与 dtrace 连接打印 IP/端口

我正在尝试使用 dtrace 打印出子进程中所有 connect 调用的 IP 和端口。经过一些试验和错误,我想出了这个 DTrace 脚本

syscall::connect:entry,syscall::connect_nocancel:entry
/
pid == $target
/
{
    this->sockaddr_in_var = (struct sockaddr_in*) args[1];
    trace(inet_ntop(this->sockaddr_in_var->sin_family,&this->sockaddr_in_var->sin_addr))
}

我希望为每次调用 connectconnect_nocancel 打印出套接字地址。当我尝试通过这个运行 telnet 时(只是为了建立一个非常简单的 TCP),它失败了。

λ sudo dtrace -s traceconn.d -c 'telnet localhost 8080'
dtrace: system integrity protection is on,some features will not be available

dtrace: script 'traceconn.d' matched 2 probes
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host
dtrace: pid 53014 has exited
dtrace: error on enabled probe ID 2 (ID 977: syscall::connect_nocancel:entry): invalid kernel access in action #2 at DIF offset 12
dtrace: error on enabled probe ID 2 (ID 977: syscall::connect_nocancel:entry): invalid kernel access in action #2 at DIF offset 12
dtrace: error on enabled probe ID 1 (ID 355: syscall::connect:entry): invalid kernel access in action #2 at DIF offset 12
dtrace: error on enabled probe ID 1 (ID 355: syscall::connect:entry): invalid kernel access in action #2 at DIF offset 12

错误意味着我正在取消引用无效的指针地址,但是 connect 的文档说它的第二个参数应该是 sockaddr *,所以我不明白为什么这会是无效的取消引用。这与SIP有关吗? DTrace 脚本中我的逻辑是否有错误

编辑:我认为这可能与在 macOS 中启用 SIP 有关,但我为 dtrace 禁用了它,但仍然遇到同样的问题。

λ csrutil status
System Integrity Protection status: unkNown (Custom Configuration).

Configuration:
    Apple Internal: disabled
    Kext Signing: enabled
    Filesystem Protections: enabled
    Debugging Restrictions: enabled
    DTrace Restrictions: disabled
    NVRAM Protections: enabled
    BaseSystem Verification: enabled

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。