如何从源代码中跟踪FreeBSD系统调用?

3
如何从源代码记录FreeBSD 10.1 x86_64上的系统调用(syscall号码和返回值,对于int 0x80sysenter/syscall)?
我知道truss可以完成这项工作,但我需要记录其他信息,例如每个系统调用期间copyout的缓冲区。
我尝试查找truss的源代码,但失败了。 我还尝试在amd64_syscall()中跟踪它们,但与truss的结果相比,结果似乎不完整。 你有关于实现中应该关注哪些函数的想法吗?

你需要用哪种编程语言? - Marged
2个回答

2

您没有说明为什么需要这些内容。特别是,如果您需要这些内容用于安全目的,那么您做错了。

您说失败了?源代码在这里:http://bxr.su/FreeBSD/usr.bin/truss/

像这样的工具使用的通用机制称为ptrace(https://www.freebsd.org/cgi/man.cgi?query=ptrace),它允许在执行系统调用时停止跟踪线程。

然而,需要注意的是,虽然这种机制允许您复制所有参数,但其他线程可以在您复制它们之后、系统调用执行之前更改上述参数所指向的内存。如果您关心这个问题,建议使用MAC钩子。


不是出于安全目的。就像源代码中所示,truss 是通过使用 ptrace() 实现的,对吧?“在系统调用之前做同样的事情”是什么意思? - WindChaser

2

也许不完全符合你的需求,但你可能想了解一下ktrace(1)/kdump(1)工具的工作原理。


我发现系统调用有两个返回值,td_retval[0]td_retval[1]。通常只使用td_retval[0],还是两个都会用到? - WindChaser
在fork(2)等类似情况下,有两个返回值,对于父进程和子进程返回不同的值。在更常见的系统调用中,返回值位于td_retval [0]中。 - Edward Tomasz Napierala

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接