Предыдущая версия справа и слева
Предыдущая версия
Следующая версия
|
Предыдущая версия
|
bbdevpackernohost [2013/12/16 16:37] kpmy |
bbdevpackernohost [2020/10/29 07:08] (текущий) |
| |
===== Проблема. ===== | ===== Проблема. ===== |
В эталоне Блэкбокса есть модуль DevPacker, он реализует функции упаковки в исполняемый файл произвольных ресурсов. Ресурсы размещаются внутри исполняемого файла по определенным правилам. Эти правила известны в модуле HostPackedFiles, который реализует фабрику Files.dir для работы с упакованными ранее файлами. | В эталоне BlackBox есть модуль DevPacker, используемый для упаковки в исполняемый файл произвольных ресурсов. Ресурсы размещаются внутри исполняемого файла по определенным правилам. Эти правила известны в модуле HostPackedFiles, который реализует фабрику Files.dir для работы с упакованными ранее файлами. |
| |
В процессе пересмотра внутренней структуры ББ в модуле DevPacker обнаружилась негерметичность. | В процессе пересмотра внутренней структуры BlackBox, в модуле DevPacker обнаружилась негерметичность. |
Она заключалась в прямой зависимости от HostFiles и HostPackedFiles. HostPackedFiles в свою очередь опирался на структуру данных, формируемую в DevPacker (имплицитная зависимоcть). | Она заключалась в прямой зависимости от HostFiles и HostPackedFiles. Кроме этого, HostPackedFiles опирался на структуру данных, формируемую в DevPacker (имплицитная зависимоcть). Негерметичность мешала использовать модуль в новой сборке ББ. |
Негерметичность мешала использовать модуль в новой сборке ББ. | |
| |
Для использования DevPacker в новой сборке ББ необходимо провести герметизацию модуля. | Для использования DevPacker в новой сборке ББ необходимо провести герметизацию модуля. |
| |
===== Герметизация. ===== | ===== Герметизация. ===== |
При анализе содержимого модуля DevPacker выяснилось, что модуль реализует две основные функции: взаимодействие с пользователем и запись структуры и содержимого упакованных файлов. | При взаимодействии //DevPacker// с пользователем создаётся список файлов (его тип - платформонезависимая структура //FileList//), который передается записывателю. |
Взаимодействие с пользователем приводит к формированию платформонезависимого списка файлов, который передается записывателю. | |
| |
Все работы будут производиться над копией модулей в подсистеме Packed. | Создадим отдельную подсистему //Packed//. Процедуры записи (их логика зависит от структуры исполняемого файла [[http://ru.wikipedia.org/wiki/Portable_Executable|PE EXE]]) отделим в модуль //PackedExeWriter//. Команды упаковки вынесем в модуль //PackedCmds//. Структуру //FileList// переместим в модуль //PackedCore//. Там же объявим записыватель, чей абстрактный метод //PackList// реализуется в //PackedExeWriter//. |
| |
Выделим процедуры записи в модуль PackedExeWriter. Даже при отсутствии прямых зависимостей модуля от WinApi или хост-подсистемы этот модуль всё равно зависит от структуры исполняемого файла Windows. Значит, платформонезависимые модули не могут его импортировать напрямую. | Таким образом, функциональность //DevPacker// отделилась от платформозависимых модулей. Модуль //PackedCore// представляет для модуля //PackedCmds// герметичный прикладной слой. |
| |
Выделим процедуры взаимодействия с пользователем в модуль PackedCmds. Так как структура FileList теперь используется модулем PackedExeWriter, сделаем её экспортированной, а для отделения функций по взаимодействию с пользователем переместим FileList в модуль PackedCore. | |
| |
Чтобы модуль Cmds мог передать список файлов на упаковку, опишем в модуле PackedCore интерфейс записывателя Writer с методом PackList, который будет реализован в PackedExeWriter. Переменная PackedCore.writer типа Writer будет доступна модулю Cmds. | |
| |
Таким образом модуль DevPacker был изолирован от любых платформозависимых модулей при сохранении своих функций, а модуль PackedCore представляет для модуля PackedCmds герметичный прикладной слой. | |
| |
===== Модернизация HostPackedFiles. ===== | ===== Модернизация HostPackedFiles. ===== |
Изменения структуры DevPacker привели к отделению в отдельный модуль функций записи в исполняемый файл. Этот модуль теперь является реализацией абстрактного интерфейса, следовательно, он может быть изменен. Однако от него существует имплицитная зависимость в модуле HostPackedFiles. | Модуль //HostPackedFiles// имеет неявную зависимость от алгоритмов //DevPacker// и опирается на эталонный интерфейс //HostFiles//, реализации файловых абстракций //BlackBox//. |
| Это делает его уязвимым как при смене платформы, так и при смене формата записи. Поэтому указания на конкретные особенности имеет смысл отделить от остальной логики. |
| |
Также модуль HostPackedFiles опирается на конкретные интерфейсы реализации файловой подсистемы ББ (HostFiles). | Создадим модуль //PackedWinConst//, который будет содержать необходимую информацию для работы с форматом записи (для эталонной реализации это константы версии и тэга). Эти же константы используем внутри модуля //PackedExeWriter//. |
Это делает его уязвимым как при смене платформы так и при смене формата записи. Для установления связи модуля чтения файлов от модуля записи файлов опишем модуль PackedWinConst, который будет содержать необходимую информацию для работы с форматом записи (для базовой реализации это константа версии и тэга). Эти же константы используем внутри модуля PackedExeWriter. | |
| |
===== Дальнейшее преобразование ===== | ===== Дальнейшее преобразование ===== |
| |
===== Результаты ===== | ===== Результаты ===== |
Таким образом из негерметичного модуля DevPacker мы получили герметичную реализацию упаковщика файлов, в котором представлен абстрактный интерфейс упаковки файлов, пользовательский интерфейс, который не зависит от реализации, а также конкретная реализация, которая скрыта и соответствует строго определенной платформе. Это открывает возможность как для использования в новой сборке ББ, так и для дальнейшего расширения подсистемы на новые платформы. | Таким образом из негерметичного модуля DevPacker мы получили герметичную реализацию упаковщика файлов, подсистему [[https://bitbucket.org/petryxa/packed]], в которой представлен абстрактный интерфейс упаковки файлов, пользовательский интерфейс, который не зависит от реализации, а также конкретная реализация, которая скрыта и соответствует строго определенной платформе. Это открывает возможность как для использования в новой сборке ББ, так и для дальнейшего расширения подсистемы на новые платформы. |
| |
===== Адаптация к новым платформам ===== | ===== Адаптация к новым платформам ===== |
Для реализации упаковщика под новую платформу, например, Linux, необходимо: описать константы платформы (см. PackedLinConst), реализовать модули записывателя (см. PackedSOWriter), и реализовать модуль PackedLinFiles, который возможно будет взаимодействовать с модулем-реализацией файловой системы в Linux-сборке ББ. | {{ :packed-replace.png?direct&300 |}} |
| Для реализации упаковщика под новую платформу, например, Linux, необходимо: описать константы платформы (см. PackedLinConst), реализовать модули записывателя (см. PackedSOWriter), и реализовать модуль PackedLinFiles, который возможно будет взаимодействовать с модулем-реализацией файловой системы в Linux-сборке ББ. Также необходим селектор платформы (см. PackedLinSelector) который позволит инициализировать подсистему для работы под Linux. |