2012-02-14 7 views
2

まずは、この質問が無知を示しているか、何かを認識していない場合はお詫び申し上げます。 私は、関数のアドレスで命令を読むことを含む何かをしようとしています。コンパイラによって生成された.pdbファイルを調べることで、関数の生成コードサイズを取得できました。デバッガの表示と一致しない関数ポインタアドレス

しかし、私を混乱させる何かが、次の例を見て、そこにある:私はボイド*アドレスに格納し、VSのdissassemblyウィンドウがそれに応じて表示された0x00c011f4を持って、デバッガの下で特定の実行のために

int function(int a, int b) 
{ 
    return a + b; 
} 

int main(int argc, char* argv[]) 
{ 
    // (...) 
    void* address = &function; 
    function(10, 20); 
    // (...) 
} 

int main(int argc, char* argv[]) 
{ 
00C04B00 push  ebp 
00C04B01 mov   ebp,esp 
00C04B03 sub   esp,178h 
00C04B09 push  ebx 
00C04B0A push  esi 
00C04B0B push  edi 
00C04B0C lea   edi,[ebp-178h] 
00C04B12 mov   ecx,5Eh 
00C04B17 mov   eax,0CCCCCCCCh 
00C04B1C rep stos dword ptr es:[edi] 
    void* address = &function; 
00C04B1E mov   dword ptr [address],offset function (0C011F4h) 
    function(10, 20); 
00C04B25 push  14h 
00C04B27 push  0Ah 
00C04B29 call  function (0C011F4h) 
00C04B2E add   esp,8 

00C04B1E下の指示によると、functionの先頭に対応するアドレスは0C011F4の下にある - void *型のアドレスに格納されます正確に何をしています。

は今(int型、intは)私に、次の分解を与えるデバッガでのステップ実行や関数にジャンプを次

int function(int a, int b) 
{ 
00C019C0 push  ebp 
00C019C1 mov   ebp,esp 
00C019C3 sub   esp,0C0h 
00C019C9 push  ebx 
00C019CA push  esi 
00C019CB push  edi 
00C019CC lea   edi,[ebp-0C0h] 
00C019D2 mov   ecx,30h 
00C019D7 mov   eax,0CCCCCCCCh 
00C019DC rep stos dword ptr es:[edi] 
    return a + b; 
00C019DE mov   eax,dword ptr [a] 
00C019E1 add   eax,dword ptr [b] 
} 
00C019E4 pop   edi 
00C019E5 pop   esi 
00C019E6 pop   ebx 
00C019E7 mov   esp,ebp 
00C019E9 pop   ebp 
00C019EA ret 

ここでの関数(int型、int型)の物乞いが0x00C019C0の下にあります。何故ですか?それは1996バイト離れている。私はどんな相関関係も見つけようとしましたが、私はここで何か根本的なものが欠けていると思います。誰かがなぜこの2つのアドレスが異なるのか教えてください。

void * address(0C011F4)が指す領域をコピーするときに、関数(int、int)のasm命令に対応するマシンコードを取得しません。

ありがとうございます!

ENV:あなたはMSVCはコールと(編集&続行で使用するために)実際の関数の間の仲介ジャンプを置くことを引き起こして、デバッグモードでバイナリをコンパイルした原因のWindows x64の、VC10

答えて

4

です。したがって、あなたが取得しているアドレス(およびアセンブリ)は、あなたの関数を指すジャンプのアドレスです。

リリースモードを使用するか、編集&続行を無効にすることで、これを削除できます。代わりに、あなたは長い道のりをとり、ジャンプ(それは32ビットの相対的なジャンプでなければならない)を逆アセンブルし、あなたがジャンプする相対変位を使ってアドレスを調整することができます。

+0

Btw - 編集と継続が実用的にオンになっているかどうかを判断する方法はありますか? –

+1

@カリマ:pdbには何かがあるかもしれませんが、私には分かりません。 – Necrolis

+0

これは、まず、増分リンクオプションです。 –

関連する問題