まずは、この質問が無知を示しているか、何かを認識していない場合はお詫び申し上げます。 私は、関数のアドレスで命令を読むことを含む何かをしようとしています。コンパイラによって生成された.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
Btw - 編集と継続が実用的にオンになっているかどうかを判断する方法はありますか? –
@カリマ:pdbには何かがあるかもしれませんが、私には分かりません。 – Necrolis
これは、まず、増分リンクオプションです。 –