Сразу за Data Directories следует Section Table (в некоторых источниках она называется Object Table) — таблица, каждая строка которой является заголовком одной из секций. В таблице 4 представлена структура Section Table.
Таблица 4. Формат строки SectionTable
Смещение |
Размер (байт) |
Название поля |
Описание |
0 |
8 |
Name |
Название секции. Если строка короче 8-и байт, она дополнена нулями. |
8 |
4 |
VirtualSize |
Размер секции в памяти. |
12 |
4 |
VirtualAddress |
Виртуальный адрес начала секции. |
16 |
4 |
SizeOfRawData |
Размер секции в файле (кратен File Alignment). |
20 |
4 |
PointerToRawData |
Смешение начала секции в файле. |
24 |
4 |
PointerToRelocations |
В исполняемых файлах значение равно 0. |
28 |
4 |
PointerToLinenumbers |
Указатель на начало информации о номерах строк, которая присутствует, если файл был откомпилирован для отладки. |
32 |
2 |
NumberOfRelocations |
В исполняемых файлах значение равно 0. |
34 |
2 |
NumberOfLinenumbers |
Количество записей о номерах строк. |
36 |
4 |
Characteristics |
Флаги, описывающие свойства секции. |
Для данного курсового проекта важна также структура секции Import Data (обычно называется .idata), руководствуясь которой загрузчик подключает DLL библиотеки к программе, и устанавливает адреса экспортируемых функций. Иногда (в результате действий некоторых линкеров) эта информация хранится не в отдельной секции, а включена в секцию кода, но формат этих данных всегда одинаков. Основной частью секции .idata является Import Directory Table. В ней хранятся по одной записи для каждой используемой DLL. Последняя строка заполнена нулями. Формат строки приведён в таблице 5.
Таблица 5. Формат строки ImportDirectoryTable
Смещение |
Размер (байт) |
Название поля |
Описание |
0 |
4 |
Import Lookup Table RVA |
Относительный виртуальный адрес Import Lookup Table. |
4 |
4 |
Time/Date Stamp |
Time/date метка DLL. |
8 |
4 |
Fowarder Chain |
? |
12 |
4 |
Name RVA |
Относительный виртуальный адрес ASCII строки с именем DLL. |
16 |
4 |
Import Address Table RVA (Thunk Table) |
Относительный виртуальный адрес Import Address Table. |
В каждой строке есть ссылка на Import Lookup Table, которая является списком адресов имён импортируемых функций. Ещё есть указатель на Import Address Table, которая после загрузки будет заполнена виртуальными адресами соответствующих функций. Команды в коде программы, вызывающие функции из DLL, ссылаются на строки этой таблицы.
Разработанная программа шифрует первые 4 килобайта первой секции кода защищаемой программы, и добавляет в программу дополнительную секцию кода, которая запросит пароль, выполнит дешифрование и передаст управление основной программе. Запрос пароля, дешифрование и проверка правильности пароля вынесены в DLL библиотеку. Это связано с тем, что создание диалогового окна требует хранения целого ряда ресурсов, то есть без использования DLL дело не ограничилось бы добавлением одной секции кода. Использование DLL позволило: 1) минимизировать модификацию EXE-файла; 2) упростить расширение возможностей программы. Для добавления нового метода защиты (например, использование ключевой дискеты) нужно добавить реализацию этого метода в программу защиты, и добавить функцию в DLL которая будет проверять наличие и правильность ключа и выполнять дешифрование. Код добавляемой секции при этом останется неизменным, что является немаловажным, ввиду того, что этот код создаётся на языке ассемблера с последующей «ручной» корректировкой большого количества адресов (это очень кропотливая работа).
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.