2015-06-13 44 views
3

如何在源代碼中記錄FreeBSD 10.1 x86_64上的系統調用(系統調用號碼和返回值,int 0x80sysenter/syscall)?如何從源代碼跟蹤FreeBSD中的系統調用?

我知道truss可以做的工作,但我需要在每次系統調用期間記錄其他信息,如copyout的緩衝區。

我試圖找到truss的源代碼,但失敗了。我還試圖在amd64_syscall()中追蹤它們,但結果似乎不完整,與truss的結果相比較。任何關於在實施中我應該關心哪些功能的想法?

+0

您需要使用哪種編程語言? – Marged

+1

在C語言中 – WindChaser

回答

2

您還未指定爲什麼需要這些。特別是,如果您爲了安全目的而需要這樣做,那麼您就錯了。

你是什麼意思,你失敗了?來源在這裏:http://bxr.su/FreeBSD/usr.bin/truss/

通過這樣的工具使用的通用機制被稱爲ptrace的(https://www.freebsd.org/cgi/man.cgi?query=ptrace),以及除其他事項外,它允許停止跟蹤線程,因爲他們執行系統調用。

但是,需要注意的是,雖然這樣的機制允許您複製所有參數,但其他線程可以在複製它們之前指向由上述參數指向的內存,就在系統調用執行相同操作之前。如果這是你的任何問題,你想使用MAC鉤子。

+0

不是出於安全目的。和源代碼一樣,'truss'是通過使用'ptrace()'來實現的,對吧? ''在系統調用之前做同樣的事情''是什麼意思? – WindChaser

2

可能不是你正在尋找的東西,但你可能想看看ktrace(1)/ kdump(1)工具是如何工作的。

+0

我發現syscalls有兩個返回值:'td_retval [0]'和'td_retval [1]'。通常只使用'td_retval [0]',或者兩者都使用? – WindChaser

+0

對於像fork(2)這樣的事情,有兩個返回值,其中爲父級和子級返回不同的值。在更常用的系統調用中,返回值位於td_retval [0]中。 –