Import Table, как задать руками правильный Hint?

Тема в разделе "WASM.BEGINNERS", создана пользователем Nbt, 10 ноя 2008.

  1. Nbt

    Nbt New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    11
    Почитал вот тут про устройство Import Table
    http://win32assembly.online.fr/pe-tut6.html

    осталось непонятным вот эта сруктура
    IMAGE_IMPORT_BY_NAME STRUCT
    Hint dw ?
    Name1 db ?
    IMAGE_IMPORT_BY_NAME ENDS
    Hint contains the index into the export table of the DLL the function resides in. This field is for use by the PE loader so it can look up the function in the DLL's export table quickly.

    Как определить какой Hint у заданной функции. Например, смотрю в IT в своём *.exe на ddraw.dll.
    DirectDrawCreate Hint 05
    DirectDrawEnumerateA Hint 07

    Открываю ddraw.dll в depends.exе, а там
    DirectDrawCreate Hint 08, Ordinal 09
    DirectDrawEnumerateA Hint 0B, Ordinal 0C

    Где правда?
     
  2. EvilsInterrupt

    EvilsInterrupt Постигающий азы дзена

    Публикаций:
    0
    Регистрация:
    28 окт 2003
    Сообщения:
    2.428
    Адрес:
    Russia
    Nbt
    на это поле ваще забей,оно нафиг никому не нужно!
     
  3. Nbt

    Nbt New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    11
    Я пока так и сделал, забил нулями. Теперь ищу истину.
    Неужели никто не знает как этот hint вычисляется?
     
  4. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    На вопросы '
    Как сделать руками', наверное, можно отправлять в макросы fasm'а. Там все руками практически.
     
  5. q_q

    q_q New Member

    Публикаций:
    0
    Регистрация:
    5 окт 2003
    Сообщения:
    1.706
    Nbt
    как этот hint вычисляется
    Возмем
    Код (Text):
    1. .386
    2. .model flat, stdcall
    3. option casemap:none
    4.  
    5. .nolist
    6. include windows.inc
    7. include kernel32.inc
    8. includelib kernel32.lib
    9. .list
    10.  
    11. .code
    12. align 4
    13. start:
    14.     invoke  ExitProcess, 0
    15. end start
    если подставлять разные, например, из masm'а, msvs, psdk, библиотеки kernel32.lib, видно, что hint меняется. Получается, что редактор связей берет его из соответствующей библиотеки импорта.

    Сделал свою библиотеку импорта
    Код (Text):
    1. ; kernel32.def
    2. LIBRARY kernel32  
    3. EXPORTS
    4. ExitProcess@4 = ExitProcess @183 ; ordinal для xpprosp2
    5.  
    6. link.exe -lib /machine:ix86 /out:kernel32.lib /def:kernel32.def
    собрал с ней программу, получио импорт только по ординалу.
     
  6. Nbt

    Nbt New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    11
    если я правильно понял, то hint каждый раз подставлялся от балды.
    получается, что этот hint важен для linker'а, но никак не для os loader'а
    так?
     
  7. Quatre_R_Winner

    Quatre_R_Winner Member

    Публикаций:
    0
    Регистрация:
    10 ноя 2008
    Сообщения:
    66
    Важны только текстовое имя функции и её ординал. Хинты расставляются от балды и при загрузке, считай, не имеют никакого практического значения. Главное только чтоб все функции были прохинтины от нуля.
     
  8. Nbt

    Nbt New Member

    Публикаций:
    0
    Регистрация:
    2 июл 2004
    Сообщения:
    11
    Раз так, что и тесты подтверждают. Имеет место быть несточность в документации.
     
  9. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    При разборе Import Table системный загрузчик должен вычислить адреса всех импортируемых функций. Для функций, импортируемых по ординалу, действие простое - взять элемент из массива с известным индексом (индекс = ординал - база, ординал указывается в таблице, база и сам массив - в DLLке, из которой загружаются функции). Но для функций, импортируемых по имени, нужно провести существенно более сложные действия - поиск нужной строки в таблице. Чтобы дать возможность немного ускорить этот процесс, Microsoft ввела поле Hint - подсказку для загрузчика: перед тем, как запускать собственно поиск, загрузчик сначала смотрит на функцию с номером Hint, и если это нужная функция, то дальше искать уже нет необходимости. То есть загрузчик найдёт эту функцию независимо от значения hint, но если оно корректно, то процесс будет быстрее. Конкретно hint = индекс функции в массиве экспортируемых функций, равный ординалу минус база ординалов (обычно база = 1). Естественно, тот же ExitProcess имеет разные ординалы в разных версиях винды, так что универсального hint под все системы не может быть.
     
  10. 47726573684e696b

    47726573684e696b New Member

    Публикаций:
    0
    Регистрация:
    1 ноя 2008
    Сообщения:
    15
    Хуясе WASM.BEGINNERS у вас 0_о.....