读取进程空间中vdso段的内容

之前一篇博客介绍了如何用 python 读取进程中某块内存区域的内容,后来发现用 shell 实现起来更简单一些。以下 shell 脚本可以读取进程空间中 vdso 段内存区域的内容,仅供参考:

#!/bin/bash

[ -z "$1" ] && echo "Usage: $0 out_file" && exit

mem_start=`cat /proc/$$/maps |grep vdso |awk -F'-' '{print $1}'`

skip=$((16#$mem_start))
count=16384 # 在 mips 上 vdso 的大小是 16K (16384),在 x86 上应该是 4K (4096)

out_file=$1
dd if=/proc/$$/mem of=$out_file bs=1 skip=$skip count=$count
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解决思路: 1.编写一个简单的C程序,包含全局变量、局部变量和动态分配内存等。 2.在程序使用一些系统调用,例如malloc、free、sleep等,使进程空间发生变化。 3.在程序打印出进程ID,并在程序执行过程使用ps和top命令查看进程的内存使用情况。 4.通过观察/proc/$pid/maps文件,可以了解进程空间的变化情况,并可以画出变量所在内存的图示。 示例代码如下: ``` #include <stdio.h> #include <stdlib.h> #include <unistd.h> int global_var = 10; //全局变量 const int const_var = 20; //常量变量 int main() { int local_var = 30; //局部变量 int *dynamic_var = (int*)malloc(sizeof(int)); //动态分配内存 printf("Process ID: %d\n", getpid()); //打印进程ID printf("Global variable: %p\n", &global_var); //打印全局变量地址 printf("Constant variable: %p\n", &const_var); //打印常量变量地址 printf("Local variable: %p\n", &local_var); //打印局部变量地址 printf("Dynamic variable: %p\n", dynamic_var); //打印动态分配内存地址 free(dynamic_var); //释放动态分配内存 sleep(10); //等待10秒钟 return 0; } ``` 上述代码,获取进程ID使用了getpid函数,打印变量地址使用了&符号,动态分配内存使用了malloc函数,释放内存使用了free函数,等待10秒钟使用了sleep函数。在程序运行过程,可以通过ps和top命令查看进程的内存使用情况,通过观察/proc/$pid/maps文件,可以了解进程空间的变化情况。 以下为变量所在内存的图示示例: ``` Global variable: 0x6020a0 Constant variable: 0x6020ac Local variable: 0x7ffd7c5d8b0c Dynamic variable: 0x1576010 ``` ``` 00400000-00401000 r-xp 00000000 08:01 3932173 /home/user/mainProg 00600000-00601000 rw-p 00001000 08:01 3932173 /home/user/mainProg 01576000-01578000 rw-p 00000000 00:00 0 [heap] 7f8e8c000000-7f8e8c021000 rw-p 00000000 00:00 0 7f8e8c021000-7f8e90000000 ---p 00000000 00:00 0 7f8e908f0000-7f8e908f4000 r--p 00000000 08:01 268440 /lib/x86_64-linux-gnu/libc-2.27.so 7f8e908f4000-7f8e9090a000 r-xp 00004000 08:01 268440 /lib/x86_64-linux-gnu/libc-2.27.so 7f8e9090a000-7f8e9094e000 r--p 0015a000 08:01 268440 /lib/x86_64-linux-gnu/libc-2.27.so 7f8e9094e000-7f8e9094f000 ---p 0019e000 08:01 268440 /lib/x86_64-linux-gnu/libc-2.27.so 7f8e9094f000-7f8e90951000 r--p 0019e000 08:01 268440 /lib/x86_64-linux-gnu/libc-2.27.so 7f8e90951000-7f8e90954000 rw-p 001a0000 08:01 268440 /lib/x86_64-linux-gnu/libc-2.27.so 7f8e90954000-7f8e90958000 rw-p 00000000 00:00 0 7f8e9096e000-7f8e90971000 r--p 00000000 08:01 268408 /lib/x86_64-linux-gnu/ld-2.27.so 7f8e90971000-7f8e9098f000 r-xp 00003000 08:01 268408 /lib/x86_64-linux-gnu/ld-2.27.so 7f8e9098f000-7f8e90999000 r--p 00021000 08:01 268408 /lib/x86_64-linux-gnu/ld-2.27.so 7f8e90999000-7f8e9099a000 rw-p 0002b000 08:01 268408 /lib/x86_64-linux-gnu/ld-2.27.so 7f8e9099a000-7f8e9099b000 rw-p 00000000 00:00 0 7ffcd1b0b000-7ffcd1b2c000 rw-p 00000000 00:00 0 [stack] 7ffcd1b8d000-7ffcd1b8f000 r--p 00000000 00:00 0 [vvar] 7ffcd1b8f000-7ffcd1b91000 r-xp 00000000 00:00 0 [vdso] ffffffffff600000-ffffffffff601000 --xp 00000000 00:00 0 [vsyscall] ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值