2014-11-11 3 views
0

파일의 오프셋에 관한 질문이 있습니다. 이런 파일을 열면 ".exe"확장자/파일이 있습니다.메모리 주소 파일

handle = open('file.exe', mode='rb') 

이제 10 번째 '바이트'에 액세스하려고하면 검색 기능을 사용할 수 있습니다.

handle.seek(10, 0) 

PE 헤더의 많은 값은 RVA입니다. 즉 Imagebase + RVA는 메모리에로드 될 때의 오프셋입니다. 문제는 당신이이 가치를 추구 할 수 없다는 것입니다. 예 :

.idtata 섹션에는 가상 주소 (RVA)와 원시 주소 (이미지 기반)가 있습니다. 이전 방법을 사용하면 원시 주소를 사용하여 올바른 오프셋에서 읽을 수 있습니다. 많은 값들에 대해서만 RVA가 주어진다.

이 방법으로 파일을 여는 것은 메모리에로드 될 때 이미지베이스가 0x00400000 인 대부분의 시간에 시작됩니다. 파일을 메모리에로드하여 메모리에로드 할 때 정확한 오프셋 값을 사용하는 방법이 있습니까? 그래서 0 대신 RVA의 파일을 찾을 수 있도록 파일이 이미지베이스에서 시작됩니까?

종류의 안부와

, 당신이 윈도우에있는 경우

+0

"[실행 파일] 파일을 메모리에로드하지 마십시오." 나는 이에 대한 결정적인 대답은 없다고 생각한다. [메모리 주소 무작위 화] (https://en.wikipedia.org/wiki/Address_space_layout_randomization) – goncalopp

답변

0

, 당신은 (즉, 압축 풀기) 당신을 위해 메모리에 PE 이미지를 이미지 로더 부하를 가질 수있다. 그런 다음 이미지 기반에 상대적으로 직접 RVA를 사용하여 원하는 데이터를 찾을 수 있습니다.

또 다른 옵션은 몇 가지 기능을 구현하여 PE 헤더와 섹션 테이블을 구문 분석하는 것입니다. 섹션 테이블에는 PE 파일의 각 섹션에 대한 정보 (파일에있는 원시 파일 오프셋)와 이미지 기반 주소를 기준으로 메모리에서 압축을 해제해야하는 위치가 들어 있습니다. 섹션 테이블을 통해 RVA를 해당 원시 파일 오프셋으로 변환하는 함수를 작성할 수 있습니다.

주의해야 할 점은 모든 RVA를 파일 오프셋에 다시 매핑 할 수있는 것은 아닙니다. 예를 들어, 많은 섹션은 바이너리 파일에 명시 적으로 표시되지 않는 끝에 0으로 초기화 된 데이터가있는 영역을 가지고 있습니다. 대신에 로더는로드 할 때 섹션 테이블 항목에있는 각 섹션의 가상 크기에 따라 해당 섹션을 0으로 채 웁니다.