我想从现有的struct linux_binprm中提取所有argv。在内核3.4上,我在do_excve_common中尝试了这段代码:http://www.mail-archive.com/kernelnewbies@nl.linux.org/msg00278.html,但它不起作用。它返回(null)。问题是什么?如何在char *字符串中获取所有参数?
答案 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()函数中的大多数代码从参数页面获取完整的命令行。