2012-03-21 90 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地址和执行我刚才介绍的过程。这是你必须要做的事情,没有别的办法。