如何访问proc/pid/mem

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何访问proc/pid/mem相关的知识,希望对你有一定的参考价值。

在Linux/Unix中内存采用保护模式,每个进程都有独立的内存地址。可以访问/proc/$pid/maps看到。
一、进程的内存结构认识:
[root@dev 28515]# pwd
/proc/28515
[root@dev 28515]# cat maps
003ee000-00407000 r-xp 00000000 fd:00 2197065 /lib/ld-2.5.so
00407000-00408000 r--p 00019000 fd:00 2197065 /lib/ld-2.5.so
00408000-00409000 rw-p 0001a000 fd:00 2197065 /lib/ld-2.5.so
00410000-0054d000 r-xp 00000000 fd:00 2197101 /lib/i686/nosegneg/libc-2.5.so
0054d000-0054f000 r--p 0013d000 fd:00 2197101 /lib/i686/nosegneg/libc-2.5.so
0054f000-00550000 rw-p 0013f000 fd:00 2197101 /lib/i686/nosegneg/libc-2.5.so
00550000-00553000 rw-p 00550000 00:00 0
00b0d000-00b0e000 r-xp 00b0d000 00:00 0 [vdso]
08048000-08049000 r-xp 00000000 fd:00 2621911 /home/louis/elf/proc_mem/main
08049000-0804a000 rw-p 00000000 fd:00 2621911 /home/louis/elf/proc_mem/main
08c6a000-08c8c000 rw-p 08c6a000 00:00 0
b7fc7000-b7fc8000 rw-p b7fc7000 00:00 0
b7fde000-b7fdf000 rw-p b7fde000 00:00 0
b7fdf000-b7fe0000 rw-s 00000000 00:08 58445 /dev/zero (deleted)
b7fe0000-b7fe1000 rw-p b7fe0000 00:00 0
bff35000-bff4b000 rw-p bff35000 00:00 0 [stack]
其中b7fdf000-b7fe000内存段是使用mmap开闭的共享内存。貌似对应一个/dev/zero文件。
每个进程的代码段内存都在b7fdf000-b7fe000位置。
二、访问其他进程的结构。
如果想使用其他进程的内存结构有几个问题注意。
1.使用ptrace开启进程内存跟踪。
2.貌似定位的时候不能使用lseek,而是使用lseek64定位函数。由于pread是lseek与read的结合,所以也不能读取,总报非法参数错误。
3.我在写代码的时候,发现声明为保护的内存区域也可以访问。
第一个程序,创建各种内存变量。第二个程序直接访问。
=========================================================
#include<stdio.h>
#include<unistd.h>
#include<sys/mman.h>
#include<stdlib.h>
/*这些变量被access_mem.c程序访问*/
int var1=10;
static int var2=20;
int main(int argc,char **argv)

int var3=30;
static int var4=40;
int *var5=malloc(sizeof(int));
*var5=50;
int *var6=sbrk(0);
brk(var6+1);
*var6=60;
int *var7=mmap(0,sizeof(int),PROT_READ|PROT_WRITE,MAP_SHARED|MAP_ANONYMOUS,0,0);
*var7=70;
printf("进程 ID:%d\\n",getpid());
printf("var1:%p\\n",&var1);
printf("var2:%p\\n",&var2);
printf("var3:%p\\n",&var3);
printf("var4:%p\\n",&var4);
printf("var5:%p\\n",var5);
printf("var6:%p\\n",var6);
printf("var7:%p\\n",var7);
while(1);
return 0;

=========================================================
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<sys/mman.h>
#include<fcntl.h>
#include<string.h>
#include<sys/ptrace.h>
/*该程序直接访问accessed_mem.c程序的内存空间*/
int main(int argc,char **argv)

/*
char buf[200];
bzero(buf,200);
sprintf(buf,"/proc/%d/mem",getpid());
int fd=open(buf,O_RDONLY);
ptrace(PTRACE_ATTACH,28515,0,0);/*跟踪某进程的内存*/
int var1=0;
off_t r=lseek64(fd,0x80497e4,SEEK_SET);/*其中的定位使用64位定位方式,才能读取*/
if(r==-1)printf("lseek error:%m\\n");
printf("位置:%x\\n",r);
ssize_t size=read(fd, &var1, sizeof(int));
if(size==-1) printf("read error:%m\\n");
printf("var1的值:%d\\n",var1);
close(fd);
return 0;
参考技术A lseek,pread,pwrite。
传统的文件api不能用

以上是关于如何访问proc/pid/mem的主要内容,如果未能解决你的问题,请参考以下文章

linux下用程序读取某进程的状态信息(/proc/[pid]/stat)时,该进程结束了。怎么办

linux /proc/$pid/smaps 文件中各个字段代表啥含义

如何查看linux系统中空闲内存/物理内存使用/剩余内存

linux下httpd进程cup 100% kill了进程还是自动重启,/proc/pid/exe也找不到该进程的执行文件

/proc文件系统的作用

Android 逆向Android 系统文件分析 ( /proc/pid 进程号对应进程目录 | oom_adj | maps | smaps | mem | task | environ )(代码片