【问题标题】:How does strace read the file name of system call sys_open?strace如何读取系统调用sys_open的文件名?
【发布时间】:2012-04-05 15:53:30
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果您愿意深入研究代码,可以在strace.git.sourceforge.net/git/gitweb.cgi?p=strace/… 上自行查找——grepping sys_open 可能是一个好的开始。
  • strace的源码你仔细研究了吗?你试过strace strace true 吗?
  • 我在尝试编译您的代码时遇到了一些编译错误。 ideone.com/SQie4。我认为您也需要粘贴helper.h 的代码
  • @che: [pastie.org/3639780] 这有我的 helper.h,它实际上有标题。抱歉忘记了:(
  • 我没有尝试 strace strace true。等我谷歌吧

标签: c linux system-calls strace ptrace


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-01
    • 1970-01-01
    • 2016-10-14
    • 2020-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多