我想知道 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/