【恶意代码与软件安全分析】(六)
因为虚拟机崩溃的原因停了很多周,折腾了好久后直接使用VMware,情况就好起来了。然后就赶上了任务量特别多的几周,昨天刚打完比赛回来就开会加实验,每个周末都是爆肝,呜呜。
【本章内容】Visualization of Malware Detection
这一章的内容几乎都在于对数据样本的可视化处理,相对来说东西比较多,但还是比较简单的。
(一)Matplotlib模块——plot()函数
参考matplotlib散点图自定义和plot函数参数列表
plot 函数位于 matplotlib.pyplot 这个模块中,是绘制图形的主要函数。plot 函数可以接收多组 X 轴、Y 轴数据进行绘图,也可以控制曲线的格式等等。
plot(x,y,linestyle,linewidth,
color,marker,markersize,
markeredgecolor,label,alpha)
plt.legend() #虽然 plot() 函数提供了图例标签信息,但需要配合 legend() 才能显示。
plt.show()
各种参数设置
- x:线图x轴数据。
- y:线图y轴数据。
- linestype:线条类型。 实线-(默认),双划线–,虚线:,点划线:.。
- linewidth:线条宽度。
- color:颜色。红色r,绿色g,蓝色b,黄色y,黑色k,白色w。
- marker:可以为线图添加散点,该参数指定点的形状。
- markersize:指定点的大小。
- markeredgecolor:指定点的边框色。
- label:图例标签。
- alpha:不透明度(值为“0”时为透明状态,默认为“1”)
此外,还可以指定图例的样式
颜色:红色r,绿色g,蓝色b,黄色y,黑色k,白色w。
标记符:加号符+,空心圆o,星号*,实心圆.,叉号符x,正方形s,菱形d,上三角^,下三角v,右三角形>,左三角形<,五角星p,六边形h。
比如标颜色和标记符的组合:
如‘ro’、‘r+’、‘bo’、'b+'等
(二)Seabon模块——countplot()函数
countplot()函数:countplot是seaborn库中分类图的一种,使用计数图(柱状图)显示每个分类数据中的数量统计
seaborn.countplot(x=None, y=None, hue=None,
data=None, order=None, hue_order=None,
orient=None, color=None, palette=None,
saturation=0.75, dodge=True, ax=None, **kwargs)
countplot可以通过hue参数分类别显示数据
(三)Seabon模块——relplot()函数
用relplot函数可以绘制散点图
seaborn.relplot(x=None, y=None, hue=None,
size=None, style=None, data=None)
各种参数设置:
- x,y : 指定X轴和Y轴位置的变量 (如果使用pandas 数据表格,可选择列名)。
- data:输入要分析的数据。
- hue:分组变量,将产生不同颜色的元素。
- size:分组变量,将产生大小不同的元素。
(四)Seabon模块——distplot()函数
用distplot函数可以绘制直方图
seaborn.distplot(a, bins=None, hist=True, kde=True, rug=False, fit=None, ...)
实验部分
终于到quiz部分了,本章一共有有3个quiz,每个quiz都是依据一定的数据样本进行绘图。
题目一
请通过Matplotlib画出一个散点图,给出MiniData数据集,Benignware和Malware分别的PE Section Name出现的次数。图的X轴为不同的PE Section Name,图的Y轴为该Name分别在Benignware和Malware中出现的次数。Benignware和Malware要使用的不同的图例
实验过程
首先我们先分析上次实验由MinData跑出的样本集practice3.csv
这个数据集中,还没有对不同文件的section name的次数进行统计,于是我们再分析另一个数据集practice4.csv
很明显,这个数据集可以直接用来绘图显示了
#在这之前,还要将sectionname进行处理,去掉后面的冗余串
#string=section.Name.decode('UTF-8', 'ignore').strip().strip(b'\x00'.decode());
x1=list(s_b.keys())
x1=list(map(str,x1))
y1=list(s_b.values())
x2=list(s_m.keys())
x2=list(map(str,x2))
y2=list(s_m.values())
pyplot.plot(x1, y1,'rv',label='Benign',markersize=6, alpha=0.5)
pyplot.plot(x2, y2,'bo',label='Mal',markersize=6, alpha=1)
pyplot.legend(framealpha=1, markerscale=1.0)
pyplot.title("numbers of PE section name in Benignware and Malware")
pyplot.show()
结果绘图如下,使用圆点和下三角两种不同的图例:
题目二
(1)请通过seaborn画出一个countplot图,给出MiniData数据集中,Benignware和Malware分别的PE SectionName出现的次数。图的X轴为不同的PE Section Name,图的Y轴为该Name分别在Benignware和Malware中出现的次数.Benignware和Malware要使用的不同的颜色表示
(2)针对minidata数据,生成一个dataframe,colume为Name,Type, SectionCount,FileSize,使用seaborn的relplot画出SectionCount和FileSize的关系,通过颜色来区分不同Type的数据(Type分为benignware和malware)
实验过程
(1)首先是用counplot函数,这次则对样本集practice3.csv进行绘图。用sectionname作为x轴,用type作为分类数据。
import pandas
from matplotlib import pyplot
import seaborn as sns
data = pandas.read_csv('practice3.csv')
sns.countplot(x='sectionname',hue='type', data=data)
pyplot.title('numbers of PE section name in Benignware and Malware',fontsize=14)
pyplot.show()
结果如图:
(2)根据题意我们知道,要生成的dataframe其实就是样本集practice4.csv,于是我们可直接绘图
#!/usr/bin/python3
import numpy as np
import pandas
from matplotlib import pyplot
import seaborn as sns
data = pandas.read_csv('practice4.csv')
sns.relplot(x='filesize',y='sectioncount',hue='type',data=data)
pyplot.legend('log')
pyplot.savefig("chap2.png")
pyplot.show()
散点图结果
当将类型更改为线图后:
sns.relplot(x='filesize',y='sectioncount',hue='type',kind='line',data=data)
插曲:在这一步时出现使用show()后不能显示图的问题,挣扎好久后去求助了老师,老师告诉我可以在show之前使用savefig()将图直接保存在本地,然后直接把问题解决了,太感谢yw了!
题目三
针对data数据,生成一个dataframe,colume为Name,Type, SectionCount,FileSize,通过seaborn的FacetGrid针对不同type画出每种type下的FileSize的distplot
实验过程
有了前两次quiz的经验后,我们这次依然快刀斩乱麻——直接上手写代码画图。
import pefile
import pylab
import numpy as np
import pandas
from matplotlib import pyplot
import seaborn as sns
data=pandas.read_csv('practice4.csv')
g=sns.FacetGrid(data, col="type")
g.map(sns.histplot, "filesize")
pyplot.savefig("chap3.png")
pyplot.show()
实验总结
这章的内容难点主要在于上一章使用机器学习对数据分析生成样本集,如果无法生成practice3.csv和practice4.csv,那么这几个实验根本无从下手,虽然这些部分的代码暂时还没有看懂,但咱们相信总会有时间看的!加油芜湖!
这次的quiz来说就是一些画图,套用一些函数,填上相应的参数,就直接完成了,总体难度还是比较简单。
另外另外,真的特别感谢这两天一直在回答我各种各样奇怪问题的黄姐!黄姐实在是太好了!😭😭😭