如何从“struct linux_binprm”获取argv?

时间:2013-03-07 15:50:05

标签: linux kernel

我想从现有的struct linux_binprm中提取所有argv。在内核3.4上,我在do_excve_common中尝试了这段代码:http://www.mail-archive.com/kernelnewbies@nl.linux.org/msg00278.html,但它不起作用。它返回(null)。问题是什么?如何在char *字符串中获取所有参数?

1 个答案:

答案 0 :(得分:1)

。如果要在do_execve_common()中执行二进制加载程序之前获取完整命令行,可以尝试以下操作: 函数do_execve_common()参数表中有一个参数* argv,为什么还要从“struct linux_binprm”获取argv?您可以使用以下代码直接使用* argv。在do_execve_common()中,插入一些代码如下:

argc = count(argv, MAX_ARG_STRINGS);
i = 0;
while (i < argc)
{
    const char __user *str;
    int len;

    ret = -EFAULT;
    str = get_user_arg_ptr(argv, i);
    if (IS_ERR(str))
        goto out;

    len = strnlen_user(str, MAX_ARG_STRLEN);
    if (!len)
        goto out;

    //copy the str to kernel temporary storage
    //NOTE: tmp[] is a string array, 
    //      the memory should have been allocated already for strings storage, 
    //      each string is ended with \0
    memcpy(tmp[i], str, len)
}

执行这些代码后,我认为argv字符串将全部保存在tmp []数组中。

。虽然如果你想在二进制加载程序执行后获得完整的命令行,我认为此时参数页面已经正确设置,那么你可以尝试以下方法来获取完整的命令行: ./fs/proc/base.c文件中有一个函数proc_pid_cmdline(),您可以重复使用proc_pid_cmdline()函数中的大多数代码从参数页面获取完整的命令行。