gpt4 book ai didi

macos - 如何在 dtruss 输出中查看完整字符串?

转载 作者:太空宇宙 更新时间:2023-11-03 13:10:30 26 4
gpt4 key购买 nike

我正在使用 dtruss在 MacOS X 10.8.5 上尝试查看正在运行的应用程序和它与之通信的 SSL 服务器之间的对话。不像strace在 Linux 上,我没有在输出中看到完整的数据字符串,就像我希望在程序中找到的那样 sendrecv在文件描述符上。

我怎样才能得到 dtruss向我显示应用程序通过 SSL 服务器发送和接收的数据?

在任何人告诉我将连接代理到我控制的 SSL 服务器之前,是的,我知道这个技巧,而且没有这个特定的应用程序太聪明而不会上当。

最佳答案

dtruss 既是为 DTrace 编写的脚本的优雅示例,也是 DTrace 可以实现的功能的演示。然而,虽然它与 trussstrace 的相似性在相对贫瘠的 OS X 上受到了极大的欢迎,但我怀疑 dtruss 从来没有打算成为一个完全替代任何一个。

无论如何,您的问题有点模棱两可:我不确定您是担心看到的字符串被截断还是根本看不到 sendto()< 的任何字符串recvfrom()(DTrace 揭示的底层接口(interface))。我会同时解决这两个问题。

首先,DTrace在内核中收集数据;用户态缓冲区在记录并传输回消费者之前使用 D 语言的 copyin()copyinstr() 获得——通常是 dtrace( 1)命令。 DTrace 要求其内核缓冲区大小在编译时已知,因此对字符串的其他不可预测的长度施加了限制。默认情况下,此限制为 256 个字节;如果您看到截断,那么您可以通过添加来更改限制,例如,

#pragma D option strsize=512

低于 dtruss 的现有 pragma

其次,dtruss 被硬编码以了解各种系统调用的格式要求。您在其输出中看不到 sendto()recvfrom() 的任何缓冲区解释,因为它们未在源代码中明确处理。没有什么可以阻止您找到适合添加它们的地方,但您可以改为编写自己的脚本:

bash-3.2# cat sr.d
#pragma D option rawbytes

syscall::sendto:entry,
syscall::recvfrom:entry
/pid == $target/
{
self->bufp = arg1;
self->size = arg2;
}

syscall::sendto:return,
syscall::recvfrom:return
/pid == $target && self->bufp && self->size/
{
printf("%s():\n", probefunc);
tracemem(copyin(self->bufp, self->size), 64);
printf("\n");
self->bufp = self->size = NULL;
}
bash-3.2# dtrace -qs ./sr.d -p 16988
sendto():

0 1 2 3 4 5 6 7 8 9 a b c d e f 0123456789abcdef
0: 68 65 6c 6c 6f 00 00 00 00 00 00 00 00 00 00 00 hello...........
10: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
20: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
30: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................

^C

bash-3.2#

请注意,对于字符串,我们必须对 tracemem() 使用 DTrace 的数据记录缓冲区提供硬性限制。如果很少接近极限,那么这会产生令人恼火的结果,即输出可能会非常大,而且大部分都是冗余的。如果您知道您正在寻找字符串,那么您可以简单地使用 copyinstr() 代替;如果您有比我的 OS X 10.6.8 更现代的 DTrace 实现,那么您可能会发现您可以编写

tracemem(copyin(self->bufp, self->size), 64, self->size);

其中第二个参数仍然是记录字节数的硬限制,但显示字节数受可选的第三个参数限制。

最后,请注意用户空间地址是在进入系统调用时记录的,但仅在退出时使用。这是一个常见的习惯用法,它允许系统调用在必要时插入数据错误 --- DTrace 本身不会这样做,如果被要求跟踪非常驻地址,则会在运行时产生错误。

关于macos - 如何在 dtruss 输出中查看完整字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19883966/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com