- PVSM.RU - https://www.pvsm.ru -
Будучи в поисках интересной информации о стеганографии, я наткнулся на занимательную статью о стеганографии в файловой системе [1], и, спустя какое -то время, та навела меня на мысль о создании стеганографии в файловой системе оптических дисков.
Вероятно, в наши дни, уже почти не осталось людей, которые бы использовали в повседневности диски, ведь им на замену пришел более достойный вариант в лице флеш-накопителей.
Немного поразмыслив, я решил, что дискам все еще можно найти какое-то применение, например, внутри их файловой системы можно скрыть какую-то секретную информацию и затем передать другому так, чтобы никто ничего не заподозрил.
Этим мы и займемся, а именно: будем использовать библиотеку питона, которая поможет нам закодировать информацию из текстового файла, а затем скрыть ее в недрах нашего диска.
Но перед тем, как мы начнем, давайте сначала разберем некоторые мелочи, а так же определим понятие оптического диска.
Опти́ческий диск (англ. optical disc) — собирательное название для носителей информации, выполненных в виде дисков, чтение с которых ведётся с помощью оптического (лазерного) излучения.
Каждый диск на компьютере представляется в определенном формате в виде образа, где содержится вся информация и структура диска, и используется он для работы с информацией без оптического носителя, а также архивирования данных на твёрдые носители
Стандартным форматом для оптических дисков является iso9660 [2], но есть еще [3]
Следует иметь в виду, что образ содержит меньше информации, чем исходный компакт-диск. На диске содержится служебная информация, которая может, в частности, использоваться для защиты от копирования. [4]Работать же мы будем с ISO9660.
A теперь давайте же посмотрим на структуру iso9660 изнутри, подробную информацию вы можете найти здесь [5], здесь [6] и здесь [7], а для знающих английский еще и здесь [8]. От себя же просто скажу, что в основном она состоит из 2 дескрипторов: Boot Record и Primary Volume Descriptor (PVD), вы можете открыть любой iso в 010editor [9] и сами в этом убедиться.
Boot Record может быть использован системами, которым необходимо инициализировать много типов данных, перед тем, как сделать диск доступным, хотя ISO 9660 не указывает на то, какая информация в Boot Record или как ее вообще использовать.
PVD же — стартовая точка в идентификации iso9660, выглядит она следующим образом:
Для любителей схем:
Больше информации вы найдете тут [10]
А мы движемся дальше.
Работать мы будем с корневой директорией, в ней создадим собственные директории и добавим необходимые файлы.
Для этого мы будем использовать библиотеку pycdlib, с ней вы можете хорошо ознакомиться по следующей [11] ссылке.
Перейдем к написанию программы, но кто не хочет идти пошагово, исходный код вы найдете по ссылке на мой репозиторий [12] в гитхаб:
#делаем все необходимые операции импорта
import base64
import pycdlib
Теперь нам необходимо подготовить наши файлы, которые мы закинем в структуру нашего iso.
Ход действий следующий:
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 (записываем)
Как мы видим, наш текст успешно записался
Хочу подметить, что мы можем создать по определенному пути, например /A, либо файл, либо папку.
Если мы сначала укажем создание директории в /A, а затем укажем создание файла в /A выведется сообщение об ошибке, это не все равно, что положить файл в папку.
Есть 2 основных расширения для файловой системы iso, это: RockRidge и Joilet.
Это расширение файловой системы ISO 9660, разработанное для хранения файловых атрибутов, используемых в операционных системах POSIX(т.е Unix- совместимых).
Расширения Rock Ridge записываются поверх файловой системы ISO 9660 так, что оптический диск с Rock Ridge может быть прочитан программным обеспечением, рассчитанным на работу с ISO 9660.
Эти данные записываются в специальные каталоги, имена которых обычно скрываются.
Это расширение файловой системы ISO 9660, созданное для ослабления ограничений на имя файла, накладываемых в ISO 9660. Спецификация была разработана фирмой Microsoft и поддерживается всеми версиями ОС Microsoft Windows со времён Windows 95 и Windows NT 4.0.
По умолчанию используется на всех CD-ROM носителях с данными, выпущенных после 1995 года.
Большинство существующих программных платформ, включая Microsoft Windows, Linux, Mac OS X, и FreeBSD, способны читать носители информации с расширением файловой системы Joliet, что позволяет обмениваться файлами между этими операционными системами даже при использовании нелатинских алфавитов (таких как Арабский, Японский, Кириллица), что было невозможно при помощи обычного ISO 9660.
На самом деле, есть еще и 3 расширение для файловой системы iso, оно называется Romeo.
Это расширение ISO 9660 для MS Windows 95, информации по нему в интернете достаточно мало, и, вероятнее всего, это расширение больше нигде сейчас не используется.
Еще больше информации по расширениям и файловым системам для CD/DVD вы найдете тут [14], а сейчас давайте вернемся к нашей программе.
Получившийся код для кодирования информации из файла и помещения файлов с закодированной информацией в 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')
А я напоминаю, что полный код так же есть по ссылке на гитхаб [12]
Теперь давайте же перейдем к заключительной части — запишем наш получившийся iso на диск
Вы можете записывать чем хотите, я же воспользуюсь Nero 7 [15]
Использовать мы будем CD-R
А как же DVD?
Основное отличие от CD-R/RW заключается в объеме данных, которые можно записать на DVD-диск 4,7 ГБ против 650700 МБ. Некоторые форматы DVD поддерживают до 13 и даже 17 ГБ
Еще больше информации о дисках [16]
Как мы видим, программа успешно записалась на диск.
Теперь мы можем передать ее на диске тем людям, каким сами захотим.
Зачем нам все это было делать, если информацию нельзя раскодировать обратно, верно?
Если вас заинтересовал способ, можно написать программу, которая будет изымать и декодировать вложенные файлы, ей как раз таки и будут пользоваться «ваши люди».
И на этом все. Моей задачей было продемонстрировать один из возможных способов сокрытия информации, с использованием дисков, которые, казалось бы, канули в лету.
Буду рад увидеть ваши предложения, дополнения, исправления и другой feedback.
P.S. Хочу выразить особую благодарность @PavelMSTU [17] за консультации и мотивационные пинки.
Автор: 0xUL
Источник [18]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/python/315431
Ссылки в тексте:
[1] стеганографии в файловой системе: https://habr.com/ru/post/347604/
[2] iso9660: https://ru.wikipedia.org/wiki/ISO_9660
[3] еще: https://ru.wikipedia.org/wiki/%D0%9E%D0%B1%D1%80%D0%B0%D0%B7_%D0%BE%D0%BF%D1%82%D0%B8%D1%87%D0%B5%D1%81%D0%BA%D0%BE%D0%B3%D0%BE_%D0%B4%D0%B8%D1%81%D0%BA%D0%B0
[4] защиты от копирования.: http://www.wikiwand.com/ru/%D0%97%D0%B0%D1%89%D0%B8%D1%82%D0%B0_%D0%BE%D1%82_%D0%BD%D0%B5%D1%81%D0%B0%D0%BD%D0%BA%D1%86%D0%B8%D0%BE%D0%BD%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%BD%D0%BE%D0%B3%D0%BE_%D0%BA%D0%BE%D0%BF%D0%B8%D1%80%D0%BE%D0%B2%D0%B0%D0%BD%D0%B8%D1%8F
[5] здесь: https://studopedia.su/7_28832_faylovaya-sistema-ISO-.html
[6] здесь: https://ru.bmstu.wiki/ISO_9660
[7] здесь: http://perscom.ru/2012-03-09-17-36-49/77-cd-rom/435-iso-9660
[8] здесь: http://www.cdfs.com/cdfs-iso-primary.html
[9] 010editor: https://www.sweetscape.com/010editor/
[10] тут: https://www.cdroller.com/htm/readdata.html
[11] следующей: https://clalancette.github.io/pycdlib/
[12] мой репозиторий: https://github.com/ulmee/stegiso
[13] base64: https://ru.wikipedia.org/wiki/Base64
[14] тут: http://www.bog.pp.ru/work/cdfs.html
[15] Nero 7: https://ru.wikipedia.org/wiki/Nero
[16] Еще больше информации о дисках: http://old.ci.ru/inform09_04/p_22.htm
[17] @PavelMSTU: https://habr.com/ru/users/PavelMSTU/
[18] Источник: https://habr.com/ru/post/449016/?utm_campaign=449016
Нажмите здесь для печати.