수입 이름에 이상한 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이
죄송합니다. 더 설명해 주시겠습니까? 나는 당신이 말하는 것을 추상적으로 이해하지만, 나는 "수입 표"와 "수입 부분"의 차이를 이해하지 못한다. – dymk
@Dylan : PE 파일은 코드, 데이터, 가져 오기, 내보내기 등의 다른 섹션으로 구분됩니다. 일반적으로 가져 오기 섹션의 이름은 ".idata"입니다. 하지만 파일의 섹션 레이아웃은로드 된 모듈의 레이아웃과 동일하지 않으므로 주소를 조정해야합니다. http://msdn.microsoft.com/en-us/windows/hardware/gg463125 – Timo
@Dylan에서 Microsoft의 설명서를 읽는 것이 좋습니다. 그리고 가져 오기 섹션에는 대개 가져 오기 테이블과 함께 가져 오기가 포함되어 있습니다. 주소 테이블과 어쩌면 다른 데이터. 명세는 아주 leanient 그래서 어떤 단면도든지 진짜로 거의 무엇이든을 포함 할 수 있었다. – Timo