易配网 - 手机资讯、时事新闻、网络资料
你的位置:易配网 > 新闻 > /proc/pid/mem_

/proc/pid/mem”相关资讯


/proc/pid/mem_:

如何访问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;
}


本文出自 易配网 www.yiper.cn
手机大全
手机型号
  • 本文来自: 易配网,转载请保留出处!
  • 本文链接: /proc/pid/mem_