2012-04-23 1 views
1

저는 관리되지 않는 .NET API를 사용하고 있으며 메서드에 대한 CIL 바이트 코드를 얻고 싶습니다. IMetaDataImport 인터페이스는 메서드 구현의 RVA를 제공하지만 실제 메모리 위치는 본적이 없습니다.IMetaDataImport가 RVA를 포인터로 해석 할 수 있습니까?

PE 헤더를 직접 구문 분석하지 않고도 정보를 얻을 수있는 방법이 있습니까? 나는 그렇게하기가 어렵지 않다는 것을 안다. 그러나 IMetaDataImport는 작업을 복제하기 위해 이미 그렇게했다.

PE 헤더를 직접 구문 분석해야 할 경우 IMetaDataImport 인스턴스에서 사용하는 HMODULE을 가져올 수 있습니까? 아니면 파일을 직접 메모리 맵핑하고 OpenScopeFromMemory를 호출하여 IMetaDataImport 인스턴스를 만들 수 있습니까?

답변

1

마지막으로이 API를 사용하여 RVA를 실제 주소에 매핑하는 기본 제공 기능이 없었습니다. 그래서 네. 파일을 메모리에 직접 매핑하고 섹션 테이블을 파싱하여 RVA가있는 섹션을 찾고 기본 오프셋을 읽어야합니다. 그런 다음이 값을 맵핑 된 이미지 포인터에 추가하여 메모리 매핑에서 코드가있는 위치로 이동할 수 있습니다.

0

당신이 언급 한 API에 대해 모르겠지만, 당신이 방법 본문의 RVA를 가지고 있다면 파일이나 메모리에서 읽는 것이 쉽습니다.

파일 또는 메모리의 메타 데이터 헤더 주소, 해당 RVA (CLR 헤더의 필드) 및 메소드의 RVA (# ~ 스트림의 MethodDef 테이블)를 알면 파일의 위치를 ​​계산할 수 있습니다.

offsetFromMetadataHeader = RVAofMethod - MetadataRVA 
positionInFile = offsetFromMetadataHeader - positionOfMetaDataHeader 

내 구현시 작동합니다.

메타 데이터와 바이트 코드는 기본적으로 동일한 섹션 - .data에 있습니다.

바이트 코드 읽기 구현을 위해 gethub에서 Project Cecil을 볼 수 있습니다 (먼저 메서드 헤더를 처리해야한다는 점에 유의하십시오).

+0

필자는 이미 손으로 PE 구문 분석을 구현했지만 IMetaDataImport를 사용하여 완전히 전송할 수는 있지만 구현했습니다. 나는 RVAs를 나 자신으로 해결하는 것을 끝내었다. 메타 데이터 헤더에 상대적인 메소드 RVA에 대해 확신합니까? 일반 PE 이미지 섹션 헤더를 사용하여 문제를 해결하고 있으며 정상적으로 작동합니다. – Trillian

+0

더 정확하게 편집되었습니다. 나는 메모리에 파일이 있고 이미 메타 데이터를 읽었다 고 가정했다. 내가 말했듯이, 나는 그 API를 사용하지 않았다. – abecadel