【问题标题】:Litmus test for checking if address range is in process address space?检查地址范围是否在进程地址空间中的试金石?
【发布时间】:2016-12-30 04:21:58
【问题描述】:

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

编辑: 我的用例更多用于逆向工程和在内存中定位一些字符串(或固定大小的结构)。因此,即使是 hacky 测试也适合我缩小搜索范围。

【问题讨论】:

  • XY 问题。不要调用未定义的行为。不能保证错误的内存访问会产生信号。
  • 如果您认为您的程序正在访问它不应该访问的内存,请在valgrind 下运行它。这会告诉你哪里出错了。
  • 让我们备份一下:为什么需要知道?一般来说,你一开始就不应该得到无效的指针。
  • 我的用例是用于逆向工程并在内存中定位一些字符串(或固定大小的结构)。因此,即使是 hacky 测试也适合我缩小搜索范围

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


【解决方案1】:

在 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]

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

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

【讨论】:

  • 但我的用例更多来自 C 代码。我会想出一种从procmap中读取的方法。 Libproc 有帮助吗?
猜你喜欢
  • 1970-01-01
  • 2013-08-22
  • 1970-01-01
  • 2011-09-30
  • 2017-05-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-05
  • 1970-01-01
相关资源
最近更新 更多