2017-09-18 11 views
1

Linux上のIntel Pinからアドレススペースのレイアウトを取得したいと考えています。Linux上のIntel Pinからアドレス空間レイアウトを取得する方法は?

まず、ファイル-/proc/PID/mapsを読み込み、アドレス空間のレイアウトを取得しようとします。しかし、いつあなたはそのような部分を実行しますか?

PIN_StartProgramより前に置くと、mapsファイルにはheapなどの一部の領域が含まれません。

Finiに入れてPIN_AddFiniFunction(Fini, 0);でフックすると良いでしょう。しかし、ただ1つのトレースを実行すると、出力関連のアドレススペースレイアウトは表示されません。それは有線です。

+0

「出力関連のアドレス空間レイアウト」とはどういう意味ですか? – nitzanms

答えて

0

ピンには、アドレス空間のレイアウトをより細かく設定できます。あなたはIMG_AddInstrumentFunction()を使用して、画像のロードのためのコールバックを取得し、PIN_AddSyscallEntryFunction()malloc()free()呼び出しRTN_Replace()を使用して、あるいはmmap()をインストルメント、brk()とヒープ割り当てのために他のシステムコールを計測することによりヒープ割り当てのためのコールバックを得ることができます。

これらのAPIの使用例は、PinチュートリアルとPinキットの例で見つけることができます。

0

おそらく最良の解決策ではありませんが、それは私のために働いていました。主な問題は、ツールの起動時にアドレススペースがまだ準備されていないことです。すべての画像がロードされるまで待ってからprocfsの内容を読むことができます。

各画像に計測機能を追加する必要があります。たとえば、次の文をmain関数に追加します。

IMG_AddInstrumentFunction(Image, 0); 

次に、イメージがロードされるたびにprocfsを読み込む必要があります。あなたが最後の画像がロードされる画像わからないので(もちろん、あなたが最後の一つである画像を知っていれば、そのイメージがロードされた後、あなたは、単に、一度だけファイルを読むことができる、)これは、次のとおりです。

VOID Image(IMG img, VOID *v) 
{ 
    ... 
    /* open /proc/PID/maps and read its contents */ 
    ... 
} 

プログラムの実行中は、常にアドレス空間の最新のマッピングがあり、すべてが正常です。システムコールのbrk()を使用してヒープサイズを増やすなど、実行時レイアウトの変更には常に注意する必要があります。

関連する問題