Привет, Хабр!

С момента публикации наших прошлых статей о создании программы для стеганографии ChameleonLab прошло немало времени. Мы получили огромное количество фидбэка и поняли, что тема сокрытия данных интересна сообществу не только в контексте классических картинок (LSB), но и в более сложных, повседневных файлах — документах.

Стандартные стеганографические программы, такие как Steghide, OpenStego или Stegsolve, отлично справляются с изображениями или аудио, но практически пасуют перед современными офисными документами. Попытка применить к .docx или .pdf LSB-алгоритм — это выстрел в пустоту. Данные будут уничтожены при первом же пересохранении.

Поэтому мы задались целью: научиться прятать большие объемы данных в самых популярных документах так, чтобы файл оставался полностью рабочим. И сегодня мы представляем ChameleonLab 1.4.1.0 — релиз, который превращает нашу программу в настоящий швейцарский нож для контейнерной стеганографии.

Программа "ChameleonLab". Версия 1.4.1.0
Программа "ChameleonLab". Версия 1.4.1.0

Анатомия современных документов: почему это работает?

Большинство современных форматов документов (.docx, .odt, .epub, .pages) — это, по сути, обычные ZIP-архивы. Если взять любой такой файл и поменять ему расширение на .zip, вы сможете заглянуть внутрь и увидите структуру из папок и XML-файлов.

Ключевой элемент в них — это файл-манифест, который строго перечисляет все "официальные" части документа. Любой файл, который физически лежит в архиве, но не упомянут в манифесте, будет программой-редактором (MS Word, LibreOffice и т.д.) попросту проигнорирован.

Это и есть наша лазейка. Мы назвали этот метод "Файл-призрак".

Вот как просто это выглядит на Python. Нам даже не нужны сторонние библиотеки, кроме стандартной zipfile:

import zipfile

def hide_in_zip_container(src_path, dest_path, payload_bytes):
    """
    Копирует содержимое одного ZIP-архива в другой,
    добавляя наш секретный файл "зайцем".
    """
    # Имя нашего файла-призрака
    secret_filename = 'content/secret.dat'

    with zipfile.ZipFile(src_path, 'r') as zin:
        with zipfile.ZipFile(dest_path, 'w') as zout:
            # Копируем все оригинальные файлы
            for item in zin.infolist():
                # Для EPUB нужно отдельно обработать файл 'mimetype'
                if item.filename != 'mimetype':
                    zout.writestr(item, zin.read(item.filename))
            
            # Добавляем наш секретный файл!
            # Манифест мы не трогаем, поэтому Word/Pages/etc его не увидят.
            zout.writestr(secret_filename, payload_bytes)

Эта простая, но эффективная логика легла в основу поддержки целого зоопарка форматов.

Расширяя горизонты: Универсальный подход к контейнерам

В этом обновлении мы сделали ставку на универсальность. Вместо того чтобы писать уникальный код для каждого формата, мы проанализировали их структуру и реализовали поддержку целых семейств документов.

  • OpenDocument (.odt, .ods, .odp): Это открытый стандарт и основа таких офисных пакетов, как LibreOffice и OpenOffice. Поддержка этих форматов была важна для обеспечения кроссплатформенности и независимости от проприетарного софта. В отличие от "файла-призрака", для ODF требуется аккуратная модификация XML-манифеста, что делает интеграцию чуть сложнее, но результат так же надежен.

  • EPUB (.epub): Стандарт де-факто для электронных книг. Возможность спрятать архив внутри книги открывает интересные сценарии. Представьте себе целую библиотеку на полке, где в одной из книг скрывается ваша цифровая капсула времени.

  • Apple iWork (.pages, .numbers, .key): Огромная экосистема пользователей Apple часто остается за бортом в мире стеганографических утилит. Мы исправили это. Теперь документы, созданные в Pages, Numbers или Keynote, могут служить такими же надежными контейнерами.

  • XPS/OXPS (.xps, .oxps): Хотя этот формат от Microsoft и не так популярен, как PDF, он является стандартным для многих корпоративных систем документооборота Windows. Добавление его поддержки делает нашу программу еще более универсальным решением.

Наш арсенал: полный список поддерживаемых форматов

В версии 1.4.1.0 ChameleonLab поддерживает стеганографию в следующих контейнерах:

Категория

Форматы

Метод сокрытия

Изображения

.png, .bmp, .tiff

Классический LSB

MS Office

.docx, .xlsx, .pptx

Внедрение в Custom XML Part

OpenDocument

.odt, .ods, .odp

"Файл-призрак" + правка манифеста

Эл. книги

.epub

"Файл-призрак"

Apple iWork

.pages, .numbers, .key

"Файл-призрак"

MS XPS

.xps, .oxps

"Файл-призрак"

Документы

.pdf

Авторский метод "Хамелеон"

Жемчужина коллекции: наш авторский метод для PDF

PDF стоит особняком. Это не ZIP-архив, а сложная бинарная структура из объектов. Попытка просто дописать байты в конец файла или внедрить их в метаданные либо легко обнаруживается, либо вмещает смехотворный объем.

Мы разработали собственную, уникальную методику, которую назвали «Метод Хамелеона». Не раскрывая всех деталей (это наше ноу-хау), скажем главное:

  • Метод не меняет видимое содержимое. Верстка, текст, изображения — все остается нетронутым.

  • Вместимость теоретически безгранична. Мы динамически создаем внутри PDF изолированный канал данных нужного размера.

  • Надежность. Данные выживают после открытия и пересохранения файла в большинстве популярных редакторов.

Этот метод превращает PDF из "неудобного" формата в один из самых надежных и емких контейнеров в нашем арсенале.

Аналоги и наше преимущество

На рынке существует несколько программ для стеганографии, но у ChameleonLab теперь есть ключевое преимущество:

  • OpenStego: Отличный проект, но в основном сфокусирован на LSB в изображениях и не работает с современными документами.

  • Steghide: Классическая консольная утилита, мощная, но также ограничена изображениями и аудио.

  • SilentEye: Хороший GUI, но опять же, фокус на LSB в медиафайлах.

Наше главное отличие — это универсальность и фокус на документах. ChameleonLab — это, пожалуй, единственная на данный момент программа с графическим интерфейсом, которая предоставляет единый подход для сокрытия данных в таком широком спектре офисных форматов, электронных книг и PDF, используя структурные, а не LSB-методы.

Особое внимание пользователям macOS

Отдельно хотим обратиться к пользователям macOS. Мы, как разработчики, сами ежедневно используем macOS для работы, и одной из причин создания ChameleonLab было практически полное отсутствие удобных и современных стеганографических программ под эту платформу. Большинство аналогов — это либо старые Java-приложения, либо портированные с Linux консольные утилиты, либо вовсе Windows-эксклюзивы.

Найти нативный, интуитивно понятный инструмент с графическим интерфейсом, который бы поддерживал современные форматы вроде .pages или .docx на macOS, — задача практически невыполнимая. ChameleonLab призван закрыть эту нишу. Мы создавали программу в первую очередь для себя и таких же, как мы, — тех, кто ценит качественный и работающий "из коробки" софт для экосистемы Apple.

Кроссплатформенность и будущие цели

Мы стремимся сделать ChameleonLab доступным для всех. На данный момент программа полностью протестирована и готова к работе на Windows и macOS.

Но на этом мы не останавливаемся. Прямо сейчас ведется активная работа по сборке и тестированию версий для Linux и Android. Наша цель — предоставить удобный и надежный инструмент для стеганографии на всех ключевых платформах. Следите за новостями!

Что дальше? Исследуем JPG и MP3

Нас часто спрашивают: "А когда будет поддержка JPG и MP3?". Это логичный вопрос, ведь это самые популярные медиаформаты. Однако они представляют собой совершенно иной класс сложности по сравнению с документами-контейнерами.

Ключевая проблема — сжатие с потерями.

  • В JPG нет простой пиксельной сетки, как в PNG. Изображение преобразуется в набор математических коэффициентов (ДКП), и именно они сжимаются. Классический LSB-метод здесь бесполезен — ваши биты будут уничтожены при первой же перепаковке. Для сокрытия данных в JPG существуют сложные алгоритмы (JSteg, F5, OutGuess), которые модифицируют сами коэффициенты ДКП, но их реализация требует глубокого понимания математики формата, чтобы не создавать статистических аномалий.

  • В MP3 ситуация аналогична. Формат использует психоакустическую модель, чтобы "выбросить" звуки, которые человеческое ухо все равно не услышит. Простое изменение битов в аудиопотоке почти гарантированно приведет к слышимым щелчкам и артефактам. Стеганография в MP3 — это отдельная наука, требующая работы со структурой фреймов и спецификой кодирования.

Мы активно изучаем эти форматы и существующие алгоритмы. Добавление их поддержки — наша следующая большая цель, но она требует серьезных исследований для достижения того же уровня надежности, который мы обеспечили для форматов-контейнеров.

Что еще нового?

Мы также прислушались к отзывам и исправили несколько мелочей, включая баг с удалением нескольких линий в нашем пасхальном "Тетрисе".

Это обновление — большой шаг вперед для проекта. Мы перешли от классических алгоритмов к более сложным и надежным методам структурной стеганографии, сделав программу по-настоящему универсальной.

Последнюю версию программы «Steganographia» от ChameleonLab для Windows и macOS можно скачать на нашем официальном сайте.

Будем рады, если вы опробуете новую версию. Ждем ваших отзывов, сообщений об ошибках и, конечно же, предложений по новым форматам для исследований. Присоединяйтесь к нашему Telegram-каналу!

Спасибо за внимание!

Комментарии (2)


  1. kpen
    07.09.2025 23:50

    Работаю из-под Linux в стае старпёров-виндузятников. Периодически приходится создавать технические руководства и инструкции. Документацию на файл-сервере мне не разрешают сохранять в SVG-формате но разрешают сохранять в виде PDF-документов. Буду дожидаться Linux версию Вашей программы. В каждый сгенерированный(экспортированный) из-под Inkscape PDF-документ буду внедрять SVG-исходник - чтоб при внезапной необходимости редактирования PDF-документа - не искать SVG-исходник (он же будет внутри документа).


  1. M_AJ
    07.09.2025 23:50

    Я может быть как-то не так понимаю идею, но мне казалось суть стеганографии в том, чтобы скрытую информацию было непросто обнаружить, и если в случае изменения младших битов картинки это действительно так, поскольку трудно сказать, изменены ли они специально, чтобы скрыть информацию, или это сама картинка такая, то в случае с "файлом-призраком" все становится понятно сразу — как только мы видим .docx нетипичной структуры, значит от нас пытаются что-то скрыть.