2011-06-04 14 views
5

我已經包裝了許多系統調用函數,如write(),open()等,LD-PRELOAD用於覆蓋原始系統調用。此外,我定義了一些更多的功能,並將其製作成碎片庫。在控制進入共享庫之前捕獲一個系統調用

我想從不同的應用程序進程到這些共享庫的所有系統調用進入共享庫之前。我怎樣才能做到這一點?

感謝

+1

系統調用是件好事,庫調用是另一件事。你可能想看看'strace'和'ltrace'工具的源代碼。 – 2011-06-04 17:32:09

+0

@ n.m。一個有用的指針。不要想起它 – 2011-06-04 17:45:44

+0

你在混淆東西:系統調用和記錄的API入口點(打開,關閉等)之間的對應關係不是1:1。 – zvrba 2011-06-05 05:10:06

回答

0

我敢肯定,你可以做到這一點的唯一方法是通過修改系統調用表。 HIDS系統(比如Samhain)將這個報告稱爲入侵,而Linux內核開發人員對此很不滿。實現細節非常特定於操作系統(即,在FreeBSD上工作的不一定適用於Linux),但一般的實現細節將是相同的。內核模塊可能是使用更清潔,更標準化的API的更好方法。

4

LD_PRELOAD不一定是插入系統調用的好方法,因爲a)它只允許你攔截庫調用,b)它只允許你攔截庫調用。 ;)

A)雖然一般來說,系統調用被系統中的共享libC封裝,但沒有人阻止您自己調用系統調用,例如,但是設置正確的寄存器內容,然後發出INT 0x80一個x86系統。如果您感興趣的程序這樣做,那麼您將永遠不會使用基於LD_PRELOAD的libc插入捕獲那些程序。 B)雖然通常情況下,大多數程序都使用系統中共享的libC進行系統調用,但有時應用程序會靜態鏈接,這意味着libC代碼是應用程序的一部分,並不是來自共享庫。在這種情況下,LD_PRELOAD也不起作用。

已經建議使用strace/ltrace的評論 - 我的一般建議是看看這兩種工具都使用的ptrace(),以及哪些應該給你想要的內容而無需修改內核。

+0

@BjoernD ...謝謝 – 2011-06-05 03:26:52

相關問題