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

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

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

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

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

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