将恶意代码或良性代码转换为灰度
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" 块。
如何将二进制代码转换为灰度图像?
最近我看到恶意软件被转换为图像。 恶意软件二进制 -> 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" 块。