PE файлы

Discussion in 'WASM.WIN32' started by DAIM, Mar 22, 2011.

  1. DAIM

    DAIM New Member

    Blog Posts:
    0
    Joined:
    Aug 29, 2010
    Messages:
    49
    Здрайствуйте! прочел, несколько статей Iczelion'а,начал читать переведенный путеводитель..от Billy Belcebu,откопал статейку мэта питрека(ну все как наставляет Iczelion), достал winhex, принялся изучать этот злосчастный ПЕ...через некотрое время меня начали посещать некотрые недопонимания:
    вопрос первый- можно ли изучать PE-формат открывая hex-редактором файлов с диска,
    все ли RVA будут считаться валидными(ну всмысле относительно pe заголовка или там начала файла, не суть важно)
    почему этот вопрос возник, потому что смотрю значение "BaseOfCode" который обычно равен 0х1000, спускаюсь вниз(в хекс редакторе), и внезапно обнаруживаю конец файла.
    Или мне надо именно промэпировать файл(всмысле средствами винапи).
    зы.Пардон канечно за явный нубизм, и ламеризм, но я взамешательстве=)
     
  2. ohne

    ohne New Member

    Blog Posts:
    0
    Joined:
    Feb 28, 2009
    Messages:
    431
    это RVA а не RAW смещение
     
  3. DAIM

    DAIM New Member

    Blog Posts:
    0
    Joined:
    Aug 29, 2010
    Messages:
    49
    а raw смещение както можно получить?
     
  4. ohne

    ohne New Member

    Blog Posts:
    0
    Joined:
    Feb 28, 2009
    Messages:
    431
    посмотреть к какой секции относится rva
    raw = rva - (rva секции) + (raw адрес секции)
     
  5. ASMatic

    ASMatic New Member

    Blog Posts:
    0
    Joined:
    Oct 5, 2010
    Messages:
    233
    DAIM
    lordPE - обзаведитесь, поможет малость разобраться...
     
  6. DAIM

    DAIM New Member

    Blog Posts:
    0
    Joined:
    Aug 29, 2010
    Messages:
    49
    toASMatic:пасиб!но, пока пользуюсь PE Explorer(лимит запусков еще есть:))
    toohne:покачто медитирую над этой формулой.
    мои непонятки:
    этой статейке, где идет описание IMAGE_FILE_HEADER,
    [​IMG]
    есть поле "размер дополнительного заголовка"
    а здесь в IMAGE_OPTIONAL_HEADER
    [​IMG]
    в конце написано размер от PE заголовка.
    вот я не понимаю, где
    должны начаться заголовки секций?
    и что за "размер дополнительного заголовка"?
     
  7. DAIM

    DAIM New Member

    Blog Posts:
    0
    Joined:
    Aug 29, 2010
    Messages:
    49
    предыдущий пост с повестки дня снимаю, и с гордостью заявляю - я, допенькал!=D
    понеопытности, IMAGE_FILE_HEADER тоже включил в этот "размер дополнительного заголовка", и ни как не мог понять что за 0x18h лишние остаються
     
  8. ASMatic

    ASMatic New Member

    Blog Posts:
    0
    Joined:
    Oct 5, 2010
    Messages:
    233
    Code (Text):
    1. PIMAGE_NT_HEADERS32     ImageNtHeader;
    2. PIMAGE_SECTION_HEADER   SectionHeader;
    3.  
    4. hModule = GetModuleHandle( NULL );
    5. ImageNtHeader = (PIMAGE_NT_HEADERS32)( ((PIMAGE_DOS_HEADER)hModule)->e_lfanew + (ULONG_PTR)hModule );
    6. SectionHeader = IMAGE_FIRST_SECTION( ImageNtHeader );
    7.  
    8. #define IMAGE_FIRST_SECTION( ntheader ) ((PIMAGE_SECTION_HEADER)        \
    9.     ((ULONG_PTR)ntheader +                                              \
    10.      FIELD_OFFSET( IMAGE_NT_HEADERS, OptionalHeader ) +                 \
    11.      ((PIMAGE_NT_HEADERS)(ntheader))->FileHeader.SizeOfOptionalHeader   \
    12.     ))
     
  9. 0dh

    0dh New Member

    Blog Posts:
    0
    Joined:
    Mar 23, 2011
    Messages:
    31
    Таблица заголовков секций идёт сразу после PE-заголовка:

    Code (Text):
    1. IMAGE_NT_HEADERS* ImageNTHeaders(PBYTE pBase)
    2. {
    3.     IMAGE_DOS_HEADER *my_IMAGE_DOS_HEADER = (IMAGE_DOS_HEADER*) pBase;     
    4.     IMAGE_NT_HEADERS *my_IMAGE_NT_HEADERS = (IMAGE_NT_HEADERS*) (pBase + my_IMAGE_DOS_HEADER -> e_lfanew);
    5.     return my_IMAGE_NT_HEADERS;
    6. }
    7.  
    8. WORD NumberOfSections(PBYTE pBase)
    9. {
    10.     IMAGE_NT_HEADERS* NTHeaders = ImageNTHeaders(pBase);
    11.     return NTHeaders -> FileHeader . NumberOfSections;
    12. }
    13.  
    14. IMAGE_SECTION_HEADER* ImageSectionHeaderFirst(PBYTE pBase)
    15. {
    16.     return (IMAGE_SECTION_HEADER*)((DWORD)ImageNTHeaders(pBase) + sizeof(IMAGE_NT_HEADERS));
    17. }
     
  10. _nic

    _nic New Member

    Blog Posts:
    0
    Joined:
    Feb 4, 2007
    Messages:
    372
    Неправильный подход.Поставь перед собой задачу написать хотя бы PE лоадер для DLL.И вот тогда в процессе воплощения задачи поймешь из чего ,и как PE файл состоит.
     
  11. DAIM

    DAIM New Member

    Blog Posts:
    0
    Joined:
    Aug 29, 2010
    Messages:
    49
    не совсем понимаю...мож есть линки?(былбы признателен)))
    пока цель: самому наити(всмысле хекс редактором), все заголовки и погулять по RVA