Следующая версия
|
Предыдущая версия
Следующая версия
Следующая версия справа и слева
|
bbdevpackernohost [2013/12/16 16:14] kpmy created |
bbdevpackernohost [2013/12/16 21:36] kpmy [Адаптация к новым платформам] |
| |
===== Проблема. ===== | ===== Проблема. ===== |
| |
В эталоне Блэкбокса есть модуль DevPacker, он реализует функции упаковки в исполняемый файл произвольных ресурсов. Ресурсы размещаются внутри исполняемого файла по определенным правилам. Эти правила известны в модуле HostPackedFiles, который реализует фабрику Files.dir для работы с упакованными ранее файлами. | В эталоне Блэкбокса есть модуль DevPacker, он реализует функции упаковки в исполняемый файл произвольных ресурсов. Ресурсы размещаются внутри исполняемого файла по определенным правилам. Эти правила известны в модуле HostPackedFiles, который реализует фабрику Files.dir для работы с упакованными ранее файлами. |
| |
| |
===== Герметизация. ===== | ===== Герметизация. ===== |
| |
При анализе содержимого модуля DevPacker выяснилось, что модуль реализует две основные функции: взаимодействие с пользователем и запись структуры и содержимого упакованных файлов. | При анализе содержимого модуля DevPacker выяснилось, что модуль реализует две основные функции: взаимодействие с пользователем и запись структуры и содержимого упакованных файлов. |
Взаимодействие с пользователем приводит к формированию платформонезависимого списка файлов, который передается записывателю. | Взаимодействие с пользователем приводит к формированию платформонезависимого списка файлов, который передается записывателю. |
Таким образом модуль DevPacker был изолирован от любых платформозависимых модулей при сохранении своих функций, а модуль PackedCore представляет для модуля PackedCmds герметичный прикладной слой. | Таким образом модуль DevPacker был изолирован от любых платформозависимых модулей при сохранении своих функций, а модуль PackedCore представляет для модуля PackedCmds герметичный прикладной слой. |
| |
| ===== Модернизация HostPackedFiles. ===== |
| Изменения структуры DevPacker привели к отделению в отдельный модуль функций записи в исполняемый файл. Этот модуль теперь является реализацией абстрактного интерфейса, следовательно, он может быть изменен. Однако от него существует имплицитная зависимость в модуле HostPackedFiles. |
| |
| Также модуль HostPackedFiles опирается на конкретные интерфейсы реализации файловой подсистемы ББ (HostFiles). |
| Это делает его уязвимым как при смене платформы так и при смене формата записи. Для установления связи модуля чтения файлов от модуля записи файлов опишем модуль PackedWinConst, который будет содержать необходимую информацию для работы с форматом записи (для базовой реализации это константа версии и тэга). Эти же константы используем внутри модуля PackedExeWriter. |
| |
| ===== Дальнейшее преобразование ===== |
| Модуль PackedExeWriter реализует функции записи файлов, которые описаны типом PackedCore.FileList. Этот тип описывает значение даты и времени последней модификации файла, которые затем использует PackedExeWriter. На различных платформах (а так же при использовании пользовательских реализаций Files.Directory) способы получения информации о времени последнего изменения могут различаться. Следовательно, модуль PackedExeWriter не должен зависеть от конкретной реализации файловой подсистемы BB, согласно принципа "черного ящика". Для изоляции PackedExeWriter опишем в модуле PackedCore хук для получения нужной информации, который реализуем в модуле PackedOldWinSelector (для работы в эталонном ББ). Данный модуль одновременно будет устанавливать и реализацию записывателя. |
| |
| ===== Результаты ===== |
| Таким образом из негерметичного модуля DevPacker мы получили герметичную реализацию упаковщика файлов, подсистему [[https://bitbucket.org/petryxa/packed]], в которой представлен абстрактный интерфейс упаковки файлов, пользовательский интерфейс, который не зависит от реализации, а также конкретная реализация, которая скрыта и соответствует строго определенной платформе. Это открывает возможность как для использования в новой сборке ББ, так и для дальнейшего расширения подсистемы на новые платформы. |
| |
| ===== Адаптация к новым платформам ===== |
| {{ :packed-replace.png?direct&300 |}} |
| Для реализации упаковщика под новую платформу, например, Linux, необходимо: описать константы платформы (см. PackedLinConst), реализовать модули записывателя (см. PackedSOWriter), и реализовать модуль PackedLinFiles, который возможно будет взаимодействовать с модулем-реализацией файловой системы в Linux-сборке ББ. Также необходим селектор платформы (см. PackedLinSelector) который позволит инициализировать подсистему для работы под Linux. |