2016-12-30 5 views
-1

与えられたメモリ範囲(A, A+len)がプロセスアドレス空間に該当するかどうかを検出するために、Cで単純な方法があるのでしょうか?アドレス範囲がプロセスアドレス空間にあるかどうかを確認するための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] 

ここには多くの情報がありますが、重要なのは最初の2つの列です。最初のものはアドレス範囲で、もう1つはマップされているアクセス権です。

トリガーセグメンテーションをベースにしたアプローチに比べて、別のプロセスから読み取ることができ、ターゲットプロセスにコードを追加する必要はありません。

+0

しかし私のユースケースはCコードのものです。私はprocmapから読む方法を見つけ出すでしょう。 'Libproc'は役に立ちますか? – visweshn92

関連する問題