除了LD_PRELOAD技巧以及用你提供的替代特定系統調用的Linux內核模塊之外,還有可能攔截一個系統調用(例如打開),以便在它到達實際之前首先通過你的函數開放?我怎麼攔截linux系統調用?
回答
如果你真的需要一個解決方案,你可能會感興趣的DR的rootkit是完成眼前這個http://www.immunityinc.com/downloads/linux_rootkit_source.tbz2關於它的文章是在這裏http://www.theregister.co.uk/2008/09/04/linux_rootkit_released/
爲什麼不能使用LD_PRELOAD技巧?
示例代碼在這裏:
/*
* File: soft_atimes.c
* Author: D.J. Capelis
*
* Compile:
* gcc -fPIC -c -o soft_atimes.o soft_atimes.c
* gcc -shared -o soft_atimes.so soft_atimes.o -ldl
*
* Use:
* LD_PRELOAD="./soft_atimes.so" command
*
* Copyright 2007 Regents of the University of California
*/
#define _GNU_SOURCE
#include <dlfcn.h>
#define _FCNTL_H
#include <bits/fcntl.h>
extern int errorno;
int (*_open)(const char * pathname, int flags, ...);
int (*_open64)(const char * pathname, int flags, ...);
int open(const char * pathname, int flags, mode_t mode)
{
_open = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open");
if(flags & O_CREAT)
return _open(pathname, flags | O_NOATIME, mode);
else
return _open(pathname, flags | O_NOATIME, 0);
}
int open64(const char * pathname, int flags, mode_t mode)
{
_open64 = (int (*)(const char * pathname, int flags, ...)) dlsym(RTLD_NEXT, "open64");
if(flags & O_CREAT)
return _open64(pathname, flags | O_NOATIME, mode);
else
return _open64(pathname, flags | O_NOATIME, 0);
}
據我瞭解......這幾乎是LD_PRELOAD伎倆或內核模塊。除非你想在一個模擬器下運行它,而這個模擬器可能會陷入你的函數中,或者在實際的二進制代碼上重寫代碼以捕獲你的函數,否則沒有太多的中間立場。
假設你不能修改程序,也不能修改內核,LD_PRELOAD方法是最好的,假設你的應用程序是相當標準的,並且實際上並不是一個惡意程序試圖通過你的攔截。 (在這種情況下,你需要的其他技術之一。)
我沒有語法可以正確使用LKM,但是本文提供了一個很好的總覽:http://www.linuxjournal.com/article/4378
您也可以修補sys_open函數。從linux-2.6.26開始,從file/open.c的第1084行開始。
如果您不需要構建新系統,您可能還會看到是否無法使用inotify,systemtap或SELinux爲您執行所有這些日誌記錄。
Valgrind可用於截取任何函數調用。如果你需要在你的成品中攔截系統調用,那麼這將是沒有用的。但是,如果您在開發過程中嘗試攔截,那麼它可能非常有用。我經常使用這種技術來攔截哈希函數,以便我可以控制返回的哈希以用於測試目的。
如果您不知道,Valgrind主要用於查找內存泄漏和其他內存相關的錯誤。但底層技術基本上是一個x86模擬器。它模擬你的程序並攔截對malloc/free等的調用。好的是,你不需要重新編譯來使用它。
Valgrind有一個功能,他們稱爲函數包裝,它用於控制功能的截取。詳情請參閱Valgrind manual的第3.2節。你可以爲你喜歡的任何功能設置功能包裝。一旦調用被攔截,您提供的替代功能就會被調用。
如果你只是想看打開什麼,你想看看ptrace()函數,或命令行strace實用程序的源代碼。如果你真的想攔截這個調用,也許會讓它做別的事情,我想你列出的選項--LD_PRELOAD或者內核模塊 - 是你唯一的選擇。
如果您只是爲了調試目的而執行此操作,請查看strace,它是構建在ptrace(2)系統調用之上的,它允許您在系統調用完成時掛接代碼。請參閱手冊頁的PTRACE_SYSCALL部分。
某些應用程序可以欺騙strace的/ ptrace的不跑,所以唯一的選擇我已經使用了SystemTap
的SystemTap可以截獲一堆系統調用如果需要的話,由於其通配符匹配。 Systemtap不是C,而是一種單獨的語言。在基本模式下,systemtap應該可以防止你做出愚蠢的事情,但它也可以在「專家模式」下運行,如果需要的話,它可以讓開發人員使用C.
它並不要求你修補你的內核(或者至少不應該),並且一旦模塊被編譯完成,你可以從一個測試/開發框中複製它,並將其插入(通過insmod)到一個生產環境中系統。
我還沒有找到一個linux應用程序,找到了解決方法/避免被systemtap抓住。
聽起來像你需要auditd。
Auditd允許通過日誌記錄全局跟蹤所有系統調用或對文件的訪問。您可以爲您感興趣的特定活動設置按鍵。
- 1. Android LKM攔截系統調用
- 2. Linux內核模塊(內核3.5)中的系統調用攔截
- 3. 什麼是_nocancel()系統調用在Linux和有使用LD_PRELOAD去攔截
- 4. 在Linux內核中攔截讀取系統調用時的一個錯誤
- 5. 我怎樣才能調用android截圖系統?
- 6. OS-X Linux攔截進程調用
- 7. Linux系統調用
- 8. 統一攔截調用基本方法
- 9. 在linux下,怎麼做系統調用通過GNU ARM彙編
- 10. 攔截和修改文件系統調用 - Windows
- 11. 如何攔截操作系統函數調用
- 12. ld wrap或LD_PRELOAD都不能攔截系統調用
- 13. 如何攔截對文件系統的調用
- 14. 系統級廣告攔截器
- 15. $ httpProvider攔截器不攔截我的API調用
- 16. LightInject - 攔截不攔截依賴關係
- 17. 攔截Linux文件系統中文件的統計調用是否可能? (來自用戶空間)
- 18. 攔截process.stdout.write調用
- 19. 攔截AJAX調用
- 20. 攔截javascript調用
- 21. 當我尋找添加系統調用時,我添加系統調用linux-2.6.31
- 22. linux系統調用getpeername C++
- 23. linux系統調用執行
- 24. 開放系統調用 - Linux
- 25. Linux系統調用誰
- 26. nasm系統調用Linux
- 27. Linux阻止系統調用
- 28. Linux系統調用getifaddr C++
- 29. 宏+ Linux系統調用(NASM)
- 30. 我該如何改進JavaScript中的碰撞攔截系統?
這個問題需要澄清 - 它太含糊。爲什麼LD_PRELOAD不夠? – Arafangion 2010-05-17 14:12:29
@Arafangion - LD_PRELOAD可以攔截圖書館電話。但內核調用是不同的。 – 2010-07-08 13:31:40