将恶意代码或良性代码转换为灰度

Converting Malware Code or Benign Code to Gray Scale

如何将二进制代码转换为灰度图像?

最近我看到恶意软件被转换为图像。 恶意软件二进制 -> 8 位矢量 -> 灰度图像。 我对这个图像转换知之甚少。如何做到这一点?

从您链接的幻灯片来看,它们实际上只是将可执行文件的字节视为灰度图像数据,每个像素一个字节,黑色=0.

对于较小的文件,他们使用较窄的宽度(例如 32 像素宽),或者对于较大的文件使用较大的宽度,因此您总是会得到一个高的图像。

这很容易做到,例如PGM-binary (P5) image format 有一个非常简短的文本 header,然后是二进制数据。 header 也必须指定高度,因此您必须根据选择的宽度和文件大小来计算高度。

例如shell 脚本的快速破解:

#!/bin/bash
# args: filename  [width]
# writes to stdout, redirect to a file

fn=
width=${2:-32}   # default width=32 if there's no 2nd arg

size=$(stat -c %s "$fn")
echo -e "P5\n$width $((size/width))\n255"   # header
cat "$fn"

gcc 在 15kiB a.out 上的输出是这样的,我可以使用任何理解 PNG 图像的图像查看器查看(并放大)。例如qiv, geeqie, gwenview.

P5              (grayscale, binary version)
32 449          (width height)
255             (max grayscale value)
^?ELF^B^A^A...

例如./stick-in-pgm.sh a.out 64 > a.out.64.pgm 正确使用 width=64 并根据文件大小计算出 height=224。

显然大多数 PGM-reading 程序不关心确切的文件大小是否为完整的行数,但如果高度太大,它们会抱怨文件 "ends early"。 (所以你不能只是echo 32 10000。)用宽度除以尺寸得到的高度让他们不会抱怨;我不需要使用 dd 将输出填充到完整数量的 32 字节 "row" 块。