2016-12-30 10 views
-1

Мне интересно, есть ли какой-нибудь простой/опрятный способ в C, чтобы определить, попадает ли данный адресный диапазон (A, A+len) в адресное пространство процесса?Тест Litmus для проверки того, находится ли адресный адрес в адресном пространстве процесса?

EDIT: Мой прецедент больше подходит для обратной инженерии и размещения в памяти некоторых строк (или фиксированных размеров). Так что даже хакерский тест будет работать для меня, чтобы сузить мой поиск.

+3

XY проблема. Не вызывайте неопределенное поведение. Нет гарантии, что неправильный доступ к памяти генерирует сигнал. – Olaf

+0

Если вы считаете, что ваша программа обращается к памяти, ее не следует запускать под [valgrind] (http://valgrind.org). Это скажет вам, где вы ошибаетесь. – dbush

+1

Давайте вернемся к секунде: зачем вам нужно знать? Вообще говоря, вы никогда не должны в конечном итоге иметь недействительные указатели. – duskwuff

ответ

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] 

Здесь много информации, но для вас важны первые две колонки. Первый - это диапазон адресов, а второй - права доступа, с которыми он сопоставляется.

Обратите внимание, что это имеет явное преимущество перед любым подходом, основанным на запуске segfaults: его можно прочитать из другого процесса и не требует добавления какого-либо кода к целевому процессу.

+0

Но мой вариант использования больше из кода C. Я выясню способ чтения из procmap. «Libproc» помогает? – visweshn92