Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
execve系统调用中的envp不包含字符串“execpt”的任何内容;l“u C”;_C_Linux - Fatal编程技术网

execve系统调用中的envp不包含字符串“execpt”的任何内容;l“u C”;

execve系统调用中的envp不包含字符串“execpt”的任何内容;l“u C”;,c,linux,C,Linux,我欺负了打印已执行文件路径的简单监视器,因此我钩住了execve系统调用,但问题是file name参数只包含文件名,而不包含所有路径。无论如何,我复制了envp参数并打印了其中的每个字符串 但是输出只是LS_C,所以我想知道execve系统调用从哪里获取路径 这是我的代码: static asmlinkage long our_execl(const char __user * filename, const char __user * const __user * a

我欺负了打印已执行文件路径的简单监视器,因此我钩住了execve系统调用,但问题是file name参数只包含文件名,而不包含所有路径。无论如何,我复制了envp参数并打印了其中的每个字符串 但是输出只是LS_C,所以我想知道execve系统调用从哪里获取路径 这是我的代码:

static asmlinkage long our_execl(const char __user * filename,
            const char __user * const __user * argv,
            const char __user * const __user * envp) {
copy_from_user(mid,envp,sizeof(envp));
 printk("okdotk:%d\n",sizeof(envp));
for(i=0;i<sizeof(envp);i++)
{
strncpy_from_user(env, mid[i], sizeof(mid[i]));
env[255]='\0';
printk("%s\n",env);

reset_envp(sizeof(env));
}
static asmlong我们的execl(const char\uuu user*文件名,
常量字符*常量用户*常量用户*argv,
常量字符*常量用户*常量用户*环境){
从用户(mid、envp、sizeof(envp))复制_;
printk(“okdotk:%d\n”,sizeof(envp));
for(i=0;i
sizeof(envp)
是系统上的
sizeof
指针,它不是数组的长度

因此,您的代码仅显示单个环境变量的前4个字母
LS\u C

相反,您应该迭代,直到
envp[i]
为空,表示环境结束。对于每个环境变量,您应该复制,直到看到
\0
,并且在前4个字节后再次不停止。

sizeof(envp)
是系统上的一个指针的大小,它是4。它不是数组的长度

因此,您的代码仅显示单个环境变量的前4个字母
LS\u C


相反,您应该迭代,直到
envp[i]
为空,表示环境结束。对于每个环境变量,您应该复制,直到看到
\0
,并且在前4个字节后再次停止。

但我无法检查envp[i]在将其复制到内核空间之前,我应该如何获取数组的大小?您无法预先获取数组的长度,就像无法预先获取字符串的长度一样。您必须搜索它,直到找到终止符为止(与
char*
\0
终止的方式相同,
char**envp
被NULL终止)还有一个问题,我做了你所说的,效果很好,但我得到了一个数字和变量列表,所以也许你知道如何获得路径变量当你检查
envp[1]时,你是这么说的吗
,它是空的?您当前的代码是什么?请发布您的更新代码。不清楚您到底更改了什么,因此我们无法猜测您的代码现在实际在做什么。但我无法检查envp[i]在将其复制到内核空间之前,我应该如何获取数组的大小?您无法预先获取数组的长度,就像无法预先获取字符串的长度一样。您必须搜索它,直到找到终止符为止(与
char*
\0
终止的方式相同,
char**envp
被NULL终止)还有一个问题,我做了你所说的,效果很好,但我得到了一个数字和变量列表,所以也许你知道如何获得路径变量当你检查
envp[1]时,你是这么说的吗
,为空?您当前的代码是什么?请发布更新的代码。不清楚您到底更改了什么,因此我们无法猜测您的代码现在实际在做什么。