2016-08-31 6 views
2

PE 파일의 어떤 부분이 MS 로더에 의해 메모리로 매핑됩니까?MS 로더가 PE 파일의 어떤 부분을 메모리에 매핑합니까?

PE 설명서에서 PE 실행 파일의 일반적인 형식을 추론 할 수 있습니다 (아래 참조).

섹션 헤더를 포함하여 PE 파일의 모든 내용이 디스크에 저장된 것과 똑같이 메모리에 매핑된다는 것을 조사하여 알고 있습니다.

다음에 어떤 일이 발생합니까?

파일의 나머지 부분도 매핑되어 있습니다 (아래 그림의 이미지 페이지 부분 참조). 그러면 전체 파일이 정확히 디스크에 저장된 것과 같은 메모리에 저장되거나 그보다 더 선택적입니다 ? 속성 인증서 테이블,

또 다른 예외가 이미지 파일의 맨 끝에 배치해야 그 속성 인증서 및 디버그 정보는 다음과 같습니다 문서에서

, 나는 다음 코드를 발견했습니다 로더가이를 메모리로 맵핑하지 않기 때문에 디버그 섹션 바로 앞에서. 그러나 속성 인증서 및 디버그 정보에 대한 규칙은 객체 파일 에 적용되지 않습니다.

이것은 실제로 로더 동작에 관한 모든 것입니다. 이 두 부분은 메모리에 저장되지 않기 때문에 파일의 마지막 부분에 배치해야합니다.

그러나 로더가이 두 부분을 제외한 모든 항목을로드하고 섹션 RVA를 충분히 높게 설정하면 섹션 데이터가 실제로 메모리에 복제됩니다 (매핑 된 파일에서 한 번, RVA에서 지정한 위치에 한 번) ?

가능하면 MS Windows 전용로드에 대한 추가 정보가있는 곳으로 연결하십시오. MS는 항상 COFF의 설명을 & T 약관 AT 사용하는 경우에 자신의 용어를 사용하여 주장하기 때문에

enter image description here

+0

로드 된 것과 매핑 된 것의 차이점 : 거대한 exe는 메모리에 매핑 될 때 실제로 디스크에서 읽지 않아도됩니다. 큰 파일을 매핑하고 메모리로 요구 페이징 할 수 있습니다. 질문 제목에 "loaded"라고 쓰여 있지만 프로그램 로더가 어떻게 매핑했는지 묻는 중입니다. –

+0

수정되었습니다. 감사합니다. – Shuzheng

+0

전체 PE 파일은 memory-mapped-file 메커니즘을 사용하여 메모리로 매핑됩니다. 후속 액세스 시도로 인해로드가 트리거되는 페이지 폴트가 발생합니다. 당신이 요구하는 대부분의 것들이 당신이 의존해서는 안되는 구현 세부 사항 인 것 같습니다. 의도적으로 문서화되지 않은 것. 어떤 문제를 해결하려고하는지 명확하지 않습니다. RVA는 파일이 메모리 맵핑 된 위치와 관련하여 단순히 오프셋에 불과하기 때문에 메모리에 중복되는 부분이 어떤지 이해하지 못합니다. –

답변

1

이 정보를 찾는 것은 달걀 사냥과 같다.

PE 파일의 어떤 부분이 MS 로더에 의해 메모리로 매핑됩니까?

에 달려 있습니다.
섹션 헤더로 덮여있는 모든 섹션은 런타임 주소 공간에 매핑됩니다.
RVA이 0 인 섹션은 매핑되지 않으므로로드되지 않습니다.

각 디버그 디렉토리 항목은 디버그 정보 블록의 위치와 크기를 식별합니다. 디버그 정보가 섹션 헤더에 포함되지 않으면 (즉, 이미지 파일에 상주하며 런타임 주소 공간에 매핑되지 않은 경우) 지정된 RVA가 0 일 수 있습니다. 매핑 된 경우 RVA는 해당 주소입니다.

메모리에는 디스크에있는 파일의 정확한 복제본이 들어 있습니다.
실행 파일과 dll은 실제 메모리가 아닌 가상 메모리에 매핑됩니다.
실행 파일에 액세스 할 때 필요한 부분을 RAM으로 바꿉니다.

섹션에 액세스하지 않은 경우 분명히 실제 RAM으로 스왑되지는 않지만 여전히 가상 메모리에 매핑됩니다.

about PE files (and more) on MSDN에 대해 알고 싶은 모든 것을 읽을 수 있습니다.

견적은 documentation of the COFF file format에서 해제되었습니다.
결정적인 부분은 다음과 같습니다 속성 인증서 및 디버그 정보에

규칙 파일을 객체에는 적용되지 않습니다. https://support.microsoft.com/en-us/kb/121460

크기 : 실행 파일에 포함하지만, 오브젝트 파일을하지 않는 선택적인 헤더의 크기에서

. 오브젝트 파일의 값은 0이어야합니다.

Ergo : 실행 파일 또는 개체 파일이 아닌 이미지 파일입니다.
같은 규칙에 대한 예외는 적용되지 않습니다.

+1

* "페이지를 RAM으로 바꿀 때 OS가 재배치를 수정합니다."* - 정확하지 않습니다. 모듈이 원하는로드 주소로로드 할 수없는 경우로드시에 모든 재배치가 완료됩니다. 이 프로세스 중에 변경된 메모리 페이지는 더 이상 디스크의 모듈 내용과 일치하지 않으므로 OS에 더 많은 실제 메모리가 필요한 경우 페이징해야합니다 (삭제되는 경우와 비교). 메모리가 페이징 될 때 재배치가 수행되지 않습니다 (로드 시간에 이미 완료되었거나 필요하지 않음). – IInspectable

+0

@IInspectable, AS10에서 재배치는 ASLR이 재배치를 강제하기 때문에 설명 된대로 JIT 방식으로 수행됩니다. – Johan

+0

ASLR은 아무 것도 변경하지 않습니다. 로드 타임에 적용되므로 이미지가 매핑 될 때 재배치가 수정됩니다. 프로세스가 실행 중일 때 주소는 동적으로 변경되지 않습니다! –