Выяснить содержание байтов - PullRequest
0 голосов
/ 13 ноября 2018

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

b'\x00\x00\x00\x00\x00\x00\x00\x00\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x0bz\xcc\xc9\xc8\xc0\xc0\x00\xc2?\x82\x1e<\x0ec\xbc*8\x19\xc8i\xb3W_\x0b\x14bH\x00\xb2-\x99\x18\x18\xfe\x03\x01\x88\xcf\xc0\x01\xc4\xe1\x0c\xf9\x0cE\x0c\xd9\x0c\xc5\x0c\xa9\x0c%\x0c\x86`\xcd \x0c\x020\x1a\x00\x00\x00\xff\xff\x02\x080\x00\x96L~\x89W\x00\x00\x00\x00\x80(\\B\xefI;\x9e}p\xfe\x1a\xb2\x9b>(\x81\x86/=\xc9xH0:Pwb\xb7\xdck-\xd2F\x04\xd7co'

1 Ответ

0 голосов
/ 27 ноября 2018

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

Так что же такое подпись ?

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

  • Волшебное число файла : байты в файле, используемые для идентификации формат файла; как правило, короткая последовательность байтов (большинство Длиной 2-4 байта) помещается в начало файла; см. список файла подписи

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

Я использовал магическое число , чтобы определить термин магического числа, который я копирую из Википедии

В компьютерном программировании термин магическое число имеет несколько значения. Это может относиться к одному или нескольким из следующих:

  • Уникальные значения с необъяснимым значением или множественные вхождения, которые (предпочтительно) можно заменить именованными константами
  • Постоянное числовое или текстовое значение, используемое для идентификации формата файла или протокола; для файлов, см. Список файлов подписи
  • Отличительные уникальные значения, которые вряд ли будут приняты за другие значения (например, Глобально уникальные идентификаторы )

во второй точке это определенная последовательность байтов, подобная

PNG (89 50 4E 47 0D 0A 1A 0A) 

или

BMP (42 4D)

Итак как узнать магический номер каждого файла?

в этой статье « Исследование сигнатур файлов с помощью PowerShell » мы обнаружили, что автор создал замечательную функцию Power Shell для получения магического числа, также он упомянул инструмент, и я копирую это из его статьи

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

форма Format-Hex help Я копирую это описание

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

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

этот инструмент очень хорош также для получения магического номера файла. Вот пример enter image description here

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

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

  1. Подпись файла
  2. ТАБЛИЦА ПОДПИСЕЙ ФАЙЛОВ
  3. Список подписей файлов

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

enter image description here

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

Я столкнулся с этим и решил, протестировав потоки с определенными типами подписей. Как PNG я искал в потоке

def GetPngStartingOffset(arr):

    #targted magic Number for png (89 50 4E 47 0D 0A 1A 0A)
    markerFound = False
    startingOffset = 0
    previousValue = 0
    arraylength = range(0, len(arr) -1) 

    for i in arraylength:
        currentValue = arr[i]
        if (currentValue == 137):   # 0x89  
            markerFound = True
            startingOffset = i
            previousValue = currentValue
            continue

        if currentValue == 80:  # 0x50
            if (markerFound and (previousValue == 137)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 78:   # 0x4E
            if (markerFound and (previousValue == 80)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 71:   # 0x47
            if (markerFound and (previousValue == 78)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 13:   # 0x0D
            if (markerFound and (previousValue == 71)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 10:   # 0x0A
            if (markerFound and (previousValue == 26)):
                return startingOffset
            if (markerFound and (previousValue == 13)):
                previousValue = currentValue
                continue
            markerFound = False

        elif currentValue == 26:   # 0x1A
            if (markerFound and (previousValue == 10)):
                previousValue = currentValue
                continue
            markerFound = False
    return 0

Как только эта функция нашла магическое число enter image description here

Я разделил поток и сохранил файл png

    arr = stream.read()
    a = list(arr)
    B = a[GetPngStartingOffset(a):len(a)]
    bytesString = bytes(B)
    image = Image.open(io.BytesIO(bytesString))
    image.show()

В конце это несквозное решение, но это способ выяснить содержание потоков Спасибо за чтение и Спасибо за @Robert Columbia за его терпение

...