Визуализация исполняемого потока байтов в файл изображения, почему он повернут на 45 градусов?

Я пытаюсь визуализировать исполняемые файлы вредоносных программ для тестирования подхода визуальной классификации. Использование Microsoft Malware Classification Challenge набор данных .bytes. У меня есть такие входные данные:

00401000 56 8D 44 24 08 50 8B F1 E8 1C 1B 00 00 C7 06 08
00401010 BB 42 00 8B C6 5E C2 04 00 CC CC CC CC CC CC CC
00401020 C7 01 08 BB 42 00 E9 26 1C 00 00 CC CC CC CC CC
00401030 56 8B F1 C7 06 08 BB 42 00 E8 13 1C 00 00 F6 44
00401040 24 08 01 74 09 56 E8 6C 1E 00 00 83 C4 04 8B C6
00401050 5E C2 04 00 CC CC CC CC CC CC CC CC CC CC CC CC
00401060 8B 44 24 08 8A 08 8B 54 24 04 88 0A C3 CC CC CC
00401070 8B 44 24 04 8D 50 01 8A 08 40 84 C9 75 F9 2B C2
00401080 C3 CC CC CC CC CC CC CC CC CC CC CC CC CC CC CC
00401090 8B 44 24 10 8B 4C 24 0C 8B 54 24 08 56 8B 74 24
004010A0 08 50 51 52 56 E8 18 1E 00 00 83 C4 10 8B C6 5E

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

import imageio
import numpy as np

from binascii import unhexlify
from scipy import ndimage

bytes_dir = '.\dataSample'
images_dir = '.\imageData'
undecodedByte = '00'
def bytes2png(f, height, width):
    file = bytes_dir + '\\' + f

    b_data = b''
    for line in open(file, 'r'):
        for byte in line.rstrip()[8:].split():
            if (byte == '??'): byte = undecodedByte
            b_data += binascii.unhexlify(byte)

    image_buffer = np.zeros((height, width)).astype(np.ubyte)
    for i in range(height):
        for j in range(width):
            image_buffer[i,j] = b_data[i+j]

    # Naming image
    image_name = images_dir + '\\' + f.split('.')[0] + str(height) + "x" + \
        str(width) + '.bmp'
    # image_buffer = ndimage.rotate(image_buffer, -45.0, reshape=False, prefilter=False)
    imageio.imwrite(image_name, image_buffer)

Я успешно извлекаю байты и записываю их в законный файл .bmp, но он повернут на 45 градусов. Когда я открыл его в шестнадцатеричном редакторе и сравнил с исходным файлом, я увидел, что он имеет ту же последовательность, что и в файле .bytes.

Преобразованное изображение

Я плохо знаю типы файлов изображений и тогда использовал закомментированную строку для поворота массива numpy на 45 градусов; Я получаю изображение в форме шестиугольника из-за вращения. Как вы видете:

Повернутое и преобразованное изображение

Есть ли способ (желательно эффективный) создавать изображения, шаблоны которых можно увидеть в той же строке, что и в исходном порядке байтов?

P.S. загруженные изображения имеют формат .png, потому что он не принимает файлы .bmp.


person Kerim Can Kalıpcıoğlu    schedule 21.02.2019    source источник


Ответы (1)


Я думаю, что строка:

image_buffer[i,j] = b_data[i+j]

должно быть:

image_buffer[i,j] = b_data[(i*width)+j]

У меня нет ни ваших данных для тестирования, ни операторов import, которыми вы по какой-то причине не поделились, но я подозреваю, что весь двойной цикл for, копирующий байты из вашего b_data в массив Numpy, можно избежать с помощью чего-то вроде:

image_buffer = np.frombuffer(b_data, dtype=np.uint8).reshape((height,width))
person Mark Setchell    schedule 21.02.2019
comment
Обновлено соответственно. - person Kerim Can Kalıpcıoğlu; 21.02.2019