将可执行字节流可视化为图像文件,为什么它旋转45度?

问题描述 投票:2回答:1

我正在尝试可视化恶意软件可执行文件以测试可视化分类方法。使用Microsoft恶意软件分类Challange dataset .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

您可以在here中找到示例文件。我希望输出是.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文件中的序列相同。

Converted image

我不太清楚图像文件类型,并使用注释行将numpy数组旋转45度;由于旋转,我得到了六边形的图片。如你看到的:

Rotated and converted image

是否有任何方法(最好是有效的)使图像可以在与原始字节顺序相同的行中看到哪些图案?

附:上传的图片是.png,因为它不接受.bmp文件。

python numpy python-imageio
1个回答
2
投票

我认为这句话:

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))
© www.soinside.com 2019 - 2024. All rights reserved.