hint в структуре _IMAGE_IMPORT_BY_NAME

Тема в разделе "WASM.ASSEMBLER", создана пользователем Mikl___, 12 апр 2017.

  1. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.632
    При импорте функции "по имени" используется структура _IMAGE_IMPORT_BY_NAME
    Код (ASM):
    1. _IMAGE_IMPORT_BY_NAME STRUCT
    2.     Hint         DW   ?
    3.     Name_    DB ? DUP(?),0;название импортированной функции, ASCIIZ-строка
    4.     Pad    DB ($ and 1) DUP(0);длина строки выравнивается до четной границы еще одним 0
    5. _IMAGE_IMPORT_BY_NAME ends
    hint("MessageBoxA")=0x1E2=482
    hint("ExitProcess")=0xBC=188
    hint("CreateWindowsExA")=0x60=96
    hint("DefWindowProcA")=0x8E=142
    hint("GetMessageA")=0x13C=316
    1. Для чего нужен hint?
    2. Как рассчитывается значение hint?
     
  2. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    1.896
    Это, вроде бы, ординал минус база (или индекс) экспорта в библиотеке. Лоадер сначала проверяет экспорт по индексу и если не совпадает, начинает бинарный поиск по имени.
     
  3. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    259
    В user32.dll от windows XP - функция MessageBoxA расположена по адресу - 7e 36 74 0c. Тогда лоадеру (не знаю что это) желательно чтобы в поле hint было значение 7e 36 74 0c? Но оно размером в 2 байта - тогда что там должно быть? Если без 7e - а просто от начала первого байта - всё равно это 36 74 0с. Каков тогда расчёт?
     
  4. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    423
    Не адрес а ординал, который двухбайтный.
     
  5. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    259
    В user32.dll от windows XP - функция MessageBoxA расположена по адресу - 7e 36 74 0c. Тогда лоадеру (не знаю что это) желательно чтобы в поле hint было значение 7e 36 74 0c? Но оно размером в 2 байта - тогда что там должно быть? Если без 7e 36 (так как 7e 36 -это начало файла первый байт) - то 74 0с. Но мы попадаем дальше на количество байт 0c 00. Тогда расчёт таков - первый байт MessageBoxA в user32.dll находится по адресу 7e 36 74 0c. Отбрасываем первые два байта = 74 0с. От 740с отнимаем 0с 00 получаем 68 0с. Данный адрес кидает нас на начало MessageBoxA. Тогда в hint - должно быть 680с? Для быстрого поиска функции?
     
  6. Thetrik

    Thetrik UA6527P

    Публикаций:
    0
    Регистрация:
    25 июл 2011
    Сообщения:
    423
    Функция в DLL имеет помимо имени еще и номер - ординал, правильней даже так - функция всегда имеет номер, а имя опционально. Вот в hint'е лежит этот номер.
     
    rococo795 нравится это.
  7. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    7
    Регистрация:
    25 июн 2008
    Сообщения:
    2.632
    rococo795,
    loader - программа, отвечающая за загрузку исполнимых файлов и запуск соответствующих новых процессов. Обычно, часть операционной системы. Загрузчик расставляет в секции импорта файла на те места, где стоят ссылки на внешние импортируемые из dll функции, те адреса, по которым эти функции находятся в памяти. У тебя функция MessageBoxA расположена по адресу - 0х7e36740c, но это сейчас. Стоит поставить какой-нибудь сервиспак, где user32.dll модифицирована и адрес будет другим. В Windows SDK или в MASM32 есть утилита dumpbin.exe Если написать bat-файл
    Код (Text):
    1. %masm64%\bin\dumpbin.exe /EXPORTS %windir%\System32\user32.dll /OUT:user32.txt
    содержимое user32.txt можешь посмотреть в аттаче
    Код (Text):
    1. Dump of file user32.dll
    2.  
    3. File Type: DLL
    4.  
    5.   Section contains the following exports for USER32.dll
    6.  
    7.     00000000 characteristics
    8.     4CE799CD time date stamp Sat Nov 20 17:50:05 2010
    9.         0.00 version
    10.         1500 ordinal base
    11.         1003 number of functions
    12.          830 number of names
    13.  
    14.     ordinal hint RVA      name
    15.  
    16.        1502    0 000083C0 ActivateKeyboardLayout
    17.        1503    1 0002AD40 AddClipboardFormatListener
    18.        1504    2 000235B8 AdjustWindowRect
    19.        1505    3 00017CE4 AdjustWindowRectEx
    20.        1506    4 0007F30C AlignRects
    21.        1507    5 00042164 AllowForegroundActivation
    22.        1508    6 00007D80 AllowSetForegroundWindow
    23.        1509    7 0001BFF0 AnimateWindow
    24.        1510    8 0007A810 AnyPopup
    25.        1511    9 0007D85C AppendMenuA
    26.        1512    A 000136F4 AppendMenuW
    27.        1513    B 00041B04 ArrangeIconicWindows
    28.        1514    C 0000D240 AttachThreadInput
    29.         .....
    30.        2040  20F 00042974 MenuWindowProcA
    31.        2041  210 00042908 MenuWindowProcW
    32.        2042  211 0001E6F0 MessageBeep
    33.        2043  212 000712B8 MessageBoxA
    34.        2044  213 00071370 MessageBoxExA
    35.        2045  214 00071394 MessageBoxExW
    36.        .....
    37.        2340  33B 0002099C wsprintfW
    38.        2341  33C 0007B430 wvsprintfA
    39.        2342  33D 00020BFC wvsprintfW
    40.        1500      0002B260 [NONAME]
    41.        1501      0002AE80 [NONAME]
    42.        1550      00076598 [NONAME]
    43.        1551      00076640 [NONAME]
    44.        1552      00076600 [NONAME]
    45.        1553      00023D2C [NONAME]
    46.        1554      00023DF8 [NONAME]
    47.        1555      00076668 [NONAME]
    48.        1556      00076698 [NONAME]
    49.        2000      00006B80 [NONAME]
    50.        2001      0006E738 [NONAME]
    51.        2002      00023E78 [NONAME]
    52.        2005      00003F00 [NONAME]
    53.        2500      000405D0 [NONAME]
    54.        2501      000405F4 [NONAME]
    55.        2502      0004062C [NONAME]
    если импортируемые из user32.dll функции расположить по алфавиту, видно, что ординалы и hint'ы связаны по формуле
    Код (Text):
    1. if (NameDLL == "user32.dll")
    2. if (Ordinal < 1500) Ordinal = hint + 1502
    3. elseif (1501 < Ordinal < 1550) Ordinal = hint + 1504
    4. elseif (1556 < Ordinal < 2000) Ordinal = hint + 1510
    5. elseif (2002 < Ordinal < 2005) Ordinal = hint + 1513
    6. elseif (2005 < Ordinal < 2500) Ordinal = hint + 1516
    дырки в hint'ах образовались в user32.dll потому, что несколько функций импортируются не по именам (у этих функций нет имен и, следовательно, hint'ов), а по ординалам.
    hint - это значение индекса, используемое для быстрого поиска импортируемых функций. Для каждой следующей функции это возрастающее на единичку число. Если hint верен и индекс указывает на имя той функции, которая нужна, тогда импортируемая функция будет найдена быстро. Если hint неверен и не указывает на имя функции, тогда для поиска импортируемой функции используется более медленный поиск по строке.
     

    Вложения:

    • user32.zip
      Размер файла:
      11,2 КБ
      Просмотров:
      156
    shufps, rococo795 и _edge нравится это.
  8. rococo795

    rococo795 Active Member

    Публикаций:
    0
    Регистрация:
    1 дек 2016
    Сообщения:
    259
    Спасибо.