execve系统调用中的envp不包含字符串“execpt”的任何内容;l“u C”;
我欺负了打印已执行文件路径的简单监视器,因此我钩住了execve系统调用,但问题是file name参数只包含文件名,而不包含所有路径。无论如何,我复制了envp参数并打印了其中的每个字符串 但是输出只是LS_C,所以我想知道execve系统调用从哪里获取路径 这是我的代码: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
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;isizeof(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]时,你是这么说的吗
,为空?您当前的代码是什么?请发布更新的代码。不清楚您到底更改了什么,因此我们无法猜测您的代码现在实际在做什么。