Как изменить таблицу импорта ассемблерной программы, скомпилированной flatassembler

Я тестирую программу сборки, скомпилированную flatassembler, и ей нужно изменить таблицу импорта, поэтому, когда я запускаю objdump, я вижу, какие внешние функции пытается вызвать программа.

Итак, я начинаю с:

format PE GUI
section '.flat' readable writeable executable

Он вызывает некоторые функции в библиотеке MS, но таблица импорта неверна.

Вот простая часть, показывающая, как я включаю две dll и функцию:

;user32

    _MessageBoxA           dw $0

                   db 'MessageBoxA', $0

    kernel32_name db 'kernel32.dll', $0

    user32_name   db 'user32.dll', $0

Что нужно сделать в программе сборки, чтобы внешние функции отображались в таблице импорта?


person James Black    schedule 19.03.2013    source источник
comment
Что делаешь? Изменение таблицы импорта программы с помощью программы, написанной на ассемблере, или импорт функций в программу, написанную на ассемблере?   -  person harold    schedule 19.03.2013
comment
Изменение таблицы импорта программы, написанной на ассемблере.   -  person James Black    schedule 19.03.2013
comment
Хорошо, в fasm есть директивы library и import, они, вероятно, связаны. Если вы хотите сделать это вручную, взгляните на этот рисунок: i.imgur.com/pHjcI.png в таблице импорта больше структур, чем вы используете здесь, особенно указатели (ну, RVA) на строки.   -  person harold    schedule 19.03.2013
comment
@harold - Если вы сможете превратить это в ответ, я приму его. Изображение отличное. Спасибо.   -  person James Black    schedule 19.03.2013
comment
На самом деле это не идеально IMO - когда я впервые увидел это, у меня сложилось впечатление, что для каждого импорта нужен свой собственный дескриптор, когда на самом деле дескриптор указывает на массив импортов из этой dll. Поэтому я могу опубликовать лучший ответ, чем просто это изображение, это займет несколько минут.   -  person harold    schedule 19.03.2013


Ответы (1)


Таблица импорта представляет собой массив дескрипторов импорта, заканчивающийся 0, поля каталога импорта в каталогах данных заголовка указывают на первый элемент.

struct ImportDescriptor   // size = 20 bytes
{
    dword ILTRVA;         // RVA to Import Lookup Table
    dword Timestamp;      // you can usually ignore
    dword ForwarderChain; // these two
    dword DllNameRVA;     // RVA to 0-terminated dll name
    dword IATRVA          // RVA to Import Address Table
}

ILT и IAT должны находиться в разных местах, но должны быть копиями друг друга (не обязательно, но это нормально). IAT — это тот, который будет содержать указатели на импортированные функции. Оба они представляют собой массивы RVA для имен функций, заканчивающиеся 0. Имена функций состоят из слова-подсказки и строки ascii, заканчивающейся 0. Слово подсказки может быть нулевым, или фактическим индексом этой функции в таблице экспорта DLL, из которой она взята, или каким-то случайным значением, это просто подсказка.

person harold    schedule 19.03.2013