Почитал вот тут про устройство 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 Где правда?
Я пока так и сделал, забил нулями. Теперь ищу истину. Неужели никто не знает как этот hint вычисляется?
На вопросы ' Как сделать руками', наверное, можно отправлять в макросы fasm'а. Там все руками практически.
Nbt как этот hint вычисляется Возмем Код (Text): .386 .model flat, stdcall option casemap:none .nolist include windows.inc include kernel32.inc includelib kernel32.lib .list .code align 4 start: invoke ExitProcess, 0 end start если подставлять разные, например, из masm'а, msvs, psdk, библиотеки kernel32.lib, видно, что hint меняется. Получается, что редактор связей берет его из соответствующей библиотеки импорта. Сделал свою библиотеку импорта Код (Text): ; kernel32.def LIBRARY kernel32 EXPORTS ExitProcess@4 = ExitProcess @183 ; ordinal для xpprosp2 link.exe -lib /machine:ix86 /out:kernel32.lib /def:kernel32.def собрал с ней программу, получио импорт только по ординалу.
если я правильно понял, то hint каждый раз подставлялся от балды. получается, что этот hint важен для linker'а, но никак не для os loader'а так?
Важны только текстовое имя функции и её ординал. Хинты расставляются от балды и при загрузке, считай, не имеют никакого практического значения. Главное только чтоб все функции были прохинтины от нуля.
При разборе Import Table системный загрузчик должен вычислить адреса всех импортируемых функций. Для функций, импортируемых по ординалу, действие простое - взять элемент из массива с известным индексом (индекс = ординал - база, ординал указывается в таблице, база и сам массив - в DLLке, из которой загружаются функции). Но для функций, импортируемых по имени, нужно провести существенно более сложные действия - поиск нужной строки в таблице. Чтобы дать возможность немного ускорить этот процесс, Microsoft ввела поле Hint - подсказку для загрузчика: перед тем, как запускать собственно поиск, загрузчик сначала смотрит на функцию с номером Hint, и если это нужная функция, то дальше искать уже нет необходимости. То есть загрузчик найдёт эту функцию независимо от значения hint, но если оно корректно, то процесс будет быстрее. Конкретно hint = индекс функции в массиве экспортируемых функций, равный ординалу минус база ординалов (обычно база = 1). Естественно, тот же ExitProcess имеет разные ординалы в разных версиях винды, так что универсального hint под все системы не может быть.