Работа с байтами с помощью Python | Стеганография

Python чрезвычайно универсален. Каждый день меня поражает программа или пакет, созданный с использованием python. Я использовал его для множества разных вещей, но когда-либо работал с данными файла в байтах. Хотя это правда, что я использовал сетевые снифферы, такие как scapy и sockets, я никогда не манипулировал данными и даже не смотрел на них. если и сделал, то это было в wirehark.

Я буду использовать Python 3.6 на Mac.

В этой статье я хочу найти скрытые данные внутри файла. Это пример стеганографии. Я буду использовать только собственные пакеты, такие как Regex (не идеально, но это то, что я знаю).

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

Файл выглядит так:

Затем мы читаем файл в Python:

Это первое, что отличается. Обратите внимание на флаг "rb+”. Буква «b» указывает Python ожидать байтов.

Теперь давайте посмотрим на данные, которые мы только что прочитали.

Вы смотрите на первые десять байтов файла png. Если сравнить с тем, как выглядит стандартный файл png, это выглядит правильно.

На первый взгляд, в этом нет ничего странного, но мы знаем, что есть скрытый файл. Итак, мы составляем список общих идентификаторов файлов (в байтах).

Снова обратите внимание на флаг «b».

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

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

Кажется, что скрытый файл - это файл «pk». Это означает, что файл представляет собой сжатый файл или файл .zip.

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

Я не совсем уверен, что такое b’x17j’. Похоже на шестнадцатеричный, но я не уверен, откуда взялось j.

Исследовательская работа

Что ж, это шестнадцатеричный. Python пытается перевести шестнадцатеричную строку в символы ascii. Итак, лучший способ узнать данные - использовать метод hexlify binascii. Это позволяет распечатать шестнадцатеричные данные как есть.

Теперь мой код выглядит так:

50 соответствует «ПК». Теперь, когда это исправлено, я могу использовать смещение заголовка, чтобы определить размер файла. На странице википедии есть диаграмма файловой структуры.



Смещение составляет 18 байтов и составляет 4 байта. Распечатывая результаты, я получаю:

b’c727df7a’

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

После этого все, что мне нужно сделать, это записать байты в файл с расширением .zip… теоретически. Но это уже другая статья, так что я оставлю эту здесь. Если у вас есть предложения или исправления, не стесняйтесь комментировать.

Вера Уорри

github: https://github.com/Vworri

сайт: vworri.github.io