Приветствую. Начал разбираться с РЕ форматом. Для начала решил сделать примерчик по распечатки структуры РЕ, но вот споткнулся на распечатке таблицы импорта. Код (Text): #include <windows.h> #include <stdio.h> #include "Psapi.h" INT __stdcall main(HMODULE hInst, DWORD dwReason, PVOID pReserved) { int i=0; HANDLE hMapObject,hFile; LPVOID lpBase; PIMAGE_DOS_HEADER dosHeader; PIMAGE_NT_HEADERS ntHeader; IMAGE_FILE_HEADER header; IMAGE_OPTIONAL_HEADER opHeader; PIMAGE_SECTION_HEADER pSecHeader; TCHAR szPath[MAX_PATH]; HMODULE hModule; DWORD pDataDirImportRVA, pDataDirImportSize, pIAT, pEntryIAT; PIMAGE_IMPORT_DESCRIPTOR importDescriptor; GetModuleFileName(NULL, szPath, MAX_PATH); printf("\n%-1s%s","File Path:", szPath); hFile = CreateFile(szPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL); hMapObject = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL); lpBase = MapViewOfFile(hMapObject,FILE_MAP_READ,0,0,0); dosHeader = (PIMAGE_DOS_HEADER)lpBase; if(dosHeader->e_magic == IMAGE_DOS_SIGNATURE){ printf("\n\nValid Dos Exe File\n------------------\n"); printf("\nDumping DOS Header Info....\n---------------------------"); printf("\n%-36s%s","Magic number : ",dosHeader->e_magic==0x5a4d?"MZ(Mark Zbikowski)":"-"); ... printf("\n%-36s%#x","RVA address of PE header : ",dosHeader->e_lfanew); printf("\n===============================================================================\n"); } else { printf("\nGiven File is not a valid DOS file\n"); return 0; } ntHeader = (PIMAGE_NT_HEADERS)((DWORD)(dosHeader) + (dosHeader->e_lfanew)); if(ntHeader->Signature == IMAGE_NT_SIGNATURE){ printf("\nValid PE file \n-------------\n"); printf("\nDumping COFF/PE Header Info....\n--------------------------------"); printf("\n%-36s%s","Signature :","PE"); header = ntHeader->FileHeader; printf("\n%-36s","Machine Architechture :"); switch(header.Machine){ case 0x0: printf("All "); break; ... case 0x183: printf("DEC Alpha AXP"); break; default: printf("Not Found"); break; } printf("\n%-36s","Characteristics : "); if((header.Characteristics&0x0002) == 0x0002) printf("Executable Image ,"); ... printf("\n%-36s%d","Size of optional header :",header.SizeOfOptionalHeader); printf("\n\nDumping PE Optional Header Info....\n-----------------------------------"); opHeader = ntHeader->OptionalHeader; printf("\n%-36s%#x","Address of Entry Point : ",opHeader.AddressOfEntryPoint); ... printf("\n%-36s%d","Minor Linker Version : ",opHeader.MinorLinkerVersion); pDataDirImportRVA = ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress; pDataDirImportSize = ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size; printf("\n%-36s%#x","Data Dir, Import Table RVA : ",pDataDirImportRVA); printf("\n\nDumping Sections Header Info....\n--------------------------------"); for(pSecHeader = IMAGE_FIRST_SECTION(ntHeader),i=0;i<ntHeader->FileHeader.NumberOfSections;i++,pSecHeader++) { printf("\n\nSection Info (%d of %d)",i+1,ntHeader->FileHeader.NumberOfSections); printf("\n---------------------"); if ((pDataDirImportRVA>=pSecHeader->VirtualAddress)&&((pSecHeader->VirtualAddress+pSecHeader->Misc.VirtualSize)>pDataDirImportRVA)) { printf("\nYARRR! Import Address Table HERE!"); printf("\n%-36s%#x","IAT Entry POINT:",(pDataDirImportRVA - pSecHeader->VirtualAddress)+pSecHeader->PointerToRawData); pIAT = (pDataDirImportRVA - pSecHeader->VirtualAddress)+pSecHeader->PointerToRawData; } printf("\n%-36s%s","Section Header name : ", pSecHeader->Name); ... if((pSecHeader->Characteristics&0x80000000)==0x80000000)printf("Writable, "); } printf("\n===============================================================================\n"); } else { printf("\nError while reading sections\n"); return 0; } UnmapViewOfFile(lpBase); CloseHandle(hMapObject); CloseHandle(hFile); return 0; } я понимаю, что в pIAT я получаю как достучаться до Import Address Table. Вопрос в том как теперь распечатать всё что там находиться?
эээ, а что сложного? Перебираешь в цикле массив IMAGE_IMPORT_DESCRIPTOR и для каждого перебираешь ImageThunk`s. Возьмите уже спецификацию и прочитатйте. Код кстати ужасен =\