linux 查看进程数据段,如何读取Linux进程中的代码段和数据段

本文介绍了如何在Linux环境下,通过Ptrace系统调用和/proc/pid/maps文件来读取进程的代码段和rodata数据段。程序首先获取目标进程ID,然后使用Ptrace进行绑定,接着读取/proc/pid/maps找到内存段地址,最后通过文件描述符访问内存并读取数据。
摘要由CSDN通过智能技术生成

Linux下的程序的文件格式是ELF,里面分了各种段,有代码段、数据段、等。当运行这个程序时,系统也会给这个进程创建虚拟内存,然后把ELF中的数据分别加载到内存中的对应位置。本文整理了用cpp程序读取内存中的代码段和rodata数据段的方法。

Ptrace

Ptrace是一个Linux系统提供的一个功能强大的API接口,可以让一个进程跟踪或控制另一个进程,调试程序GDB就是在这个系统调用的基础上开发的。

long ptrace(enum ptrace_request request,pid_t pid,void addr, void *data);

参数request 控制ptrace函数的行为,定义在sys/ptrace.h中。

参数pid 指定trace的进程号。

以上两个参数是必须的,之后两个参数分别为地址和数据,其含义由参数request控制。

/proc/pid/mem

mem是内核创建的虚拟文件,是Linux的”一切皆文件”在进程上的体现,但是这个文件无法直接进行读取,需要先利用ptrace进行绑定操作。

用ptrace绑定之后就可以用read来读取这个“文件”了,但是要注意输入读取的地址不对,也读不出数据来。

/proc/pid/maps

下图是Linux的进程内存布局,这是系统给进程虚拟出的一个内存空间,并不是实际的物理内存,maps文件中就记录了虚拟内存的的每段地址分别对应什么数据。

9a85277ff9a0294358688bc368fcc929.png

maps文件的内容可以通过cat命令直接查看:

root@yifei:~/blog_backup/source/_notes# cat /proc/32435/maps

55ad31b9f000-55ad31ba0000 r-xp 00000000 08:08 2755760 /root/cppSpace/test/while

55ad31d9f000-55ad31da0000 r--p 00000000 08:08 2755760 /root/cppSpace/test/while

55ad31da0000-55ad31da1000 rw-p 00001000 08:08 2755760 /r

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值