Предыдущий шаг здесь
В этом шаге я ничего с кодом делать не буду, а просто приведу в доступном виде архитектуру упаковщика, а точнее, упакованного им файла. Я делаю это для того, чтобы вы смогли разобраться, как устроен упакованный файл, не изучая для этого все шаги подробно. Возможно, с этого стоило начать, но теперь уже поздно.
Итак, представим, что у нас есть DLL-файл, имеющий следующие директории:
- импорты
- экспорты
- ресурсы (в том числе информацию о версии)
- релокации
- конфигурацию загрузки
- TLS с коллбэками
Словом, всего по максимуму. Как это все будет расположено в упакованном файле?
Здесь нарисована структура полученного после упаковки файла. Он всегда будет иметь две секции. Первая будет содержать упакованные данные оригинального файла, структуру с информацией об оригинальном файле, которая необходима распаковщику, и ресурсы (не все, а только иконки, манифест и информацию о версии), если они были у оригинального файла. Вторая секция будет содержать тело распаковщика, настроенное для распаковки данного файла. Опционально там же будет размещены директории TLS (данные и коллбэки там же), релокации для распаковщика и TLS, оригинальная таблица экспортов и директория конфигурации загрузки.
Вот и все, не так и сложно!