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

4
我正在编写一个使用Ptrace的程序,它执行以下操作:
  • 它读取当前的eax并检查系统调用是否为sys_open。
  • 如果是,则需要知道传递了哪些参数。

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

因此,eax = 5表示它是一个打开系统调用。
我得知ebx有文件位置地址,来自这个问题。 但是我如何知道文件名的长度,以便读取该位置中的内容?
我遇到了以下类似的问题
问题1
问题2(仅限我自己!)
但是我仍然没有得到解决我的问题的解决方案。:( 因为两个答案都不清楚。 当我尝试在问题1中采用的方法时,仍然会出现分段错误
你可以在这里检查我的代码
那么现在我真的很想知道strace如何如此美妙地提取这些值:(


2
如果你愿意深入代码,你可以在http://strace.git.sourceforge.net/git/gitweb.cgi?p=strace/strace;a=tree上自行查找--使用grep命令搜索`sys_open`可能是一个不错的开始。 - che
1
你仔细研究过 strace 的源代码吗?你试过 strace strace true 吗? - Basile Starynkevitch
当我尝试编译你的代码时,出现了一些编译错误。http://ideone.com/SQie4。我认为你需要粘贴`helper.h`的代码。 - Pavan Manjunath
@che:[http://pastie.org/3639780] 这里有我的helper.h文件,其中实际上包含了头文件。很抱歉我忘记了它 :( - kidd0
我没有尝试过strace strace true。等一下,我要去谷歌一下。 - kidd0
@PavanManjunath:我也贴上了helper.h文件。之前忘记了,非常抱歉:( - kidd0
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的地址,并执行我刚刚描述的过程。这是必须要做的事情,没有其他方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接