2012-03-21 88 views
4

我寫它採用PTRACE並執行以下程序:strace如何讀取系統調用sys_open的文件名?

  • 它讀取當前的EAX並檢查系統調用SYS_OPEN。
  • 如果是,那麼我需要知道傳遞的參數是什麼。

    INT SYS_OPEN(爲const char *文件名,const int的模式,const int的面罩)

所以EAX = 5意味着它是一個開放的系統調用
我才知道EBX有從這個文件位置的地址Question 但是,我如何知道文件名的長度,以便我可以讀取該位置的內容?
我碰到哪個地址相同
Question 1
Question 2以下問題(這只是一個是我的!)
但我仍然沒有得到解決我的問題。 :(因爲這兩個答案是不明確的。 我仍然得到分段錯誤,當我嘗試在問題-1
的方法,你可以檢查我的代碼here
所以現在我真的不知道怎麼做strace的提取這些值如此精美:(

+2

如果您願意深入一些代碼,您可以在http://strace.git.sourceforge.net/git/gitweb.cgi?p=strace/strace;a=tree自己查看 - grep'sys_open'可能是一個好的開始。 – che 2012-03-21 06:16:13

+1

您是否仔細研究過'strace'的源代碼?你有沒有試過'strace strace true'? – 2012-03-21 06:16:41

+0

我在編譯代碼時遇到一些編譯錯誤。 http://ideone.com/SQie4。我想你也需要粘貼'helper.h'的代碼 – 2012-03-21 06:16:42

回答

4

如你所知,sys_open()沒有收到文件名的大小作爲參數,但是,標準說明一個文字字符串必須以\0字符結尾,這是個好消息,因爲現在我們可以做一個簡單的循環迭代字符串的字符,當我們發現一個\0(NULL)字符時,我們知道我們已經達到了它的結尾

這就是標準程序,strlen()就是這樣做的,strace也是這麼做的!

Ç例如:

#include <stdio.h> 

int main() 
{ 
    const char* filename = "/etc/somefile"; 

    int fname_length = 0; 
    for (int i = 0; filename[i] != '\0'; i++) 
    { 
     fname_length++; 
    } 

    printf("Found %d chars in: %s\n", fname_length, filename); 

    return 0; 
} 

回到你手頭的任務,你必須訪問的filename地址和執行我剛纔介紹的過程。這是你必須要做的事情,沒有別的辦法。