解释strace输出

时间:2012-06-21 09:27:21

标签: c reverse-engineering strace

使用strace可以看到ioctl调用某个文件描述符和某个命令。第三个参数是结构,但strace将其显示为指向内存的原始指针。 strace输出示例:

open("/dev/node", O_RDWR) = 3
ioctl(3, 0x108, 0x8f0eb18) = 0
close(3)  

有没有办法(strace选项或其他工具)来查看结构是什么,或者至少是原始指针背后的值?

2 个答案:

答案 0 :(得分:2)

在gdb中,如果在调用ioctl之前停止它,则可以输入:

(gdb) p *(ioctl_struct *) 0x8f0eb18

这将向您展示该内存位置的内容如何映射到ioctl_struct。

答案 1 :(得分:2)

我遇到了类似的问题:想要检查由ioctl创建的vde_switch的系统调用(创建TUN / TAP虚拟网络接口),以便知道我在做什么我的代码中的错误(必须与vde_switch执行相同的操作,但是以编程方式执行。)

通过运行:

sudo strace vde_switch -tap tap0

作为Terry Greentail,我能够知道正在进行的系统调用是ioctl(5, TUNSETIFF, 0x7fffa99404e0),而指针是对struct ifreq类型结构的引用。在我的代码中,我有类似ioctl(tapfd, TUNSETIFF, &ifr_dev)的内容。

最初我试图让gdb在系统调用上停止,设置:catch syscall ioctl(我已经将gdb作为gdb --args vde_switch -tap tap0运行),但是只要捕获了catch,gdb就没有显示{的参数信息{1}}。经过一段时间的努力,我决定在gdb中运行strace,如:

ioctl

虽然没有断点以这种方式工作,但输出显示正在使用哪个文件描述符:

gdb --args strace vde_witch -tap -tap0

所以我尝试了另一次:open("/dev/net/tun", O_RDWR) = 9 ioctl(9, TUNSETIFF, 0x7fffffffe350) = 0 并设置条件断点:

gdb --args strace vde_witch -tap -tap0

调用约定(我在AMD64上)使用b ioctl if $rdi==9 作为第一个参数,RDI表示第二个参数,RSI表示第三个参数(请参阅System V AMD64 ABI。 )最后,当断点被击中时,我能够检查RDX结构:

ifreq