Уроки Iczelion'а




Урок 6. Таблица импорта - часть 11


invoke RVAToOffset,pMapping,dword ptr [esi] mov edx,eax add edx,pMapping assume edx:ptr IMAGE_IMPORT_BY_NAME

Если MSB IMAGE_THUNK_DATA'ы равен 0, тогда та содержит RVA структуры IMAGE_IMPORT_BY_NAME. Hам требуется сначала сконвертировать ее в виртуальный адрес.

mov cx, [edx].Hint movzx ecx,cx invoke wsprintf,addr temp,addr NameTemplate,ecx,addr [edx].Name1 jmp ShowTheText

Hint - это поле размером в слово. Мы должны сконвертировать ее в значение размером в двойное слово, перед тем, как передать его wsрrintf. И мы показываем и Hint и имя функции в edit control'е.

ImportByOrdinal: mov edx,dword ptr [esi] and edx,0FFFFh invoke wsprintf,addr temp,addr OrdinalTemplate,edx

Если функция экспортируется только через ординал, мы обнуляем верхнее слово и отображаем ординал.

ShowTheText: invoke AppendText,hDlg,addr temp add esi,4

После добавления имени функции/ординала в edit control, мы переходим к следующему IMAGE_THUNK_DATA.

.endw add edi,sizeof IMAGE_IMPORT_DESCRIPTOR

После обработки всех dword'ов IMAGE_THUNK_DATA в массив, мы переходим к следующему IMAGE_IMPORT_DESCRIPTOR'у, чтобы обработать функции импорта из других DLL.

Дополнительно:

Туториал был бы незаконченным, если бы я не упомянул о bound imрort'е. Чтобы объяснить, что это такое, я должен немного отвлечься. Когда PE-загрузчик загружает PE-файл в память, он проверяет таблицу импорта и

загружает требуемые DLL в адресное пространство процесса. Затем он пробегает через массив IMAGE_THUNK_DATA, примерно так же как мы, и замещает IMAGE_THUNK_DATA'ы реальными адресами функций импорта. Этот шаг требует времени. Если программист каким-то образом смог бы верно предсказать адреса функций, PE-загрузчику не потребовалось бы фиксить IMAGE_THUNK_DATA'ы каждый pаз, когда запускается PE. Bound import - продукт этой идеи.

Если облечь это в простые слова, существует утилита под названием bind.exe, которая поставляется вместе с Микрософтовскими компиляторами, такими как Visual Studio, которая проверяет таблицу импорта PE-файла и замещает IMAGE_THUNK_DATA-слова адресами импортируемых функций. Когда файл загружается, PE-загрузчик должен проверить, верны ли адреса. Если версии DLL не совпадают с версиями, указанными в PE-файле или DLL должны быть перемещены, PE-загрузчик знает, что предвычисленные значения неверны, и поэтому он должен обработать массив, на который указывает OriginalFirstThunk, чтобы вычислить новые адреса импортируемых функций.

Bound imрort не играет большой роли в нашем примере, потому что мы по умолчанию используем OriginalFirstThunk. За дополнительной информацией о bound imрort'е, я рекомендую обратиться к рe.txt'у LUEVELSMEYER'а.

[C] Iczelion, пер. Aquila.






Содержание  Назад  Вперед