微软恶意软件分类数据集:
Microsoft Malware Classification Challenge (BIG 2015)
数据集中,每个样本包含.asm
和.bytes
文件,.bytes 文件即为恶意软件的 .text
部分的二进制代码片段,此处只将 .bytes文件转化为灰度图像进行分析。
该数据集中的恶意软件家族分类为:
- Ramnit
- Lollipop
- Kelihos_ver3
- Vundo
- Simda
- Tracur
- Kelihos_ver1
- Obfuscator.ACY
- Gatak
def bytes_to_img(path):
if os.path.isdir(path):
files = [file for file in os.listdir(path) if file.endswith('.bytes')]
os.makedirs(os.path.join(path, 'imgs'), exist_ok=True)
else:
files = [os.path.basename(path)]
path = os.path.dirname(path)
# 创建分类文件夹
family = ['Ramnit', 'Lollipop', 'Kelihos_ver3', 'Vundo', 'Simda', 'Tracur', 'Kelihos_ver1', 'Obfuscator.ACY',
'Gatak']
for i in family:
os.makedirs(os.path.join(path, 'imgs', i), exist_ok=True)
labels_path = os.path.join(path, 'trainLabels.csv')
assert os.path.exists(labels_path), "标签不存在!"
labels = pd.read_csv(labels_path)
for file in files:
file_name, _ = file.split('.')
with open(os.path.join(path, file), mode='rb') as bytes:
img = list()
for bytes_line in bytes.readlines():
a = [byte for byte in bytes_line.decode('ascii').strip('\r\n').encode('ascii')]
img += a
# 读取标签
label = labels.loc[labels['Id']==file_name]['Class']
img += [0 for _ in range(0 if len(img) % 1024 == 0 else 1024 - len(img) % 1024)]
# 设置灰度图的宽度为1024
assert not len(img) % 1024, "img未对齐至1024!"
img_path = os.path.join(path, 'imgs', family[label.values[0]-1], file_name) + '.png'
Image.fromarray(np.uint8(img).reshape(-1, 1024)).save(img_path)
print(f'save {img_path}')
运行状态如图所示:
之所以将不同恶意软件家族转化为灰度图后分别用不同的文件夹存储,一方面是方便标记类别,其次是可使用 torchvision.datasets.ImageFolder
直接进行处理。
.bytes文件转化为灰度图后如图所示: