关于C#:strace如何读取系统调用sys_open的文件名?

How does strace read the file name of system call sys_open?

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

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

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

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


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

这是标准过程,这是strlen()的工作方式,也是strace的工作方式!

C示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#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\
"
, fname_length, filename);

    return 0;
}

返回手头的任务,您必须访问filename的地址并执行我刚刚描述的过程。 这是您必须要做的,没有其他办法。