2012-02-14 2 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); 
    // (...) 
} 

: 00C04B1E 아래의 명령, function의 시작 부분에 해당하는 주소에 따라

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 

는 0C011F4 아래 - 무효 * 주소에 저장됩니다 정확히이다. 여기

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 아래 :

지금 디버거를 통해 스테핑 및 기능 (INT, INT)로 점프를 수행하는 것은 나에게 다음과 같은 분해를 제공합니다. 왜 그런가요? 그것은 1996 바이트 떨어져 있습니다. 나는 어떤 상관 관계를 찾기 위해 노력했지만 나는 여기서 뭔가 근본적인 것을 놓치고 있다고 생각한다. 누군가이 두 주소가 다른 이유를 말해 주실 수 있습니까?

void * address (0C011F4)가 가리키는 영역을 복사 할 때도 함수 (int, int)에있는 asm 명령어에 해당하는 기계어 코드를 얻지 못합니다.

미리 감사드립니다.

봉투 : 당신이 (계속 편집 &에 의해 사용) MSVC 통화와 실제 기능 사이의 중간 점프를 넣어 원인이 디버그 모드에서 바이너리를 컴파일 한 원인이 Windows x64, VC10

답변

4

이입니다. 따라서 주소 (및 어셈블리)는 함수를 가리키는 점프의 주소입니다.

릴리스 모드를 사용하거나 편집 & 계속을 사용하지 않음으로써 제거 할 수 있습니다. 또는 긴 경로를 선택하고 점프를 분해하면 (32 비트 상대 점프 여야 함) 점프 할 상대 변위를 사용하여 주소를 조정할 수 있습니다.

+0

Btw - 편집 및 계속 기능이 실제로 작동하는지 확인하는 방법이 있습니까? –

+1

@ 카림 : pdb에는 뭔가있을 수 있지만, 내가 알지 못하는 것 이외에는. – Necrolis

+0

가장 중요한 것은 증분 링크 옵션입니다. –

관련 문제