Разработка приложения, способного защищать исполняемые файлы, страница 6

Сразу за 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 которая будет проверять наличие и правильность ключа и выполнять дешифрование. Код добавляемой секции при этом останется неизменным, что является немаловажным, ввиду того, что этот код создаётся на языке ассемблера с последующей «ручной» корректировкой большого количества адресов (это очень кропотливая работа).