使用/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;
 }
=========================================================
在读取本进程代码段数据的时候,使用pread读取和使用lseek都没有问题。读取其他进程就有问题。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值