빌드 디버그에서) (주 함수의 주소를 취득합니다 : 주()의
주소 : 0x00401000
나는 이런 식으로) (주 기능의 주소를 얻으려고
이 디버거에서이다
00401000 /$ 68 00104000 PUSH GetMain.00401000 ; Entry address
00401005 |. 68 50A14000 PUSH GetMain.0040A150 ; ASCII "0x%p \n"
0040100A |. E8 8B000000 CALL GetMain.0040109A
B ut /Zi 옵션으로 컴파일하거나 디버그 빌드를 사용하는 경우 주소가 리디렉션됩니다.
주 주소() : 0x0041178A
.
00412530 /> \55 PUSH EBP
...
00412539 |. C745 FC 8A174100 MOV [LOCAL.1],GetMain.0041178A ; Entry address
00412540 |. 8B45 FC MOV EAX,[LOCAL.1]
00412543 |. 50 PUSH EAX
00412544 |. 68 5CEC4200 PUSH GetMain.0042EC5C ; ASCII "0x%p \n"
왜 hapenes : 이 주소는 unconditional jump을 행함으로써 얻어지는 실제 주소 0x00412530
이 디버거하에인가?
디버그 빌드에서 코드를 컴파일하면 main() 함수의 실제 주소 (위의 예에서 0x00412530
)를 얻는 방법은 무엇입니까?
편집 :
왜 이런 일이 발생합니까? 이미 여기에 답변 : strange level of indirection of a function call
아래의 기능은 내 대답을 해결, Here 내가 답변을 썼습니다.
void *GetMainAddress(void)
{
void *pMainAddress=(void*)&main;/* address in main() function */
unsigned long calculateJump=0;
unsigned char *ptrJump;
printf("Address of main() : 0x%08X\n", pMainAddress);
ptrJump=(unsigned char*)pMainAddress;/* get pointer to main address */
if(*(unsigned char*)ptrJump == 0xE9)/* address point to jmp opcode ? */
{
calculateJump = (*(unsigned long *)(ptrJump+1)); /* get address after 0xe9 */
pMainAddress = ptrJump + calculateJump + 5; /* calculate real address */
printf("Unconditional jump is performed\n");
printf("Actual sddress of main() is: 0x%08X \n", pMainAddress);
}
else
{
printf("Unconditional jump is not performed\n");
}
return pMainAddress;
}
[함수 호출의 간접적 인 수준의] 가능한 복제본 (http://stackoverflow.com/questions/7221855/strange-level-of-indirection-of-function-call) –
나는 생각한다. C++과 달리 C와는 달리'main()'은 재귀 적으로 호출 될 수 없으며 주소를 가져올 수 없습니다. C와 C++ 코드 또는 컴파일러를 혼합하는 경우 조심하십시오 (어쨌든 믹싱이 좋지 않으므로 다른 많은 차이점이 있지만). –
@ VladLazarenko Lazarenko 당신 말이 맞아요,하지만 제 경우에는'main()'을 호출하지 않고 포인터를 그 주소로 가져 가면됩니다. 코드가'/ ZI'로 컴파일되면,'pMainAddress'는 점프 연산 코드에 대한 포인터입니다. 그렇지 않으면 (* Release Build *) -'main() '의 실제 주소입니다. 또한 게시하기 전에 테스트했습니다. 그것은 언어 C와 C++ 모두에서 작동합니다. – boleto