최근에 저는 직장에서 PE 파일을 어지럽히고 있었고 배후의 Windows 로더 작업에 관심을 갖게되었습니다. PE 파일을로드 할 때 로더가 PE 섹션을 할당 된 PE 메모리에 복사해야하고 일부 로더가 SizeOfRawData
바이트를 커밋하고 일부는 섹션에 대해 VirtualSize
바이트를 커밋하고 때로는 SectionAlignment
(0이면 SizeOfRawData가 초기화되지 않은 데이터 인 경우) . 제 질문은 모든 섹션의 초기화되지 않은 데이터에 대해 SectionAlignment
바이트로 충분하다는 것을 어떻게 알 수 있습니까? 어쩌면 내가 SectionAlignment
보다 훨씬 큰 초기화되지 않은 버퍼가있을 수 있습니다, 그래서 어떻게 다른 섹션을 재정의하지 않을 수 있습니까? 할당해야 할 크기를 예측할 수 있습니까? 안전하게 SectionAlignment
바이트 대신 VirtualSize
바이트를 커밋 할 수 있습니까?PE 파일 섹션 - SizeOfRawData 또는 VirtualSize
3
A
답변
4
필자가 이해하는 한, Windows 로더는 일반적으로 copy the PE sections to the allocated PE memory
이 아닙니다. 오히려 PE의 각 관련 섹션에 대해 가상 크기를 가진 파일 매핑을 생성 한 다음 페이징 시스템이 필요에 따라 파일 내용을 커밋 된 메모리로 가져 오도록합니다.
섹션 정렬은 일반적으로 최소 섹션 해상도 크기, 일반적으로 4096 바이트 (기존 메모리 페이지의 크기)를 참조합니다.
원시 데이터의 크기는 섹션의 디스크에있는 PE 이미지에 실제로있는 데이터의 크기입니다.
+0
정확합니다. 이 방법은 Windows 로더가 정확하게 수행하는 방법이며 디스크에 파일이 있기 때문에 쉽습니다. 버퍼에서 DLL을로드 할 때 그렇게 할 수 없으므로 섹션이 버퍼에서 할당 된 메모리로 복사되고 바로 커밋됩니다. 내 마지막 코멘트를보십시오. 어쩌면 당신이이 문제를 해결하는 데 도움이 될 수 있습니다. – CodeNinja
"일부 로더"는 무엇을 의미합니까? 다른 버전의 Windows? 제 3 자 로더? 부트 드라이버의 로더 대 응용 프로그램의 로더? –
개인 PE 로더 – CodeNinja
그렇다면 그들이 잘못하고있을 가능성이 있습니다. 이 스펙에서는 각 섹션에 대해'VirtualSize' 바이트를 할당해야한다고 생각합니다. –