strace如何读取系统调用sys_open的文件名?

时间:2012-03-21 06:03:10

标签: c linux system-calls strace ptrace

我正在编写一个使用Ptrace的程序并执行以下操作:

  • 它读取当前的eax并检查系统调用是否为sys_open。
  • 如果是,那么我需要知道传递的参数是什么。
      

    int sys_open(const char * filename,const int mode,const int mask)

所以eax = 5意味着它是一个开放的系统调用
我发现ebx拥有此Question文件位置的地址 但是我怎么知道文件名的长度所以我可以读取该位置的内容?
我遇到了以下同样问题的问题 Question 1
Question 2(这只是我的!) 但我仍然无法解决我的问题。 :(因为两个答案都不清楚。 当我在Question-1中尝试方法时,我仍然遇到分段错误 您可以查看我的代码here
所以现在我真的想知道strace如何如此美妙地提取这些值:(

1 个答案:

答案 0 :(得分:4)

如您所知,sys_open()没有收到文件名大小作为参数。但是,标准表示文字字符串必须以\0字符结尾。这是个好消息,因为现在我们可以对字符串的字符进行简单的循环迭代,当我们找到\0(NULL)字符时,我们就知道它已经到了它的末尾。

这是标准程序,strlen()是如何做到的,以及strace如何做到这一点!

C 示例:

#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的地址并执行我刚才描述的过程。这是你必须要做的事情,没有别的办法。