Стеганография в файловой системе оптических дисков

    Будучи в поисках интересной информации о стеганографии, я наткнулся на занимательную статью о стеганографии в файловой системе, и, спустя какое -то время, та навела меня на мысль о создании стеганографии в файловой системе оптических дисков.

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

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

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

    image

    Но перед тем, как мы начнем, давайте сначала разберем некоторые мелочи, а так же определим понятие оптического диска.

    Что такое оптический диск


    Опти́ческий диск (англ. optical disc) — собирательное название для носителей информации, выполненных в виде дисков, чтение с которых ведётся с помощью оптического (лазерного) излучения.

    image

    Каждый диск на компьютере представляется в определенном формате в виде образа, где содержится вся информация и структура диска, и используется он для работы с информацией без оптического носителя, а также архивирования данных на твёрдые носители
    Стандартным форматом для оптических дисков является iso9660, но есть еще
    Следует иметь в виду, что образ содержит меньше информации, чем исходный компакт-диск. На диске содержится служебная информация, которая может, в частности, использоваться для защиты от копирования.Работать же мы будем с ISO9660.

    Взгляд изнутри


    A теперь давайте же посмотрим на структуру iso9660 изнутри, подробную информацию вы можете найти здесь, здесь и здесь, а для знающих английский еще и здесь. От себя же просто скажу, что в основном она состоит из 2 дескрипторов: Boot Record и Primary Volume Descriptor (PVD), вы можете открыть любой iso в 010editor и сами в этом убедиться.

    image

    Boot Record может быть использован системами, которым необходимо инициализировать много типов данных, перед тем, как сделать диск доступным, хотя ISO 9660 не указывает на то, какая информация в Boot Record или как ее вообще использовать.

    PVD же — стартовая точка в идентификации iso9660, выглядит она следующим образом:

    image

    image

    Для любителей схем:

    image

    Больше информации вы найдете тут

    А мы движемся дальше.

    Инициализация в структуре ISO


    Работать мы будем с корневой директорией, в ней создадим собственные директории и добавим необходимые файлы.

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

    Перейдем к написанию программы, но кто не хочет идти пошагово, исходный код вы найдете по ссылке на мой репозиторий в гитхаб:

    #делаем все необходимые операции импорта
    import base64
    import pycdlib

    Подготавливаем файлы с текстом


    Теперь нам необходимо подготовить наши файлы, которые мы закинем в структуру нашего iso.

    Ход действий следующий:

    1. Берем исходный текст в определенных файлах и считываем его в переменные- ничто не мешает взять нам много текста, но для демонстрации я взял всего пару предложений в каждый файл- этими переменными мы и будем дальше манипулировать
    2. После того, как мы считали предложения, нам необходимо закодировать содержимое Кодировать же мы будем с помощью base64
    3. Запишем закодированное содержимое в новые файлы, под названием UP и DOWN. Файлы так называются из-за того, что я решил сделать перестановку таким образом, чтобы в UP записалась 1 часть 1го файла и 1 часть 2го файла(т.е верхние части), а в DOWN 2 часть 1го файла и 2 часть 2го файла(т.е нижние части)

    with open('/home/ul/stegist1.txt','rb') as stegist1:# открываем файл
        for line1 in stegist1.readlines(2):
            print(line1)#читаем первое предложение 1 файла
        for line2 in stegist1.readlines(2):
            print(line2)#читаем второе предложение 1 файла
        stegist1.close()
    
    enc_line1=base64.b64encode(line1)#кодируем наши предложения с помощью base64
    enc_line2=base64.b64encode(line2)
    
    with open('/home/ul/stegist2.txt','rb') as stegist2:
        for line3 in stegist2.readlines(2):#читаем второе предложение 2 файла
            print(line3)
        for line4 in stegist2.readlines(2):#читаем второе предложение 2 файла
            print(line4)
        stegist2.close()
    
    enc_line3=base64.b64encode(line3)#кодируем содержимое предложений
    print(enc_line3)
    enc_line4=base64.b64encode(line4)
    print(enc_line4)
    
    with open('/home/ul/UP.txt','ab') as up:#В файл UP записываем закодированные предложения
        up.write(enc_line1)
        up.write(enc_line3)
    
    with open('/home/ul/DOWN.txt','ab') as down:#В файл DOWN записываем закодированные предложения
        down.write(enc_line2)
        down.write(enc_line4)
    

    Сокрытие


    Пришло время перейти к той самой библиотеке pycdlib, о которой я говорил еще в начале. С ней работать достаточно не сложно: мы создаем объект, через который дальше добавляем внутрь различные файлы и директории.

    
    iso=pycdlib.PyCdlib() #создаем объект класса PyCdlib
    iso.new(rock_ridge='1.09')#используем расширение rockridge(об используемых в стандарте iso расширениях немного позже)
    iso.add_directory(iso_path='/A1',rr_name='a1')#добавляем различные папки(если считаем нужным)
    iso.add_directory(iso_path='/B1',rr_name='b1')
    iso.add_directory(iso_path='/B1/B2',rr_name='b1b2')
    iso.add_directory(iso_path='/A1/A2',rr_name='a1a2')
    iso.add_file('/home/ul/stegistup.txt', iso_path='/A',rr_name='a')#добавляем наш файл up
    iso.add_file('/home/ul/stegistdown.txt', iso_path='/B',rr_name='b')#добавляем наш файл down
    iso.write('papastegisto.iso')#создаем образ iso (записываем)

    Как мы видим, наш текст успешно записался

    image

    Хочу подметить, что мы можем создать по определенному пути, например /A, либо файл, либо папку.

    Если мы сначала укажем создание директории в /A, а затем укажем создание файла в /A выведется сообщение об ошибке, это не все равно, что положить файл в папку.

    Расширения для файловой системы ISO9660


    Есть 2 основных расширения для файловой системы iso, это: RockRidge и Joilet.

    RockRidge


    Это расширение файловой системы ISO 9660, разработанное для хранения файловых атрибутов, используемых в операционных системах POSIX(т.е Unix- совместимых).

    Расширения Rock Ridge записываются поверх файловой системы ISO 9660 так, что оптический диск с Rock Ridge может быть прочитан программным обеспечением, рассчитанным на работу с ISO 9660.

    Подробнее
    Rock Ridge может хранить следующую дополнительную информацию о содержимом диска:

    • длинные имена файлов (до 255 символов);
    • меньше ограничений на использование символов в именах файлов;
    • структуру каталогов произвольной вложенности.
    • для каждого файла записываются атрибуты:
    • права доступа к файлу, в том числе поля uid и gid;
    • количество жёстких ссылок на файл;
    • времена создания, модификации, доступа, изменения атрибутов и др.
    • поддерживаются специальные файлы:
    • разрежённые файлы;
    • символьные ссылки;
    • файлы устройств;
    • файлы сокетов;
    • FIFO-файлы.

    Эти данные записываются в специальные каталоги, имена которых обычно скрываются.

    Joilet


    Это расширение файловой системы ISO 9660, созданное для ослабления ограничений на имя файла, накладываемых в ISO 9660. Спецификация была разработана фирмой Microsoft и поддерживается всеми версиями ОС Microsoft Windows со времён Windows 95 и Windows NT 4.0.
    По умолчанию используется на всех CD-ROM носителях с данными, выпущенных после 1995 года.

    Подробнее
    Joliet вводит дополнительный набор имён для файлов. Имена имеют длину до 64 символов Unicode и хранятся в кодировке UCS-2. Для их хранения используется специальный дополнительный заголовок (Supplementary Volume Descriptor, SVD), который безусловно игнорируется ISO 9660-совместимыми программами, обеспечивая этим обратную совместимость.

    Большинство существующих программных платформ, включая Microsoft Windows, Linux, Mac OS X, и FreeBSD, способны читать носители информации с расширением файловой системы Joliet, что позволяет обмениваться файлами между этими операционными системами даже при использовании нелатинских алфавитов (таких как Арабский, Японский, Кириллица), что было невозможно при помощи обычного ISO 9660.

    На самом деле, есть еще и 3 расширение для файловой системы iso, оно называется Romeo.

    Это расширение ISO 9660 для MS Windows 95, информации по нему в интернете достаточно мало, и, вероятнее всего, это расширение больше нигде сейчас не используется.

    Еще больше информации по расширениям и файловым системам для CD/DVD вы найдете тут, а сейчас давайте вернемся к нашей программе.

    Получившийся код для кодирования информации из файла и помещения файлов с закодированной информацией в iso выглядит так:

    #делаем все необходимые операции импорта
    import base64
    import pycdlib
    #подготавливаем наше содержимое
    with open('/home/ul/stegist1.txt','rb') as stegist1: #открываем файл
    
        for line1 in stegist1.readlines(2):
            print(line1) #читаем содержимое
        for line2 in stegist1.readlines(2):
            print(line2) #читаем содержимое
    
    enc_line1=base64.b64encode(line1)
    print(enc_line1)
    enc_line2=base64.b64encode(line2)
    print(enc_line2)
    
    with open('/home/ul/stegist2.txt','rb') as stegist2: #открываем файл
    
        for line3 in stegist2.readlines(2): #читаем содержимое
            print(line3)
        for line4 in stegist2.readlines(2): #читаем содержимое
            print(line4)
    enc_line3=base64.b64encode(line3) #кодируем содержимое
    print(enc_line3)
    enc_line4=base64.b64encode(line4)
    print(enc_line4)
    
    with open('/home/ul/UP.txt','ab') as up: #В файл UP записываем закодированные данные
        up.write(enc_line1)
        up.write(enc_line3)
    with open('/home/ul/DOWN.txt','ab') as down: #В файл DOWN записываем закодированные данные
        down.write(enc_line2)
        down.write(enc_line4)
    
    #заносим все в iso
    iso=pycdlib.PyCdlib()
    iso.new(rock_ridge='1.09')
    iso.add_directory(iso_path='/A1',rr_name='a1')
    iso.add_directory(iso_path='/B1',rr_name='b1')
    iso.add_directory(iso_path='/B1/B2',rr_name='b1b2')
    iso.add_directory(iso_path='/A1/A2',rr_name='a1a2')
    iso.add_file('/home/ul/stegistup.txt', iso_path='/A',rr_name='a')
    iso.add_file('/home/ul/stegistdown.txt', iso_path='/B',rr_name='b')
    iso.write('papastegisto.iso')

    А я напоминаю, что полный код так же есть по ссылке на гитхаб
    Теперь давайте же перейдем к заключительной части — запишем наш получившийся iso на диск
    Вы можете записывать чем хотите, я же воспользуюсь Nero 7
    Использовать мы будем CD-R
    CD-ROM, CD-R и CD-RW
    Отличаются они тем, что CD-ROM это диск только для чтения данных, записать уже туда ничего не получится. CD-R и CD-RW это диски с возможностью записи. CD-R позволяет записать однократно на диск, CD-RW — многократно.

    А как же DVD?

    Основное отличие от CD-R/RW заключается в объеме данных, которые можно записать на DVD-диск 4,7 ГБ против 650700 МБ. Некоторые форматы DVD поддерживают до 13 и даже 17 ГБ
    Еще больше информации о дисках

    Как мы видим, программа успешно записалась на диск.

    image

    Теперь мы можем передать ее на диске тем людям, каким сами захотим.

    Декодирование


    Зачем нам все это было делать, если информацию нельзя раскодировать обратно, верно?

    Если вас заинтересовал способ, можно написать программу, которая будет изымать и декодировать вложенные файлы, ей как раз таки и будут пользоваться «ваши люди».

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

    image

    Буду рад увидеть ваши предложения, дополнения, исправления и другой feedback.

    P.S. Хочу выразить особую благодарность @PavelMSTU за консультации и мотивационные пинки.
    • +26
    • 4,4k
    • 5
    Поддержать автора
    Поделиться публикацией

    Комментарии 5

      +1
      Спасибо за статью, возможно с вашей помощью мне удастся продать дубликатор, стоящий в шкафу уже несколько лет. Даешь вторую жизнь оптике!

      По такой же схеме можно ISO записать на Flash`ку при помощи UltraISO.?
        0

        А что здесь специфичного от оптических дисков? Вы по сути просто в образ ISO9660 добавили свои кастомные файлы "куда-то внутрь". Можно положить образ на флешку — и ничего сугубо "оптического" не останется.


        (я просто думал, что вы смогли спрятать свои файлы, потеснив Рида-Соломона, и при этом так, что коррекция ошибок всё же осталась. Вот это да, было бы круто!)

          0
          Интересно! Кстати, есть бесплатный сервис по скрытию информации в изображениях. Даже в JPEG'ах. Алгоритм заключается не в использовании младших битов, а в статистическом анализе группы пикселов.
            0
            А нет такого, что это — как passgen'ы в интернете? То бишь такие трюки нужно проводить локально, а не во внешней сети. Да что там говорить — скрываемый объект на вашем сервисе даже не под SSL/TLS побежит. Хотя, конечно, зашифровать скрываемые данные можно заранее локально, но это — всё равно не то.
              0
              Согласен, это только как пример. Приложение будет чуть позже.

          Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.