接到一个任务,将攻击转移矩阵进行可视化,生成攻击转移概率图,便尝试用python实现一下。

查阅资料,看大家都在用networkx和matplotlib进行可视化,便边学边做,记录一下学习笔记。

任务:将手里了多个攻击过程,如图1所示,生成为攻击转移模型,如图2所示

图1:

图2:

由于直接画图节点过多,于是对节点进行了映射。

过程

首先读取文件并以列表的形式表示:

  1. f1 = open(path,'r')
  2. list_lines = []
  3. while True:
  4. line = f1.readline()
  5. if line:
  6. list_line = line[0:-1].split(',')#去掉回车符'\n'
  7. list_lines.append(list_line)
  8. else:
  9. break

然后读取映射文件,用字典存储,方便后面的映射:

其格式如图

  1. #读取对应文件
  2. fk = open('./killlinesort.txt','r')
  3. dict_kill = {}
  4. while True:
  5. linek = fk.readline()
  6. if linek:
  7. spilt_line = linek.split(' level')
  8. dict_kill[spilt_line[0]] = spilt_line[1].split(',')[1][0:-1]
  9. else:
  10. break

现在初始化转移矩阵并统计转移次数,最终得到转移概率矩阵,这一步便开始进行映射

  1. attack = []
  2. for key in dict_kill:
  3. if dict_kill[key] not in attack:
  4. attack.append(dict_kill[key])
  5. Matrix_tmp = pd.DataFrame(0, columns=attack, index=attack)
  1. #计算转移次数
    for i in list_lines: #读取攻击过程
    for index in range(len(i)-1):
    fT = dict_kill[i[index]]
    nT = dict_kill[i[index+1]]
    if fT == nT:
    continue
    else:
    Matrix_tmp[nT][fT] = Matrix_tmp[nT][fT] + 1
    Matrix_P = Matrix_tmp.div((Matrix_tmp.apply(sum,axis=1)),axis=0).fillna(0)#计算转移概率

由于我的映射文件中的攻击名称比,要分析的那几个攻击过程中的攻击名称多,,有些节点之间没有关系,所以要去掉孤立的节点

  1. #去掉孤立的节点
  2. attack1 = []
  3. for i in attack:
  4. row = Matrix_P.loc[:,i].values[0:]
  5. columns1 = Matrix_P.loc[i,:].values[0:]
  6. if sum(row) == 0 and sum(columns1) == 0:
  7. continue
  8. else:
  9. attack1.append(i)#其中是映射完并去掉孤立节点以后的攻击节点

为了方便接下来节点与边进行对应,并且存储转移概率,用字典进行存储源节点,目的节点,概率

  1. #将转移概率矩阵转换成三元组用字典存储
  2. dict_tup = {}
  3. final_attack = []#最后一步攻击
  4. for fattack in attack1: # lines是行名也是源节点
  5. Max_P_Array = Matrix_P.loc[fattack].values[0:]
  6. if sum(Max_P_Array) == 0:
  7. final_attack.append(fattack)#记录下每个攻击过程的最后一步攻击,作为广度优先遍历的起始点
  8. col_list = Matrix_P.columns.values.tolist()
  9. count = 0
  10. for values in Max_P_Array:
  11. if values <= 0:#筛选边
  12. count += 1
  13. continue
  14. else:
  15. columns = col_list[count]#目的节点
  16. count += 1
  17. key = fattack + ',' + columns#结构为{‘源攻击节点,目的攻击节点’:转移概率}
  18. dict_tup[key] = values

通过上述的数据处理和简单的分析,得到需要的三元组,接下来将三元组进行可视化

可视化

在可视化的任务中,由于边和点的数量比较多,在尝试了自带的几种布局之后效果很差,于是决定自己定位每个节点的位置

通过不断不断不断不断不断的尝试,根据攻击过程多步转移的特点,最终采用广度优先遍历节点,为节点在图中安放位置,将每轮遍历的节点放在同一层

  1. #遍历有所节点
  2. def findallnode(node_list,Matrix_P,pos_num):
  3. before_nodes = []#上一步的攻击节点
  4. row_num = 1
  5. pos_count = 1
  6. for n in node_list:
  7. tran_p = Matrix_P.loc[:,n].values[0:]
  8. count = 0
  9. for i in tran_p:
  10. if i <= 0:
  11. count += 1
  12. continue
  13. else:
  14. before = attack[count]
  15. count += 1
  16. if not before in G.nodes:
  17. before_nodes.append(before)
  18. G.add_node(before,pos = (pos_count*5,(pos_num*5+((-1)**row_num)*3)))
  19. #pos的位置可以认为是一个坐标,同层节点之间间隔5,由于有些同层节点之间也有关系,担心重合遮挡,所以y轴坐标进行错位
  20. row_num += 1
  21. pos_count += 1
  22. pos_num += 1
  23. #进行迭代,直到所有的节点都被遍历,G.node的类型是list
  24. if (len(list(set(attack1)-set(G.nodes))) != 0):
  25. findallnode(before_nodes, Matrix_P, pos_num)
  26.  
  27. num = 1
    #确定初始参数
  28. for i in final_attack:
  29. G.add_node(i,pos = (num*10,0))
  30. num+=1
  31. findallnode(final_attack,Matrix_P,pos_num=1)

确定完节点位置之后将边添加进去,对之前生成的字典进行遍历,为每个边添加概率值

  1. #添加有向边
  2. for key in dict_tup:
  3. value = round(dict_tup[key],3)
  4. #print(value)
  5. list_key = key.split(',')
  6. list_key.append(value)
  7. tup = tuple(list_key)#得到三元组
  8. G.add_edge(str(tup[0]),str(tup[1]),p=tup[2])
  1. pos=nx.get_node_attributes(G,'pos')#这个函数能一字典的形式存储每个节点的坐标
  1. #pos结果为
  2. {'DOWNLOAD FILE': (10, 0), 'keep connect': (20, 0), 'DIRECTORY discovery': (5, 2), 'FILE OPERATION': (10, 8), 'Password attacks': (15, 2),
    'Vulnerability exploit': (20, 8), 'Initial Access': (25, 2), 'UPLOAD FILE': (30, 8), 'WEBSHELL': (35, 2), 'DDOS': (5, 7), 'Command and Control': (10, 13),
    'INFORMATION DISCLOSURE': (15, 7), 'ERROR OCCUR': (5, 12), '.': (0, 0)}

接着就是作图,将节点和边都画出来

  1. nx.draw_networkx_nodes(G, pos, node_size=50, node_color='gray')#将节点画出,各个参数可以查询关方文档,选择需要的
  2. nx.draw_networkx_edges(G, pos, width=1.5,arrowstyle='->',arrowsize=10,alpha=0.5,)#画出边
  3. nx.draw_networkx_edge_labels(G,pos,label_pos=0.35,font_size=5,font_weight='bold')#label_pos是转移概率在边上的位置,font_weightbold为加粗,默认是正常

由于文字比较多,无法在节点中展示,所以在节点上面进行展示

  1. #由于pos中的坐标是以元组的形式展示,而元组不能修改,所以先转成list再进行替换
  2. for key in pos:
  3. list_loc = list(pos[key])
  4. list_loc[1] += .7#上移的值,根据实际情况修改
  5. pos[key] = tuple(list_loc)
  6. nx.draw_networkx_labels(G,pos,font_size=8,alpha=0.8)#画出攻击类型名称

最后,生成文件

  1. #plt.show()#show()和savefig不能同时存在,不然生成的文件是白板
  2.  
  3. plt.savefig('./****.png',pad_inches=20,dpi=300)#具体参数可以上网查询

-----------------------------------------------------------------------------------------------------------------------------------------

参考资料

https://zhuanlan.zhihu.com/p/36700425

https://www.osgeo.cn/networkx/auto_examples/drawing/plot_weighted_graph.html#sphx-glr-auto-examples-drawing-plot-weighted-graph-py

 

networkx学习与攻击转移图可视化的更多相关文章

  1. UML学习笔记:活动图

    UML学习笔记:活动图 活动图 活动图是UML中描述系统动态行为的图之一,用于展现参与行为的类的活动或动作.在UML里,活动图很类似于流程图,但是有一些区别: 活动图着重表现系统行为,描述对象活动的顺 ...

  2. CNN可视化技术总结(一)--特征图可视化

    导言: 在CV很多方向所谓改进模型,改进网络,都是在按照人的主观思想在改进,常常在说CNN的本质是提取特征,但并不知道它提取了什么特征,哪些区域对于识别真正起作用,也不知道网络是根据什么得出了分类结果 ...

  3. WebGL学习之纹理贴图

    为了使图形能获得接近于真实物体的材质效果,一般会使用贴图,贴图类型主要包括两种:漫反射贴图和镜面高光贴图.其中漫反射贴图可以同时实现漫反射光和环境光的效果. 实际效果请看demo:纹理贴图 2D纹理 ...

  4. GIS案例学习笔记-三维生成和可视化表达

    GIS案例学习笔记-三维生成和可视化表达 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 目的:针对栅格或者矢量数值型数据,进行三维可视化表达 操作时间:15分钟 案 ...

  5. GIS案例学习笔记-ArcGIS整图大图出图实例教程

    GIS案例学习笔记-ArcGIS整图大图出图实例教程 联系方式:谢老师,135-4855-4328,xiexiaokui#qq.com 1. 通过出图比例尺(1:2000),地图范围测算图纸大小. 图 ...

  6. 【精选】Jupyter Notebooks里的TensorFlow图可视化

    [精选]Jupyter Notebooks里的TensorFlow图可视化   https://mp.weixin.qq.com/s?src=11&timestamp=1503060682&a ...

  7. Keras中间层输出的两种方式,即特征图可视化

    训练好的模型,想要输入中间层的特征图,有两种方式: 1. 通过model.get_layer的方式.创建新的模型,输出为你要的层的名字. 创建模型,debug状态可以看到模型中,base_model/ ...

  8. WebGL学习之法线贴图

    实际效果请看demo:纹理贴图 为了增加额外细节,提升真实感,我们使用了漫反射贴图和高光贴图,它们都是向三角形进行附加纹理.但是从光的视角来看是表面法线向量使表面被视为平坦光滑的表面.以光照算法的视角 ...

  9. javascript学习的思维导图

    今天逛师父的博客园,发现了好东西~~~~我给偷过来了~~~那就是javascript学习的思维导图,比自己整理更快速. 思维导图小tips: 思维导图又叫心智图,是表达发射性思维的有效的图形思维工具 ...

随机推荐

  1. Journal of Proteome Research | Down-Regulation of a Male-Specific H3K4 Demethylase, KDM5D, Impairs Cardiomyocyte Differentiation (男性特有的H3K4脱甲基酶基因(KDM5D)下调会损伤心肌细胞分化) | (解读人:徐宁)

    文献名:Down-Regulation of a Male-Specific H3K4 Demethylase, KDM5D, Impairs Cardiomyocyte Differentiatio ...

  2. hbase 面试问题汇总

    一.Hbase的六大特点: (1).表大:一个表可以有数亿行,上百万列. (2).无模式:每行都有一个可排序的主键和任意多的列,列可以根据需要动态增加,同一个表中的不同行的可以有截然不同的列. (3) ...

  3. The import org.springframework cannot be resolved

    刚开始学spring框架时import org.springframework.context.support.ClassPathXmlApplicationContext;报错 我建的是maven项 ...

  4. windows10环境下QtCreator中出现skipping incompatible xxx when searching for xxx 问题解决办法

    windows10环境下QtCreator中出现skipping incompatible xxx when searching for xxx 我再QtCreator中想导入一个外部库时,他提示不匹 ...

  5. mongodb_2

    一.游标 在mongodb中,底层使用js引擎进行各种操作,所以我们在命令行窗口,可直接执行js代码. #使用for循环,插入1000条数据. > for (var i=0;i<1000; ...

  6. Golang校招简历项目-简单的分布式缓存

    前言 前段时间,校招投了golang岗位,但是没什么好的项目往简历上写,于是参考了许多网上资料,做了一个简单的分布式缓存项目. 现在闲下来了,打算整理下. github项目地址:https://git ...

  7. Spring Boot熟稔于心的20个常识

    1.什么是 Spring Boot? Spring Boot 是 Spring 开源组织下的子项目,是 Spring 组件一站式解决方案,主要是简化了使用 Spring 的难度,简省了繁重的配置,提供 ...

  8. python—time模块

    timetime模块提供各种时间相关的功能,与时间相关的模块有:time,datetime,calendar等. 时间有三种表示方式,一种是时间戳.一种是格式化时间.一种是时间元组.时间戳和格式化时间 ...

  9. Unity 游戏框架搭建 2019 (二十一、二十二) 第三章简介&整理前的准备

    整理前的准备 到目前为止,我们积攒了很多示例了,并且每个示例也都贯彻了最的约定和规则. 在上一篇的小结也说了一个比较新的东西:编程体验优化. 在之前我们还积攒了一个问题:代码重复问题. 我们可是忍住整 ...

  10. 实验七 MySQL语言结构

    实验七 MySQL语言结构 一.  实验内容: 1. 常量的使用 2. 变量的使用 3. 运算符的使用 4. 系统函数的使用 二.  实验项目:员工管理数据库 用于企业管理的员工管理数据库,数据库名为 ...