Инструменты пользователя

Инструменты сайта


bbdevpackernohost

Различия

Показаны различия между двумя версиями страницы.

Ссылка на это сравнение

bbdevpackernohost [2013/12/17 22:50]
admin [Герметизация.]
bbdevpackernohost [2020/10/29 07:08]
Строка 1: Строка 1:
-====== Герметизация DevPacker. ====== 
  
-{{ :dev-packer.png?nolink |}} 
- 
-===== Проблема. ===== 
-В эталоне BlackBox есть модуль DevPacker, используемый для упаковки в исполняемый файл произвольных ресурсов. Ресурсы размещаются внутри исполняемого файла по определенным правилам. Эти правила известны в модуле HostPackedFiles, который реализует фабрику Files.dir для работы с упакованными ранее файлами. 
- 
-В процессе пересмотра внутренней структуры BlackBox, в модуле DevPacker обнаружилась негерметичность.  
-Она заключалась в прямой зависимости от HostFiles и HostPackedFiles. Кроме этого, HostPackedFiles опирался на структуру данных, формируемую в DevPacker (имплицитная зависимоcть). Негерметичность мешала использовать модуль в новой сборке ББ.  
- 
-Для использования DevPacker в новой сборке ББ необходимо провести герметизацию модуля.  
- 
-===== Герметизация. ===== 
-При взаимодействии //DevPacker// с пользователем создаётся список файлов (его тип - платформонезависимая структура //FileList//), который передается записывателю. 
- 
-Создадим отдельную подсистему //Packed//. Процедуры записи (их логика зависит от структуры исполняемого файла [[http://ru.wikipedia.org/wiki/Portable_Executable|PE EXE]]) отделим в модуль //PackedExeWriter//. Команды упаковки вынесем в модуль //PackedCmds//. Структуру //FileList// переместим в модуль //PackedCore//. Там же объявим записыватель, чей абстрактный метод //PackList// реализуется в //PackedExeWriter//. 
- 
-Таким образом, функциональность //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. 
bbdevpackernohost.txt · Последнее изменение: 2020/10/29 07:08 (внешнее изменение)