System-Calls

列出應用程序中使用的系統呼叫

  • September 29, 2014

有沒有辦法在不執行應用程序中所有可能的場景的情況下獲取應用程序中使用的所有系統呼叫的列表?

理論上,如果應用程序服從某些約束,是的。一般來說,沒有。

呼叫系統呼叫的最常見方法是通過標準庫包裝器。因此,例如,read(fd,buf,BUFLEN)編譯為彙編call read,並在 amd64 目標程式碼中e8 00 00 00 00(其中零被符號表條目覆蓋read)。建立一個標準庫使用的所有系統呼叫的表,通讀目標程式碼以查找對標準庫的呼叫,使用它來查找可能的系統呼叫。

但是,程序也可以syscall直接使用。第一個參數是系統呼叫號。它可以從文件、命令行參數、標準輸入、網路套接字中讀取該數字,或者進行一些冗長的計算(嘗試分解素數,順序搜尋產生特定 SHA2 雜湊的輸入,執行通用圖靈機器,直到它停止等)來生成它。

程序也可以使用dlopen/dlsym來呼叫標準庫函式,它可以從文件、命令行參數、標準輸入、網路套接字或經過一些冗長的計算後獲取要呼叫的名稱。事實上,它可能查找的標準庫函式可能是syscall它自己。

所以有些程序的答案是“它可能會呼叫任何東西”。

引用自:https://unix.stackexchange.com/questions/158212