c - 检查地址范围是否在进程地址空间中的石蕊测试?

标签 c linux linux-kernel segmentation-fault posix

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

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

最佳答案

在 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 - 检查地址范围是否在进程地址空间中的石蕊测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41390571/

相关文章:

linux - iscsiadm 无法登录除 3260 之外的任何端口

linux - Linux内核版本之间有什么区别

c - 为什么在许多驱动程序上,函数的返回值是用变量处理的?

c - 如何在 C 中正确使用 void 指针?

c - malloc 不转换为结构

linux - 在 bash 函数中,如何将 stdin 放入变量中

Ruby 和 Linux,首选设置?

c - 在 C 中访问进程的 PCB

c - 适用于 Windows 7 64 位的 c 和 c++ 的 mingw 和代码块?

C 函数返回(看似)随机整数