4

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

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

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

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

4

1 回答 1

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

于 2012-03-21T12:33:48.987 回答