Mona/デバッグ方法/EIPから関数を特定する


Top / Mona / デバッグ方法 / EIPから関数を特定する

EIPから関数を特定する

PE Explorer を利用した Mona のデバッグの仕方
http://f.hatena.ne.jp/images/fotolife/h/higepon/20071004/20071004200228.png

背景と目的

Mona で特定の eip 範囲で CPU 時間が使われている。
この eip はソースコード上ではどこにマッピングされているかを知りたい。
通常は ld -Map で吐かれるリンクマップでシンボルとリニアアドレスの対応はとれるが、DLL などでは表示されないみたい。
流れ

  1. その eip 範囲のメモリをダンプする
  2. ダンプしたメモリにマッチする DLL を特定する
  3. DLL を PE Explorer で開いて、処理の場所を特定する

1. eip 範囲のメモリをダンプする

適当な一例。
良い子はマネしないでね。
void dumpMemory()
{

   uint32_t* p = (uint32_t*)0xA0029D73;
   for (int i = 0; i < 100; i++)
   {
       logprintf("%x ", p[i]);
   }

}

2. ダンプしたメモリにマッチする DLL を特定する

for i in `find -name "*.DLL"` ; do echo $i; od -x $i -Ax | grep -A2 '4589 8bf4 f445 5b5b 5d5e'; done

マッチした部分は、先頭からのオフセットが出力されているので、このオフセットをキーにして次の作業を行う。
DLL を PE Explorer で開いて、処理の場所を特定する

マッチしたオフセットが 0x25D0 だったと仮定。

  1. PE Explorer に DLL を読み込ませる
  2. .text section を選択して disassembler ボタンを押す
  3. disassemble 画面に Virtual Address と Pointer to RawData という値があるのでメモする
  4. disassemble 画面で Virtual Address + (0x25D0 - Pointer to RawData) の結果の Virtual Address の部分の出力結果を見る
  5. そのアドレスに探していたバイト列があれば正解
  6. そのアドレスから上にスクロールしていくと、どの手続きの中の処理か?が分かる。
  7. さらに細かく調べるなら関数を gcc -S で出力した結果と比べて関数内のどの処理かを見極める。

ああ。投げやりだ。。

コメント

コメントはありません。 コメント/Mona/デバッグ方法/EIPから関数を特定する?

お名前:

MENU

now: 1

リンク


最新の20件
2018-09-03 2018-05-09 2017-09-29 2017-01-10 2016-12-11 2016-10-04 2016-08-14 2016-06-05 2016-05-29 2016-04-15 2015-12-28 2013-02-25 2013-02-21 2013-02-20 2013-02-12 2013-02-11 2013-02-10
最新の20件
2010-02-01 2010-01-31 2010-01-30 2010-01-29 2010-01-16

Counter: 3035, today: 1, yesterday: 2

リロード   新規 編集 凍結 差分 添付 複製 改名   トップ 一覧 検索 最終更新 バックアップ   ヘルプ   最終更新のRSS

Last-modified: 2008-03-28 (金) 15:47:55 (3829d);  Modified by mona
PukiWiki 1.4.6 Copyright © 2001-2005 PukiWiki Developers Team. License is GPL.
Based on "PukiWiki" 1.3 by yu-ji
Powered by PHP 5.2.17
HTML convert time to 0.028 sec.