При импорте функции "по имени" используется структура _IMAGE_IMPORT_BY_NAME Код (ASM): _IMAGE_IMPORT_BY_NAME STRUCT Hint DW ? Name_ DB ? DUP(?),0;название импортированной функции, ASCIIZ-строка Pad DB ($ and 1) DUP(0);длина строки выравнивается до четной границы еще одним 0 _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 Для чего нужен hint? Как рассчитывается значение hint?
Это, вроде бы, ординал минус база (или индекс) экспорта в библиотеке. Лоадер сначала проверяет экспорт по индексу и если не совпадает, начинает бинарный поиск по имени.
В user32.dll от windows XP - функция MessageBoxA расположена по адресу - 7e 36 74 0c. Тогда лоадеру (не знаю что это) желательно чтобы в поле hint было значение 7e 36 74 0c? Но оно размером в 2 байта - тогда что там должно быть? Если без 7e - а просто от начала первого байта - всё равно это 36 74 0с. Каков тогда расчёт?
В 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с? Для быстрого поиска функции?
Функция в DLL имеет помимо имени еще и номер - ординал, правильней даже так - функция всегда имеет номер, а имя опционально. Вот в hint'е лежит этот номер.
rococo795, loader - программа, отвечающая за загрузку исполнимых файлов и запуск соответствующих новых процессов. Обычно, часть операционной системы. Загрузчик расставляет в секции импорта файла на те места, где стоят ссылки на внешние импортируемые из dll функции, те адреса, по которым эти функции находятся в памяти. У тебя функция MessageBoxA расположена по адресу - 0х7e36740c, но это сейчас. Стоит поставить какой-нибудь сервиспак, где user32.dll модифицирована и адрес будет другим. В Windows SDK или в MASM32 есть утилита dumpbin.exe Если написать bat-файл Код (Text): %masm64%\bin\dumpbin.exe /EXPORTS %windir%\System32\user32.dll /OUT:user32.txt содержимое user32.txt можешь посмотреть в аттаче Код (Text): Dump of file user32.dll File Type: DLL Section contains the following exports for USER32.dll 00000000 characteristics 4CE799CD time date stamp Sat Nov 20 17:50:05 2010 0.00 version 1500 ordinal base 1003 number of functions 830 number of names ordinal hint RVA name 1502 0 000083C0 ActivateKeyboardLayout 1503 1 0002AD40 AddClipboardFormatListener 1504 2 000235B8 AdjustWindowRect 1505 3 00017CE4 AdjustWindowRectEx 1506 4 0007F30C AlignRects 1507 5 00042164 AllowForegroundActivation 1508 6 00007D80 AllowSetForegroundWindow 1509 7 0001BFF0 AnimateWindow 1510 8 0007A810 AnyPopup 1511 9 0007D85C AppendMenuA 1512 A 000136F4 AppendMenuW 1513 B 00041B04 ArrangeIconicWindows 1514 C 0000D240 AttachThreadInput ..... 2040 20F 00042974 MenuWindowProcA 2041 210 00042908 MenuWindowProcW 2042 211 0001E6F0 MessageBeep 2043 212 000712B8 MessageBoxA 2044 213 00071370 MessageBoxExA 2045 214 00071394 MessageBoxExW ..... 2340 33B 0002099C wsprintfW 2341 33C 0007B430 wvsprintfA 2342 33D 00020BFC wvsprintfW 1500 0002B260 [NONAME] 1501 0002AE80 [NONAME] 1550 00076598 [NONAME] 1551 00076640 [NONAME] 1552 00076600 [NONAME] 1553 00023D2C [NONAME] 1554 00023DF8 [NONAME] 1555 00076668 [NONAME] 1556 00076698 [NONAME] 2000 00006B80 [NONAME] 2001 0006E738 [NONAME] 2002 00023E78 [NONAME] 2005 00003F00 [NONAME] 2500 000405D0 [NONAME] 2501 000405F4 [NONAME] 2502 0004062C [NONAME] если импортируемые из user32.dll функции расположить по алфавиту, видно, что ординалы и hint'ы связаны по формуле Код (Text): if (NameDLL == "user32.dll") if (Ordinal < 1500) Ordinal = hint + 1502 elseif (1501 < Ordinal < 1550) Ordinal = hint + 1504 elseif (1556 < Ordinal < 2000) Ordinal = hint + 1510 elseif (2002 < Ordinal < 2005) Ordinal = hint + 1513 elseif (2005 < Ordinal < 2500) Ordinal = hint + 1516 дырки в hint'ах образовались в user32.dll потому, что несколько функций импортируются не по именам (у этих функций нет имен и, следовательно, hint'ов), а по ординалам. hint - это значение индекса, используемое для быстрого поиска импортируемых функций. Для каждой следующей функции это возрастающее на единичку число. Если hint верен и индекс указывает на имя той функции, которая нужна, тогда импортируемая функция будет найдена быстро. Если hint неверен и не указывает на имя функции, тогда для поиска импортируемой функции используется более медленный поиск по строке.