我有我自己的POSIX應用程序啓動子進程。我希望通過子進程讀取或寫入的所有文件的名稱以及子進程生成的任何子進程的文件名以及它加載的所有動態庫來通知父進程。同樣,我需要監測子進程產生的所有子進程等在POSIX環境中,如何跟蹤由子進程訪問的文件?
這是如何完成的?
我有我自己的POSIX應用程序啓動子進程。我希望通過子進程讀取或寫入的所有文件的名稱以及子進程生成的任何子進程的文件名以及它加載的所有動態庫來通知父進程。同樣,我需要監測子進程產生的所有子進程等在POSIX環境中,如何跟蹤由子進程訪問的文件?
這是如何完成的?
我有兩個想法。
方法1 - 「真正的方式」。
我想你想要ptrace。但它不容易使用。
本質上這個調用是爲了編寫一個調試器。請注意0步驟直到下一個系統調用。此時,您可能會使用更多ptrace
調用來查看進程的內存,以觀察它是否是對open()
的調用。
方法2 - 懶惰,hackish的方式。
您可以使用LD_PRELOAD
環境變量。也就是說,編寫一個共享庫,並使用您自己實現的要調用的調用(例如,open()
,dlopen()
),添加自己的代碼並將調度分配到正常的libc版本。然後你在這個共享庫上指出LD_PRELOAD
環境變量,這樣動態鏈接器將在進程啓動時加載它。
一個缺點這種方法是,如果一個進程知道它是被觀察到的這種方式,它可以重新設置環境變量,然後再執行本身,逃避檢測。另一個我能想到的是,作爲一個安全功能,如果你是root用戶,這個環境變量是不會被尊重的。