Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа5.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
491 Кб
Скачать
☆

1.7 Dll (динамические библиотеки)

Операционная система Windows поддерживает так называемые динамические библиотеки (файлы с расширением DLL), которые имеют тот же формат, что и обычные исполнимые файлы EXE. В динамических библиотеках содержатся функции, которые могут быть использованы другими исполнимыми файлами (EXE и DLL). Вместо статического копирования одной и той же функции в несколько исполняемых файлов, её можно поместить в DLL, а в файлах указать ссылки на эту DLL. Если объём подобных функций большой, получается неплохая экономия на размере исполняемых файлов и, что более существенно, расходуемой памяти. Базовые функции для работы с файлами, динамической памятью, процессами и потоками, графикой, звуком, сетью и т.п. реализованы в стандартных динамических библиотеках. Стандартные функции ещё называют API.

Открыв файл Crackme.exe в программе OllyDbg, можно увидеть, что по адресу 00401052 вместо адреса, вроде CALL 401020, указано имя внешней функции: CALL LoadIconA. В крайнем правом столбике на рисунке 1.12, находится дополнительная информация.

Рисунок 1.12 – Disassembler window

LoadIconA как раз и является одной из стандартных функций, реализованной в одной из стандартных библиотек - в USER32.DLL.

Пример API функции - MessageBoxA. Для разбора примера в окне Command Bar необходимо ввестие? MessageBoxA, как показано на рисунке 1.13.

Рисунок 1.13 – Command Bar

Появится короткий отчёт, в котором первым делом указан настоящий адрес данной функции – 77D7050B. Далее необходимо выбрать команду Go to – Expression в окне Disassembler window и ввести тот адрес, что выдал Command Bar, результат операции показан на рисунке 1.14.

Рисунок 1.14 – Disassembler window

Сразу видно, что функция принадлежит USER32.DLL, ведь имя DLL обычно указывается вместе с именем функции в дизассемблере (вроде CALL USER32.MessageBoxA). Ещё можно заметить, что MessageBoxA - это обычная функция, которая начинается по текущему адресу и завершается инструкцией RET. Код данной функции находится в библиотеке, а не в исполняемом файле, что позволяет сэкономить на размере и упрощает работу программы. Чтоб вернуться к текущей команде, достаточно нажать МИНУС. В окне Go to - Expression можно было прямо ввести MessageBoxA.

В имени функции важно правильно указывать строчные и прописные буквы: MessageBoxA и messageboxa - разные имена.

1.8 Операции с api функциями

Search for: при помощи данной операции можно получить полный список имён API функций, задействованных в данном исполняемом файле. Для того чтобы воспользоваться данной опцией в листинге (Disassembler window) в контекстном меню необходимо выбрать команду Search for – Name (label) in current module (Ctrl+N), как показано на рисунке 1.15.

Рисунок 1.15 – Часть контекстного меню Disassembler window

Откроется окно Names in, изображенное на рисунке 1.16, содержащее список API функции.

Рисунок 1.16 – Окно Names in

Чтобы найти нужную функцию не нужно перечитывать весь список, так как названия функций расположены в алфавитном порядке достаточно, начать набирать её имя. В заголовке окна Name in выводятся буквы, по которым осуществляется поиск - рисунок 1.17.

Рисунок 1.17 – Окно Names in

Follow import in Disassembler: данная операция подгружает выбранную функцию в дизассемблер. Для начала необходимо выбрать интересующую API функцию в окне Name in, а затем в контекстном меню выбрать команду Follow import in disassembler, как показано на рисунке 1.18.

Рисунок 1.18 – Часть контекстного меню окна Name in

После выполнения команды в окно Disassembler window загрузится программный код API функции.

Toggle breakpoint on import: данная операция позволяет установить точку останова на первой команде внутри заданной функции, а не на командах вызова (call или jmp) в текущем модуле. Чтобы установить точку останова на вызове API функции в контекстном меню окна Name in достаточно выбрать команду Toggle breakpoint on import.

Find references to import: данная операция выдают окно References со списком возможных команд для установки точки останова. Сначала необходимо выделить API функцию в окне Name in, для которой необходимо просмотреть список возможных команд для установки точек останова, а затем в контекстном меню выбрать команду Find references to import, как показано на рисунке 1.19.

Рисунок 1.19 – Часть контекстного меню окна Name in

Откроется окно References,изображенное на рисунке 1.20, которое содержит список команд.

Рисунок 1.20 – Окно References

Точки останова можно устанавливать прямо в данном окне при помощи клавиши F2. Что является преимуществом операции Find references to import, если необходимо установить точку останова в коде API функции, но не на входе в нее.