2011-11-24 1 views
2

수입 이름에 이상한 RVA를 제공하는 Win32 NT 헤더에 문제가 있습니다. 다음은 나에게 문제를주고 관련 코드 :가져 오기 주소 표가 가져 오기 이름에 대해 올바르지 않은 RVA를 생성합니다.

//Get a pointer to the import table 
PIMAGE_IMPORT_DESCRIPTOR piidImportTableAddr; 
piidImportTableAddr = (PIMAGE_IMPORT_DESCRIPTOR)(pImgNtHeaders->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress + (DWORD)pMemFile); 

while(piidImportTableAddr->Name != 0) 
{ 
    //Itterate over every IMAGE_IMPORT_DESCRIPTOR structure, extracting the names of the DLLs to import 
    char* name = (char*)((DWORD)piidImportTableAddr->Name + (DWORD)pMemFile); 

    //Do nothing for now 

    piidImportTableAddr++; 
} 

그러나, piidImportTableAddr 구조의 구성원이 나쁜 포인터는 주소를 포함은, 여기에 멤버 테이블은 다음과 같습니다

Characteristics 0x42746553 
OriginalFirstThunk 0x42746553 
TimeDateStamp 0x646f4d6b 
ForwarderChain 0x02260065 
Name 0x54746547 
FirstThunk 0x4d747865 

이들은 모두 나쁜 RVA 및 메모리 위치. 이 방법으로 DLL 이름을 찾을 때 내가 잘못하고있는 것이 있습니까? 나는 수입 테이블의 RVA를 PE로드에 표시된 테이블과 비교했다. 그들은 같기 때문에 왜 IMAGE_IMPORT_DESCRIPTOR가 올바르지 않은지 확신 할 수 없다. http://pastebin.com/32MBEvWU

답변

1

가져 오기 테이블의 RVA가 있지만 모듈이로드되지 않았기 때문에 섹션이 여전히 실제 위치에 있습니다. 가져 오기 섹션의 실제 오프셋은 일반적으로 RVA와 다릅니다. 섹션 헤더 (_IMAGE_SECTION_HEADER)를 반복해야하고 VirtualAddressVirtualSize 값을 사용하면 가져 오기 테이블이 포함 된 섹션을 찾을 수 있습니다. 그런 다음 해당 섹션의 실제 주소를 PointerToRawData에서 가져옵니다.

그래서 당신이 원하는 실제 주소는 다음과 같이이다 :

importTableRVA - importSectionRVA + importSectionPhysicalAddress + pMemFile 
+0

죄송합니다. 더 설명해 주시겠습니까? 나는 당신이 말하는 것을 추상적으로 이해하지만, 나는 "수입 표"와 "수입 부분"의 차이를 이해하지 못한다. – dymk

+0

@Dylan : PE 파일은 코드, 데이터, 가져 오기, 내보내기 등의 다른 섹션으로 구분됩니다. 일반적으로 가져 오기 섹션의 이름은 ".idata"입니다. 하지만 파일의 섹션 레이아웃은로드 된 모듈의 레이아웃과 동일하지 않으므로 주소를 조정해야합니다. http://msdn.microsoft.com/en-us/windows/hardware/gg463125 – Timo

+0

@Dylan에서 Microsoft의 설명서를 읽는 것이 좋습니다. 그리고 가져 오기 섹션에는 대개 가져 오기 테이블과 함께 가져 오기가 포함되어 있습니다. 주소 테이블과 어쩌면 다른 데이터. 명세는 아주 leanient 그래서 어떤 단면도든지 진짜로 거의 무엇이든을 포함 할 수 있었다. – Timo

1

귀하의 코드가는 것 IAT를 의미합니다 (메모리에로드) 이미 가상화 된 모듈 그게 전부의 IAT를 검사하는 인상을 준다 : 그것은 전체의 여기

소스 코드에 대한 링크입니다 RVA가 포함되어 있지는 않지만 대신 Windows 로더가 주소를 필요한 동적 오프셋으로 조정합니다.

그러나 LordPE가보고 한 데이터는 의심 스럽습니다. 이진 모듈이 실제로 유효하면 (예 : Windows에서로드하여 실행할 수있는 경우) 난독 화 파일을 처리 할 수 ​​있습니다. 그렇지 않으면 바이너리가 손상되었거나 win32 PE 파일이 아닙니다.

+0

아, 메모리 매핑 된 파일과 프로그램에로드 검사하고있는 모듈과는 Windows PE에 감동되지 않았습니다 짐을 싣는 사람. 내가 테스트중인 모듈은 notepad.exe이므로 난독 화되지 않습니다. – dymk

관련 문제