Структура таблицы импорта

Тема в разделе "WASM.BEGINNERS", создана пользователем 0dept, 6 фев 2010.

  1. 0dept

    0dept New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2010
    Сообщения:
    4
    Разбираюсь с PE форматом, возникли вопросы по таблице импорта. Файл - обычный messagebox, написанный на асме

    [​IMG]

    Оранжевый и серый - это первая и вторая структура типа IMAGE_IMPORT_DESCRIPTOR. Потом идет еще одна такая структура (размер - 14h, 5 двордов), заполненная нулями. Она завершает массив этих структур. Потом идут названия библиотек.
    Потом OriginalFirstThunk (желтый), потом непонятно что (белый), затем FirstThunk (красный), который после загрузки заменяется на фактический адрес. Потом идет еще один дворд (голубой), непонятно, что это.
    Дальше идет Hint из структуры IMAGE_IMPORT_BY_NAME (зеленый). Тут я не понял, это ворд или дворд, в разных местах по-разному написано. Потом идет название функции, которую импортируем, она заканчивается нулем, тут все понятно.

    Теперь вопросы
    1. Почему названия библиотек заканчиваются двумя нулями (фиолетовый)? Это связано с юникодом или для выравнивания названия до четного количества байт (т.к. должно заканчиваться одним)?
    2. Как называется это поле (белый)?
    3. Что за поле (голубой)?
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    одептирование идет по плану :)

    Код (Text):
    1. ;typedef struct _IMAGE_IMPORT_DESCRIPTOR {
    2. ;    union {
    3. ;        DWORD   Characteristics;            // 0 for terminating null import descriptor
    4. ;        DWORD   OriginalFirstThunk;         // RVA to original unbound IAT (PIMAGE_THUNK_DATA)
    5. ;    };
    6. ;    DWORD   TimeDateStamp;                  // 0 if not bound,
    7. ;                                            // -1 if bound, and real date\time stamp
    8. ;                                            //     in IMAGE_DIRECTORY_ENTRY_BOUND_IMPORT (new BIND)
    9. ;                                            // O.W. date/time stamp of DLL bound to (Old BIND)
    10. ;
    11. ;    DWORD   ForwarderChain;                 // -1 if no forwarders
    12. ;    DWORD   Name;
    13. ;    DWORD   FirstThunk;                     // RVA to IAT (if bound this IAT has actual addresses)
    14. ;} IMAGE_IMPORT_DESCRIPTOR;
    15.  
    16. ;typedef struct _IMAGE_THUNK_DATA32 {
    17. ;    union {
    18. ;        PBYTE  ForwarderString;
    19. ;        PDWORD Function;
    20. ;        DWORD Ordinal;
    21. ;        PIMAGE_IMPORT_BY_NAME  AddressOfData; !!!!!!!!!!!!!!!!!!!!
    22. ;    } u1;
    23. ;} IMAGE_THUNK_DATA32;
    24.  
    25. ;typedef struct _IMAGE_IMPORT_BY_NAME {
    26. ;    WORD    Hint;
    27. ;    BYTE    Name[1];
    28. ;} IMAGE_IMPORT_BY_NAME, *PIMAGE_IMPORT_BY_NAME;
    29.  
    30. data 12
    31. IAT:
    32. FirstThunk:
    33. FirstThunk_kernel32:
    34.     GetModuleFileName dd rva _GetModuleFileNameA
    35.     ExitProcess dd rva _ExitProcess
    36.     dd 0
    37. FirstThunk_user32:
    38.     MessageBox dd rva _MessageBoxA
    39.     dd 0
    40. IAT_SIZE = $ - IAT
    41. end data
    42.  
    43. data 1
    44. IMAGE_IMPORT_DESCRIPTOR:
    45.     dd rva OriginalFirstThunk_kernel32,0,0,rva kernel32_name, rva FirstThunk_kernel32
    46.     dd rva OriginalFirstThunk_user32,0,0,rva user32_name, rva FirstThunk_user32
    47.     dd 0,0,0,0,0
    48. IMPORT_SIZE = $ - IMAGE_IMPORT_DESCRIPTOR
    49. end data
    50.  
    51. OriginalFirstThunk:
    52. OriginalFirstThunk_kernel32:
    53.     dd rva _GetModuleFileNameA
    54.     dd rva _ExitProcess
    55.     dd 0
    56. OriginalFirstThunk_user32:
    57.     dd rva _MessageBoxA
    58.     dd 0
    59.  
    60. _align 2,0
    61. _ExitProcess dw 0  ; Hint
    62.     db 'ExitProcess',0
    63. _GetModuleFileNameA dw 0  ; Hint
    64.     db 'GetModuleFileNameA',0
    65.  
    66. _align 4,0
    67. kernel32_name db 'kernel32.dll',0
    68.  
    69. _align 2,0
    70. _MessageBoxA dw 0  ; Hint
    71.     db 'MessageBoxA',0
    72.  
    73. _align 4,0
    74. user32_name db 'user32.dll',0
     
  3. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    если что-то не понятно, то на сайте есть статья дядьки Ицзелиона
     
  4. 0dept

    0dept New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2010
    Сообщения:
    4
    Asterix
    спасибо, буду разбираться
    а то ;)
     
  5. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    с выравниванием не уверен, но сложилось впечатление что в реале оно так
     
  6. 0dept

    0dept New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2010
    Сообщения:
    4
    Код (Text):
    1. ;typedef struct _IMAGE_THUNK_DATA32 {
    2. ;    union {
    3. ;        PBYTE  ForwarderString;
    4. ;        PDWORD Function;
    5. ;        DWORD Ordinal;
    6. ;        PIMAGE_IMPORT_BY_NAME  AddressOfData; !!!!!!!!!!!!!!!!!!!!
    7. ;    } u1;
    8. ;} IMAGE_THUNK_DATA32;
    вот здесь не совсем понятно. какой размер у структуры IMAGE_THUNK_DATA32 ? как я понял, это дворд, но в юнионе есть строчка
    PIMAGE_IMPORT_BY_NAME AddressOfData; !!!!!!!!!!!!!!!!!!!!
    размер которого ворд (поле хинт) + массив байт для названия функции. тогда становится непонятно, как определить размер IMAGE_THUNK_DATA32.

    я так понимаю, что union { } как бы накладывает разные переменные на один участок памяти, но они могут быть разного размера. например, если
    typedef struct _somestruct {
    union {
    dword dword_;
    word word_;
    byte byte_;
    pdword pdword_;
    }
    } somestruct;
    то dword_ будет равен размеру всей структуры, word_ первым двум байтам, а byte_ только первом байту. pdword_ будет ссылкой на участок памяти по адресу dword_. все правильно?
     
  7. Mika0x65

    Mika0x65 New Member

    Публикаций:
    0
    Регистрация:
    30 июл 2005
    Сообщения:
    1.384
    Да, union работает именно так: размер union'а равен размеру максимального члена union'а.
     
  8. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    PIMAGE_IMPORT_BY_NAME

    Это указатель. Точнее, RVA.
     
  9. 0dept

    0dept New Member

    Публикаций:
    0
    Регистрация:
    6 фев 2010
    Сообщения:
    4
    iZzz32
    аа, теперь понятно.

    тогда куда относятся подчеркнутые белым и голубым байты?
     
  10. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    0dept
    Вы это, внимательно проанализировали предложенный сорц? В нем полная структура импорта
    MS Link и по-моему вопросов про подчеркнутые байты возникать не должно. Толкование
    что, как, почему, можно найти у Ицзелиона в туторе про Формат PE/Таблица импорта
     
  11. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    я имел ввиду то что идет ниже закомментареных структур
     
  12. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    кстати у вас на картинке не вся таблица, нет массива FirstThunk, ms link любит его располагать в другой секции
     
  13. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    неа, все-таки необычный, чем компилилось ?