1

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

4

1 回答 1

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[] 数组中。

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

于 2013-03-11T01:24:42.490 回答