lieye_leaves 发表于 2014-07-08 16:23

查看proc/pid/mem遇到的问题。

在linux文件系统中,查看某进程的内存,如pid=23;
通过命令 cat /proc/23/mem
提示:cat: mem: Operation not permitted
请问该问题是怎么回事,谢谢先。

q1208c 发表于 2014-07-08 16:46

ls -l /proc/23/mem 看一下.

lieye_leaves 发表于 2014-07-08 16:56

mem应该是个文件,我希望看到文件的内容。

q1208c 发表于 2014-07-08 19:39

回复 3# lieye_leaves


    :em06: :em06:

这文件 只有 root 用户可以查看. 你没执行我上面的命令么?!

lieye_leaves 发表于 2014-07-08 21:06

本帖最后由 lieye_leaves 于 2014-07-08 21:10 编辑

不好意思,我就是用root用户登陆的,那个控制台是否不一样,提示就是权限不够 。我用su命令也试了下。

humjb_1983 发表于 2014-07-09 09:00

看起来像是这个proc接口的实现问题,需要看看代码。。

lieye_leaves 发表于 2014-07-09 10:13

# cat mem
cat: mem: Operation not permitted


如上所示。

humjb_1983 发表于 2014-07-09 10:33

/*
* Return zero if current may access user memory in @task, -error if not.
*/
static int check_mem_permission(struct task_struct *task)
{
        /*
       * A task can always look at itself, in case it chooses
       * to use system calls instead of load instructions.
       */
        if (task == current)
                return 0;

        /*
       * If current is actively ptrace'ing, and would also be
       * permitted to freshly attach with ptrace now, permit it.
       */
        if (task_is_stopped_or_traced(task)) {
                int match;
                rcu_read_lock();
                match = (tracehook_tracer_task(task) == current);
                rcu_read_unlock();
                if (match && ptrace_may_access(task, PTRACE_MODE_ATTACH))
                        return 0;
        }

        /*
       * Noone else is allowed.
       */
        return -EPERM;
}

2.6.32的代码,在读取时(mem_read),进行权限检查,看似只能看自己进程的mem,或者使用ptrace。所以通常都是不允许的。

我看新版本内核中,应该没有这个权限判断了,不知你用的是啥版本?

asuka2001 发表于 2014-07-09 10:34

回复 7# lieye_leaves

mem_open()
      __mem_open()
                mm_access()

struct mm_struct *mm_access(struct task_struct *task, unsigned int mode)
{
        struct mm_struct *mm;
        int err;

        err =mutex_lock_killable(&task->signal->cred_guard_mutex);
        if (err)
                return ERR_PTR(err);

        mm = get_task_mm(task);
        if (mm && mm != current->mm &&
                        !ptrace_may_access(task, mode)) {
                mmput(mm);
                mm = ERR_PTR(-EACCES);
        }
        mutex_unlock(&task->signal->cred_guard_mutex);

        return mm;
}

task是 /proc/$pid/mem中 $pid对应的进程!

q1208c 发表于 2014-07-09 11:00

回复 5# lieye_leaves

我刚刚也试了一下, 你查看的可能是一个内核mod的进程, 这个好象不能直接查看. :em06:
普通用户进程是可以的. :wink:
   
页: [1] 2
查看完整版本: 查看proc/pid/mem遇到的问题。