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