static void show_vma_header_prefix2(struct seq_file
*
m,
unsigned
long
start, unsigned
long
end,
vm_flags_t flags, unsigned
long
long
pgoff,
dev_t dev, unsigned
long
ino)
{
seq_setwidth(m,
25
+
sizeof(void
*
)
*
6
-
1
);
seq_printf(m,
"%08lx-%08lx %c%c%c%c %08llx %02x:%02x %lu "
,
start,
end,
/
/
文件权限相关, 这里把可执行权限隐藏掉, 伪造成匿名映射.或者其他系统映射都可以
flags & VM_READ ?
'r'
:
'-'
,
flags & VM_WRITE ?
'w'
:
'-'
,
'-'
,
/
/
flags & VM_EXEC ?
'x'
:
'-'
,
flags & VM_MAYSHARE ?
's'
:
'p'
,
0
,
/
/
pgoff,
0
,
0
,
0
);
/
/
MAJOR(dev), MINOR(dev), ino);
}
static void
show_map_vma(struct seq_file
*
m, struct vm_area_struct
*
vma,
int
is_pid)
{
struct mm_struct
*
mm
=
vma
-
>vm_mm;
struct
file
*
file
=
vma
-
>vm_file;
vm_flags_t flags
=
vma
-
>vm_flags;
unsigned
long
ino
=
0
;
unsigned
long
long
pgoff
=
0
;
unsigned
long
start, end;
dev_t dev
=
0
;
const char
*
name
=
NULL;
char path_buf[PATH_MAX]
=
{
0
};
if
(
file
) {
struct inode
*
inode
=
file_inode(vma
-
>vm_file);
dev
=
inode
-
>i_sb
-
>s_dev;
ino
=
inode
-
>i_ino;
pgoff
=
((loff_t)vma
-
>vm_pgoff) << PAGE_SHIFT;
}
start
=
vma
-
>vm_start;
end
=
vma
-
>vm_end;
if
(
file
) {
show_vma_header_prefix2(m, start, end, flags, pgoff, dev, ino);
}
else
{
show_vma_header_prefix(m, start, end, flags, pgoff, dev, ino);
}
/
*
*
Print
the dentry name
for
named mappings,
and
a
*
special [heap] marker
for
the heap:
*
/
if
(
file
) {
/
/
获取文件名称
char
*
path
=
d_path(&
file
-
>f_path, path_buf, sizeof(path_buf));
seq_pad(m,
' '
);
if
(strlen(path) >
0
) {
if
(strstr(path,
"xxxx.so"
)) {
/
/
过滤xxxx.so
goto done;
}
}
seq_file_path(m,
file
,
"\n"
);
goto done;
}
if
(vma
-
>vm_ops && vma
-
>vm_ops
-
>name) {
name
=
vma
-
>vm_ops
-
>name(vma);
if
(name)
goto done;
}
name
=
arch_vma_name(vma);
if
(!name) {
if
(!mm) {
name
=
"[vdso]"
;
goto done;
}
if
(vma
-
>vm_start <
=
mm
-
>brk &&
vma
-
>vm_end >
=
mm
-
>start_brk) {
name
=
"[heap]"
;
goto done;
}
if
(is_stack(vma)) {
name
=
"[stack]"
;
goto done;
}
if
(vma_get_anon_name(vma)) {
seq_pad(m,
' '
);
seq_print_vma_name(m, vma);
}
}
done:
if
(name) {
seq_pad(m,
' '
);
seq_puts(m, name);
}
seq_putc(m,
'\n'
);
}