Печать Import Table

Тема в разделе "WASM.BEGINNERS", создана пользователем mz80, 21 июл 2010.

  1. mz80

    mz80 New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2010
    Сообщения:
    10
    Приветствую. Начал разбираться с РЕ форматом. Для начала решил сделать примерчик по распечатки структуры РЕ, но вот споткнулся на распечатке таблицы импорта.
    Код (Text):
    1. #include <windows.h>
    2. #include <stdio.h>
    3. #include "Psapi.h"
    4.  
    5. INT __stdcall main(HMODULE hInst, DWORD dwReason, PVOID pReserved)
    6. {
    7.         int i=0;
    8.         HANDLE hMapObject,hFile;            
    9.         LPVOID lpBase;                      
    10.         PIMAGE_DOS_HEADER dosHeader;    
    11.         PIMAGE_NT_HEADERS ntHeader;        
    12.         IMAGE_FILE_HEADER header;          
    13.         IMAGE_OPTIONAL_HEADER opHeader;        
    14.         PIMAGE_SECTION_HEADER pSecHeader;  
    15.         TCHAR szPath[MAX_PATH];
    16.         HMODULE hModule;
    17.         DWORD pDataDirImportRVA, pDataDirImportSize, pIAT, pEntryIAT;
    18.         PIMAGE_IMPORT_DESCRIPTOR importDescriptor;
    19.  
    20.         GetModuleFileName(NULL, szPath, MAX_PATH);
    21.         printf("\n%-1s%s","File Path:", szPath);
    22.  
    23.         hFile = CreateFile(szPath,GENERIC_READ,FILE_SHARE_READ,NULL,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,NULL);
    24.         hMapObject = CreateFileMapping(hFile,NULL,PAGE_READONLY,0,0,NULL);
    25.         lpBase = MapViewOfFile(hMapObject,FILE_MAP_READ,0,0,0);
    26.  
    27.         dosHeader = (PIMAGE_DOS_HEADER)lpBase;
    28.        
    29.         if(dosHeader->e_magic == IMAGE_DOS_SIGNATURE){
    30.                
    31.                 printf("\n\nValid Dos Exe File\n------------------\n");
    32.                 printf("\nDumping DOS Header Info....\n---------------------------");
    33.                 printf("\n%-36s%s","Magic number : ",dosHeader->e_magic==0x5a4d?"MZ(Mark Zbikowski)":"-");
    34.                 ...
    35.                 printf("\n%-36s%#x","RVA address of PE header : ",dosHeader->e_lfanew);
    36.                 printf("\n===============================================================================\n");
    37.         }
    38.         else {
    39.                 printf("\nGiven File is not a valid DOS file\n");
    40.                 return 0;
    41.         }
    42.        
    43.         ntHeader = (PIMAGE_NT_HEADERS)((DWORD)(dosHeader) + (dosHeader->e_lfanew));
    44.  
    45.         if(ntHeader->Signature == IMAGE_NT_SIGNATURE){
    46.                 printf("\nValid PE file \n-------------\n");
    47.        
    48.                 printf("\nDumping COFF/PE Header Info....\n--------------------------------");
    49.                 printf("\n%-36s%s","Signature :","PE");
    50.                
    51.                 header = ntHeader->FileHeader;
    52.  
    53.                 printf("\n%-36s","Machine Architechture :");
    54.                 switch(header.Machine){
    55.                         case 0x0:    printf("All "); break;
    56.                         ...
    57.                         case 0x183:  printf("DEC Alpha AXP"); break;
    58.                         default:        printf("Not Found"); break;
    59.                 }
    60.                
    61.                 printf("\n%-36s","Characteristics : ");
    62.                 if((header.Characteristics&0x0002) == 0x0002) printf("Executable Image ,");
    63.                 ...
    64.                 printf("\n%-36s%d","Size of optional header :",header.SizeOfOptionalHeader);
    65.  
    66.                 printf("\n\nDumping PE Optional Header Info....\n-----------------------------------");
    67.                
    68.                 opHeader = ntHeader->OptionalHeader;
    69.                
    70.                 printf("\n%-36s%#x","Address of Entry Point : ",opHeader.AddressOfEntryPoint);    
    71.                 ...
    72.                 printf("\n%-36s%d","Minor Linker Version : ",opHeader.MinorLinkerVersion);              
    73.                
    74.                 pDataDirImportRVA = ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].VirtualAddress;
    75.                 pDataDirImportSize = ntHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_IMPORT].Size;
    76.  
    77.                 printf("\n%-36s%#x","Data Dir, Import Table RVA : ",pDataDirImportRVA);              
    78.  
    79.                 printf("\n\nDumping Sections Header Info....\n--------------------------------");
    80.  
    81.                 for(pSecHeader = IMAGE_FIRST_SECTION(ntHeader),i=0;i<ntHeader->FileHeader.NumberOfSections;i++,pSecHeader++)
    82.                 {  
    83.                         printf("\n\nSection Info (%d of %d)",i+1,ntHeader->FileHeader.NumberOfSections);
    84.                         printf("\n---------------------");
    85.                         if ((pDataDirImportRVA>=pSecHeader->VirtualAddress)&&((pSecHeader->VirtualAddress+pSecHeader->Misc.VirtualSize)>pDataDirImportRVA))
    86.                         {
    87.                                 printf("\nYARRR! Import Address Table HERE!");
    88.                                 printf("\n%-36s%#x","IAT Entry POINT:",(pDataDirImportRVA - pSecHeader->VirtualAddress)+pSecHeader->PointerToRawData);
    89.                                 pIAT = (pDataDirImportRVA - pSecHeader->VirtualAddress)+pSecHeader->PointerToRawData;
    90.                         }
    91.                         printf("\n%-36s%s","Section Header name : ", pSecHeader->Name);
    92.                         ...
    93.                         if((pSecHeader->Characteristics&0x80000000)==0x80000000)printf("Writable, ");
    94.                 }
    95.  
    96.                 printf("\n===============================================================================\n");
    97.  
    98.         }
    99.         else
    100.         {
    101.                 printf("\nError while reading sections\n");
    102.                 return 0;
    103.         }
    104.         UnmapViewOfFile(lpBase);
    105.         CloseHandle(hMapObject);
    106.         CloseHandle(hFile);
    107.         return 0;
    108. }
    я понимаю, что в pIAT я получаю как достучаться до Import Address Table. Вопрос в том как теперь распечатать всё что там находиться?
     
  2. izl3sa

    izl3sa New Member

    Публикаций:
    0
    Регистрация:
    22 апр 2010
    Сообщения:
    164
    Адрес:
    Spb
    эээ, а что сложного? Перебираешь в цикле массив IMAGE_IMPORT_DESCRIPTOR и для каждого перебираешь ImageThunk`s. Возьмите уже спецификацию и прочитатйте. Код кстати ужасен =\