2013-03-09 5 views
3

요즘에는 PE 실행 사양을 읽었습니다. 그렇다면 나는 작은 C 프로그램을 만들고 push ebp, pop ebp 그리고 나는 그것을 컴파일했다. 성공적으로 컴파일 한 후 PE 파일을 실행 파일로 열었고 PE_magic + PE_header_size + PE_OPTHDR_entrypoint 위치에서 보았습니다. PE 마법은 파일에서 "PE"문자열의 첫 번째 항목이었고 PE_header_size는 24 였고 PE & COFF 사양에 따르면 PE_OPTHDR은 16이었습니다. 그 위치에서 주소 0x1000을 찾았지만 내 파일의 길이는 0x600입니다. 그래서 내가 올바른 위치에 있거나 진입 점 (0x200에있는 방법) 주소가 잘못 설정 되었습니까?진입 점이 정확한 위치에 있습니까?

내 파일 contens 및 내 코드의 이미지를 포함합니다. 이 파일에 표시되는 내용

int main() { 
    int a = 0; 
    __asm { 
     push ebp 
     pop ebp 
    } 
} 
+0

적어도 헤더 정보를 읽을 때까지 PE 코드를 표시하십시오 –

답변

2

이 메모리에 어떻게 보이는지 일치하지 않습니다

0x55 means PUSH EBP and 0x5D means POP EBP

코드 (프로젝트 속성에서 나는 표준 라이브러리의 검사되지 않은 추가했습니다). 보시다시피 파일 정렬은 $ 200이고 인 메모리 섹션 정렬은 $ 1000입니다. 이는 대개 파일이 나타내는 이미지보다 패딩이 적음을 의미합니다.

더 중요한 것은 .text의 섹션 테이블 항목에 상대 가상 주소가 $ 1000 (이미지베이스 기준)이지만 원시 주소가 $ 200 (파일 시작 위치 대비)임을 알 수 있습니다. 어떤 것이 어디에 있는지를 말하는 거의 모든 필드는 RVA입니다. 즉, 그들이 Image Base에서 참조하는 것의 오프셋을 메모리에 저장한다는 것을 의미합니다.

주소가 잘못 설정되지 않았습니다. 텍스트는 $ 1000부터 시작하며 (이미지베이스와 관련이 있습니다) 엔트리 포인트가 가리키는 곳입니다.

+0

그래서 optionaly는 파일 내에서 실제 위치를 어떻게 계산할 수 있습니까? – user35443

+1

@ user35443 나는 코멘트에 모두 넣으려고했으나 조금 길다. http://www.tech-juice.org/2011/02/21/portable-executable-converting-rva-to-file - 오프셋 및 백 / – harold

관련 문제