우선 -이 질문에 무지가 있거나 뭔가를 모르는 경우 사과드립니다. 함수의 주소에서 명령어를 읽는 것과 관련된 작업을하고 있는데 컴파일러에서 생성 된 .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
Btw - 편집 및 계속 기능이 실제로 작동하는지 확인하는 방법이 있습니까? –
@ 카림 : pdb에는 뭔가있을 수 있지만, 내가 알지 못하는 것 이외에는. – Necrolis
가장 중요한 것은 증분 링크 옵션입니다. –