用于检查地址范围是否在进程地址空间的Litmus测试?

时间:2016-12-30 04:21:58

标签: c linux linux-kernel segmentation-fault posix

我想知道在C中是否有任何简单/整洁的方法来检测给定的内存范围(A, A+len)是否属于进程地址空间?

修改: 我的用例更多用于逆向工程并在内存中定位一些字符串(或固定大小的结构)。所以即使是一个hacky测试也可以帮我缩小搜索范围。

1 个答案:

答案 0 :(得分:2)

在Linux上,阅读/proc/$pid/maps。它包含由进程映射的内存范围的文本描述,例如

00400000-0040b000 r-xp 00000000 08:00 35402                              /bin/cat
0060a000-0060b000 r--p 0000a000 08:00 35402                              /bin/cat
0060b000-0060c000 rw-p 0000b000 08:00 35402                              /bin/cat
006ab000-006cc000 rw-p 00000000 00:00 0                                  [heap]
7f9a73235000-7f9a734fe000 r--p 00000000 08:00 949                        /usr/lib/locale/locale-archive
7f9a734fe000-7f9a736b8000 r-xp 00000000 08:00 18124                      /lib/x86_64-linux-gnu/libc-2.19.so
7f9a736b8000-7f9a738b8000 ---p 001ba000 08:00 18124                      /lib/x86_64-linux-gnu/libc-2.19.so
7f9a738b8000-7f9a738bc000 r--p 001ba000 08:00 18124                      /lib/x86_64-linux-gnu/libc-2.19.so
7f9a738bc000-7f9a738be000 rw-p 001be000 08:00 18124                      /lib/x86_64-linux-gnu/libc-2.19.so
7f9a738be000-7f9a738c3000 rw-p 00000000 00:00 0
7f9a738c3000-7f9a738e6000 r-xp 00000000 08:00 17952                      /lib/x86_64-linux-gnu/ld-2.19.so
7f9a73ad9000-7f9a73adc000 rw-p 00000000 00:00 0
7f9a73ae3000-7f9a73ae5000 rw-p 00000000 00:00 0
7f9a73ae5000-7f9a73ae6000 r--p 00022000 08:00 17952                      /lib/x86_64-linux-gnu/ld-2.19.so
7f9a73ae6000-7f9a73ae7000 rw-p 00023000 08:00 17952                      /lib/x86_64-linux-gnu/ld-2.19.so
7f9a73ae7000-7f9a73ae8000 rw-p 00000000 00:00 0
7ffde1b80000-7ffde1ba1000 rw-p 00000000 00:00 0                          [stack]
7ffde1bd5000-7ffde1bd7000 r--p 00000000 00:00 0                          [vvar]
7ffde1bd7000-7ffde1bd9000 r-xp 00000000 00:00 0                          [vdso]
ffffffffff600000-ffffffffff601000 r-xp 00000000 00:00 0                  [vsyscall]

这里有很多信息,但重要的是前两列。第一个是地址范围,第二个是它映射的访问权限。

请注意,这比基于触发段错误的任何方法都有明显的优势:它可以从另一个进程读取,并且不需要将任何代码添加到目标进程。