Следующая версия
|
Предыдущая версия
Следующая версия
Следующая версия справа и слева
|
bb:devpackernohost [2016/03/30 22:27] prospero78 создано |
bb:devpackernohost [2016/04/06 20:20] prospero78 [Модернизация HostPackedFiles.] |
| |
===== Проблема. ===== | ===== Проблема. ===== |
В эталоне BlackBox есть модуль DevPacker, используемый для упаковки в исполняемый файл произвольных ресурсов. Ресурсы размещаются внутри исполняемого файла по определенным правилам. Эти правила известны в модуле HostPackedFiles, который реализует фабрику Files.dir для работы с упакованными ранее файлами. | В эталоне **BlackBox** есть модуль ''DevPacker'', используемый для упаковки в исполняемый файл произвольных ресурсов. Ресурсы размещаются внутри исполняемого файла по определенным правилам. Эти правила известны в модуле ''HostPackedFiles'', который реализует фабрику ''Files.dir'' для работы с упакованными ранее файлами. |
| |
В процессе пересмотра внутренней структуры BlackBox, в модуле DevPacker обнаружилась негерметичность. | В процессе пересмотра внутренней структуры **BlackBox**, в модуле ''DevPacker'' обнаружилась //негерметичность//. |
Она заключалась в прямой зависимости от HostFiles и HostPackedFiles. Кроме этого, HostPackedFiles опирался на структуру данных, формируемую в DevPacker (имплицитная зависимоcть). Негерметичность мешала использовать модуль в новой сборке ББ. | Она заключалась в прямой зависимости от ''HostFiles'' и ''HostPackedFiles''. Кроме этого, ''HostPackedFiles'' опирался на структуру данных, формируемую в ''DevPacker'' (имплицитная зависимоcть). Негерметичность мешала использовать модуль в новой сборке ББ. |
| |
Для использования DevPacker в новой сборке ББ необходимо провести герметизацию модуля. | Для использования ''DevPacker'' в новой сборке ББ необходимо провести герметизацию модуля. |
| |
===== Герметизация. ===== | ===== Герметизация. ===== |
При взаимодействии //DevPacker// с пользователем создаётся список файлов (его тип - платформонезависимая структура //FileList//), который передается записывателю. | При взаимодействии ''DevPacker'' с пользователем создаётся список файлов (его тип - платформонезависимая структура ''FileList''), который передается записывателю. |
| |
Создадим отдельную подсистему //Packed//. Процедуры записи (их логика зависит от структуры исполняемого файла [[http://ru.wikipedia.org/wiki/Portable_Executable|PE EXE]]) отделим в модуль //PackedExeWriter//. Команды упаковки вынесем в модуль //PackedCmds//. Структуру //FileList// переместим в модуль //PackedCore//. Там же объявим записыватель, чей абстрактный метод //PackList// реализуется в //PackedExeWriter//. | Создадим отдельную подсистему ''Packed''. Процедуры записи (их логика зависит от структуры исполняемого файла [[http://ru.wikipedia.org/wiki/Portable_Executable|PE EXE]]) отделим в модуль ''PackedExeWriter''. Команды упаковки вынесем в модуль //PackedCmds//. Структуру //FileList// переместим в модуль ''PackedCore''. Там же объявим //записыватель//, чей абстрактный метод ''PackList'' реализуется в ''PackedExeWriter''. |
| |
Таким образом, функциональность //DevPacker// отделилась от платформозависимых модулей. Модуль //PackedCore// представляет для модуля //PackedCmds// герметичный прикладной слой. | Таким образом, функциональность ''DevPacker'' отделилась от платформозависимых модулей. Модуль ''PackedCore'' представляет для модуля ''PackedCmds'' герметичный прикладной слой. |
| |
===== Модернизация HostPackedFiles. ===== | ===== Модернизация HostPackedFiles. ===== |
Модуль //HostPackedFiles// имеет неявную зависимость от алгоритмов //DevPacker// и опирается на эталонный интерфейс //HostFiles//, реализации файловых абстракций //BlackBox//. | Модуль ''HostPackedFiles'' имеет неявную зависимость от алгоритмов ''DevPacker'' и опирается на эталонный интерфейс ''HostFiles'', реализации файловых абстракций ''BlackBox''. |
Это делает его уязвимым как при смене платформы, так и при смене формата записи. Поэтому указания на конкретные особенности имеет смысл отделить от остальной логики. | Это делает его уязвимым как при смене платформы, так и при смене формата записи. Поэтому указания на конкретные особенности имеет смысл отделить от остальной логики. |
| |
Создадим модуль //PackedWinConst//, который будет содержать необходимую информацию для работы с форматом записи (для эталонной реализации это константы версии и тэга). Эти же константы используем внутри модуля //PackedExeWriter//. | Создадим модуль ''PackedWinConst'', который будет содержать необходимую информацию для работы с форматом записи (для эталонной реализации это константы версии и тэга). Эти же константы используем внутри модуля ''PackedExeWriter''. |
| |
===== Дальнейшее преобразование ===== | ===== Дальнейшее преобразование ===== |