Помогите разобратся в структурах PE файла

Тема в разделе "WASM.BEGINNERS", создана пользователем _nic, 31 май 2010.

  1. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Я ненашол в этом заголовке поле которое указывает это.
     
  2. lhc645

    lhc645 New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2009
    Сообщения:
    106
    Для удобства нужна функция типа RvaToOffset (http://www.wasm.ru/article.php?article=green2red02#_Toc100906479). Собственно второй раз не пишу то, что написано там, должно быть понятно.
    Кстати, в imagehlp.dll есть также нужный функционал (в частности функция ImageRvaToSection). А еще у imagehlp есть сорс, который тоже можно посмотреть (см. исходники win2k).
     
  3. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Где взять макрос "ALING_UP"?
     
  4. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    при обработке таблицы импорта используется VA приложения?Или для работы с дллками оно другое?
     
  5. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Ладно вижу этот макрос убер-пупер секрет за который голову режут.По этому пробую загрузить файл в память по всем правилам и потом посмотреть что надо сразу по RVA
    Код (Text):
    1. HANDLE f=CreateFileA(exe,GENERIC_READ,FILE_SHARE_READ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0);
    2.     LARGE_INTEGER SZ;
    3.     ZeroMemory(&SZ,sizeof(SZ));
    4.     GetFileSizeEx(f,&SZ);
    5.     char *buf=new char[SZ.QuadPart];
    6.     DWORD rb;
    7.     ReadFile(f,buf,SZ.QuadPart,&rb,0);
    8.     CloseHandle(f);
    9.     _IMAGE_DOS_HEADER stub;
    10.     memcpy(&stub,buf,sizeof(_IMAGE_DOS_HEADER));
    11.     buf+=stub.e_lfanew;
    12.     _IMAGE_NT_HEADERS image;
    13.     memcpy(&image,buf,sizeof(_IMAGE_NT_HEADERS ));
    14.     _IMAGE_OPTIONAL_HEADER options=image.OptionalHeader;
    15.     printf("Sections:%d\n",image.FileHeader.NumberOfSections);
    16.     printf("Image syze bytes:%d\n",options.SizeOfImage);
    17.     printf("Headers size:%d\n",options.SizeOfHeaders);
    18.     printf("Section alingment: %d\n",options.SectionAlignment);
    19.     _IMAGE_SECTION_HEADER *sections=new _IMAGE_SECTION_HEADER[image.FileHeader.NumberOfSections*sizeof(_IMAGE_SECTION_HEADER)];
    20.     buf+=sizeof(_IMAGE_NT_HEADERS);
    21.     memcpy(sections,buf,image.FileHeader.NumberOfSections*sizeof(_IMAGE_SECTION_HEADER));
    22.     buf-=sizeof(_IMAGE_NT_HEADERS)+stub.e_lfanew;
    23.     ULONG delta=0;
    24.     ULONG memAdr=(ULONG)VirtualAlloc(0,options.SizeOfImage,MEM_COMMIT | MEM_RESERVE | MEM_TOP_DOWN,PAGE_EXECUTE_READWRITE);
    25.     if(memAdr>options.ImageBase)
    26.     {
    27.         delta=memAdr-options.ImageBase;
    28.     }
    29.     printf("delta: %d\n",delta);
    30.     memcpy((void*)memAdr,buf,options.SizeOfHeaders);
    31.     ULONG seek=options.SizeOfHeaders;
    32.     for(int i=0;i<image.FileHeader.NumberOfSections;i++)
    33.     {
    34.         printf("Section N:%d %.8s Characteristics: %X PointerToRawData: %d RawdataSize:%d\n",i,sections[i].Name,sections[i].Characteristics,sections[i].PointerToRawData,sections[i].SizeOfRawData);
    35.         buf+=sections[i].PointerToRawData;
    36.         memcpy((void*)(memAdr+sections[i].VirtualAddress),buf,sections[i].SizeOfRawData);
    37.         if(strcmp(".data",(char*)sections[i].Name)==0)
    38.         {
    39.             _IMAGE_IMPORT_DESCRIPTOR *I_D=new _IMAGE_IMPORT_DESCRIPTOR[sizeof(_IMAGE_IMPORT_DESCRIPTOR)];
    40.             DWORD restsz=0;
    41.             char *dllname=new char[1024*4];
    42.             for(;;)
    43.             {
    44.                 ZeroMemory(I_D,sizeof(_IMAGE_IMPORT_DESCRIPTOR));
    45.                 restsz=restsz+sizeof(_IMAGE_IMPORT_DESCRIPTOR);
    46.                 memcpy(I_D,buf,sizeof(_IMAGE_IMPORT_DESCRIPTOR));
    47.                 buf+=sizeof(_IMAGE_IMPORT_DESCRIPTOR);
    48.                 if(I_D->Name==NULL)
    49.                 {
    50.                     buf-=restsz;
    51.                     break;
    52.                 }
    53.                 memset(dllname,NULL,1024*4);
    54.                 memcpy(dllname,(void*)(memAdr+(I_D->Name-options.ImageBase)),1024*4);
    55.                 printf("%s\n",dllname);
    56.             }
    57.         }
    58.         buf-=sections[i].PointerToRawData;
    59.     }
    60.     VirtualFree((void*)memAdr,0,MEM_RELEASE);
    61.     delete []buf;
    Вот только почему неработает?Я должен заголовки грузить по каким то особым правилам,или я не учел ещё какие то выравнивания?
     
  6. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    что значит не работает?
     
  7. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    wdm.h
    Код (Text):
    1. //
    2. // Define alignment macros to align structure sizes and pointers up and down.
    3. //
    4.  
    5. #undef ALIGN_DOWN_BY
    6. #undef ALIGN_UP_BY
    7. #undef ALIGN_DOWN_POINTER_BY
    8. #undef ALIGN_UP_POINTER_BY
    9. #undef ALIGN_DOWN
    10. #undef ALIGN_UP
    11. #undef ALIGN_DOWN_POINTER
    12. #undef ALIGN_UP_POINTER
    13.  
    14. #define ALIGN_DOWN_BY(length, alignment) \
    15.     ((ULONG_PTR)(length) & ~(alignment - 1))
    16.  
    17. #define ALIGN_UP_BY(length, alignment) \
    18.     (ALIGN_DOWN_BY(((ULONG_PTR)(length) + alignment - 1), alignment))
    19.  
    20. #define ALIGN_DOWN_POINTER_BY(address, alignment) \
    21.     ((PVOID)((ULONG_PTR)(address) & ~((ULONG_PTR)alignment - 1)))
    22.  
    23. #define ALIGN_UP_POINTER_BY(address, alignment) \
    24.     (ALIGN_DOWN_POINTER_BY(((ULONG_PTR)(address) + alignment - 1), alignment))
    25.  
    26. #define ALIGN_DOWN(length, type) \
    27.     ALIGN_DOWN_BY(length, sizeof(type))
    28.  
    29. #define ALIGN_UP(length, type) \
    30.     ALIGN_UP_BY(length, sizeof(type))
    31.  
    32. #define ALIGN_DOWN_POINTER(address, type) \
    33.     ALIGN_DOWN_POINTER_BY(address, sizeof(type))
    34.  
    35. #define ALIGN_UP_POINTER(address, type) \
    36.     ALIGN_UP_POINTER_BY(address, sizeof(type))
     
  8. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    Иероглифы вместо имен дллок из таблицы импорта.
     
  9. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    Код (Text):
    1.         buf+=sections[i].PointerToRawData;
    2.         memcpy((void*)(memAdr+sections[i].VirtualAddress),buf,sections[i].SizeOfRawData);
    3.         if(strcmp(".data",(char*)sections[i].Name)==0)
    4.         {
    чет это жесть какая то
    что тут должно быть?
     
  10. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    http://webcache.googleusercontent.com/search?q=cache:download.microsoft.com/download/9/c/5/9c5b2167-8017-4bae-9fde-d599bac8184a/pecoff_v8.docx - тут есть все, это не варез и можно читать
    IMAGE_NT_HEADERS::IMAGE_OPTIONAL_HEADER.DataDirectory
    i = IMAGE_DIRECTORY_ENTRY_IMPORT, IMAGE_DIRECTORY_ENTRY_IAT
     
  11. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    "Отражение" секции в память,ну и если это .data чтение из неё уже по RVA того что нужно.
     
  12. ohne

    ohne New Member

    Публикаций:
    0
    Регистрация:
    28 фев 2009
    Сообщения:
    431
    файл который обрабатываешь приложи
     
  13. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    виндовый cmd.exe
     
  14. _nic

    _nic New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2007
    Сообщения:
    372
    гм какого то поле Name в таблицах импортах всех гуевых файлов,которые я пытался просмотреть, равно -1
     
  15. K10

    K10 New Member

    Публикаций:
    0
    Регистрация:
    3 окт 2008
    Сообщения:
    1.590
    _nic
    имхо, вам стоит получше изучить РЕ формат, а потом уже задавать вопросы на форуме...