2012-03-19 42 views
1

我編寫了一個程序來列出所有由命令執行的系統調用(比如/ bin/ls)。現在我試圖做的是找到所有的系統調用參數,環境變量,命令行參數可能會傳遞給它
使用ptrace進行系統調用跟蹤

例如:如果我打開一個文件。系統調用sys_access會打開文件嗎?但是如何獲得這些價值?
想要對系統調用進行打開,讀取,寫入,關閉等操作。

根據我的研究,這些必須在寄存器(ebx - edx)如果是這些寄存器值是什麼意思? 我收到了這個link
但我真的無法從那裏得到很多。此外,任何進一步的參考將是非常有用的。

+1

這是否有幫助:http://lxr.free-electrons.com/source/include/linux/syscalls.h – dbrank0 2012-03-19 11:42:01

+0

@ dbrank0:非常感謝。它確實有幫助。但我還有一個問題。 我剛纔的程序的輸出是這樣的 'code'SYSCALL 33:EBX:ECX 004c48de:00000000 EDX:004c8ff4 /接入 RETURN 33:FFFFFFFE 這個值是十六進制。那我該如何理解它呢?我是一個noob程序員。對不起,我的無知 – 2012-03-19 11:50:26

+1

文件名存儲在0x4c48de,模式爲0(請參閱模式標誌定義),edx是不相關的,包含未定義的東西,返回值是-2(它抱怨只讀文件系統)。 – dbrank0 2012-03-19 12:08:34

回答

0

(修訂本的上述評論(這樣你能接受的話)形式):

詳細的系統調用的參數可以在Linux內核頭syscalls.h進行查找。 在上述情況下,作爲sys_access(#33在x86)僅具有兩個參數:

  • 首先是指針的文件名,所以你的文件名被存儲在地址0x4c4d8e
  • 第二個參數是文件模式(見模式標誌定義)
  • 因爲有這個系統調用沒有第三個參數,EDX是不相關的,並且包含一些未定義值

這個系統調用的返回值是-2(ENOENT,在errno-base.h定義),其表示錯誤(沒有這樣的文件或目錄)。

另請注意(請參見上面的Basile的註釋)您正在複製strace實用程序的功能。

+0

再次感謝。我試圖在ptrace中做到這一點,所以我可以學習它。 Bt不是更適合在C中使用嗎?我的意思是peekuser,getregs和所有的都很有趣。 :D – 2012-03-20 03:53:28

+0

如果你的時間表允許玩它,這很有趣。 :) – dbrank0 2012-03-20 07:57:42