如何从源代码在FreeBSD 10.1 x86_64上记录系统调用(int 0x80
和sysenter/syscall
的系统调用号和返回值)?
我知道truss
可以完成这项工作,但我需要在每个系统调用期间记录其他信息,例如copyout
的缓冲区。
我尝试找到truss
的源代码,但失败了。我还尝试在amd64_syscall()
中跟踪它们,但与truss
的结果相比,结果似乎不完整。在实施中我应该关心哪些功能?
答案 0 :(得分:2)
您尚未说明为什么需要这些。特别是,如果您出于安全目的需要这样做,那么您做错了。
你是什么意思失败了?来源在这里:http://bxr.su/FreeBSD/usr.bin/truss/
像这样的工具使用的通用机制称为ptrace(https://www.freebsd.org/cgi/man.cgi?query=ptrace),除其他外,它允许在执行系统调用时停止跟踪的线程。
但是,必须注意的是,虽然这样的机制允许您复制所有参数,但是在复制它们之后,其他线程可以更改上述args指向的内存,就在系统调用执行相同操作之前。如果您对此感兴趣,则需要使用MAC挂钩。
答案 1 :(得分:2)
可能不完全是你想要的,但你可能想看看ktrace(1)/ kdump(1)实用程序是如何工作的。