【寒假作業三】——高級代碼拼接工人的養成(改)


寒假作業二——高級代碼技工的養成

什么樣的CSDN孕育
什么樣的碼農
碼農:我們不生產代碼
我們只是CSDN的搬運工

Github 鏈接

戳我

對完成本次任務的初步預估

完成,這輩子是不可能完成的。 ——人類精神領袖竊格瓦拉

學習的語言

  • python(pythonyyds)
  • html(沒有用到,但還是有了解一點)

算法

  • 在對題目要求的每k流量的處理時,我采用了這樣的做法
  • flow_relation_bag_total_sum[cnt_flow//1000+1]=cnt_bags

遇到的困難與解決方式

遇到的困難

  • 太多了(不會抓包,抓包的時候被各種博客卡脖子,網絡知識零基礎,pyecharts調位置參數)

解決的方式

  • 問小白馬
  • 默念小白馬
  • 再問問小白馬
  • B站,csdn ,奔向大佬的懷抱

學習資源

畫圖模板(flask)

from flask import Flask

from jinja2 import Markup
from pyecharts import options as opts
from pyecharts.charts import Bar,Grid,Pie,Line
app = Flask(__name__, static_folder="templates")
def grid_base() -> Grid():

     return "要返回的圖表類型"
@app.route("/")
def index():
  c = grid_base()#調用函數並接收圖表
  return Markup(c.render_embed())


#控制中心
if __name__ == "__main__":
  app.run(port=60)

折線圖模板

  折線圖變量名 = (
    Line()
    .add_xaxis(x軸列表)
    .add_yaxis(
        series_name="系列名字",
        y_axis=y軸列表,
        )
  )

雙y軸一直搞不出來。。

總結以及實際用時

  • 做前撫膺嘆息,做時勝似蹲監,做完感覺良好,
  • 自閉一個禮拜(調節:觀看《山海情》)
  • 啟動三天
  • 畫畫四天(摸魚)

假裝自己是老板

  • 問:如果你是競爭對手,能否找到其他進攻方式繞開該規則,或者通過其他網絡手段有效打擊對手?(請勿模仿)
  • 答:定期更改自己發送時用的源地址(不包括端口)或源地址端口
  • 問:這些懶懶的技術人員制定的判定規則會出現的問題有哪些?
  • 答:可能把正常的地址也標記成異常了(就好像一款殺毒軟件對檢測到的東西全標記為進行攻擊,或者像輻射把正常細胞也當成癌細胞進行攻擊)
  • 問:評估自己的系統的處理效率
  • 答:感覺良好
  • 問:老板某日在想桃子:我xxx有一個夢想,建成世界一流 news app!能夠為世界上每個網民提供吃瓜服務。請從多個方向考慮該系統需要改進的地方還有哪些?(數據量,效率,安全性等等)
  • 答:讓子彈飛會

代碼

# Author:Hugh

# -*- codeing = utf-8 -*-

# @Time : 2021/2/4 15:17
# @Author : Hugh
# @File : 寒假作業2.py
# @Software: PyCharm
from scapy.all import *
import re

from flask import Flask
from jinja2 import Markup
from pyecharts import options as opts
from pyecharts.charts import Bar,Grid,Pie,Line

#假控制台
control_time = 120
Φ = 300000  #包數
φ = 500000  #包長
#timeout參數用來控制抓包的周期
packet =sniff(timeout=control_time,prn=lambda x : x.sprintf("{IP:%IP.src%-> %IP.dst%}")) #抓包
p=wrpcap('lygg.pcap', packet) #存包
packets=rdpcap("lygg.pcap") #讀包


cnt_udp = 0
cnt_tcp = 0
cnt_arp = 0
cnt_icmp = 0
cnt_igmp = 0
cnt_ospf = 0
cnt_other = 0
cnt_flow = 0
#
cnt_len = 0
cnt_bags = 0
cnt_success_bags = 0

five_tuple = {}   #建立五元組字典
flow_relation_bag_total_length = {}  #建立一個字典用來統計流的總長
flow_relation_bag_total_sum = {}   #建立一個字典用來統計流的總數
# 五元組提取區
for bag in packets:
    cnt_bags = cnt_bags + 1
    print("這是第{}個包".format(cnt_bags))
    flow_relation_bag_total_sum[cnt_flow//1000+1]=cnt_bags
    try:
        if (bag[1].proto == 6 or bag[1].proto == 17):
            PROTO = bag[1].proto
            Len= bag[1].len
            cnt_success_bags=cnt_success_bags+1
            cnt_len=cnt_len+Len
            flow_relation_bag_total_length[cnt_flow//1000+1] = cnt_len


            if (PROTO == 17):
                Proto = "UDP"
                cnt_udp = cnt_udp + 1
            else:
                Proto = "TCP"
                cnt_tcp = cnt_tcp + 1
            Src = bag[1].src
            Dst = bag[1].dst
            Sport = bag[1].sport
            Dport = bag[1].dport

            s = "{:}  \n Src : {}:{}\n   Dst : {}:{} \n Len : {}".format(Proto, Src, Sport, Dst, Dport, Len)
            if s not in five_tuple:
                five_tuple[s] = [0,Len]
                cnt_flow = cnt_flow + 1#流的數量加一
            else:
                five_tuple[s][0] = five_tuple[s][0] + 1
                five_tuple[s][1] = five_tuple[s][1] + Len
        else:
            if(bag[1].proto == 1):
                 cnt_icmp = cnt_icmp + 1
            elif(bag[1].proto == 2):
                 cnt_igmp = cnt_igmp + 1
            elif(bag[1].proto == 89):
                 cnt_ospf = cnt_ospf + 1
    except Exception as  e:
        try:
            if (bag[0].type == 2054):
                cnt_arp = cnt_arp + 1
            else:
                cnt_other = cnt_other + 1
        except Exception as e:
            cnt_other = cnt_other + 1

        # print(Five_Tuple)
# 協議:其中1,標識ICMP、2標識IGMP、6標識TCP、17標識UDP、89標識OSPF。
# data.payload.name:'IP','IPV6','ARP'或者其他

#繪圖材料准備區
#1.柱狀圖區
##正則
#s = "{}  {}:{}   {}:{}".format(Proto, Src, Sport, Dst, Dport)
#pattern = re.compile(r'.*?([1-9][0-9]{0,2}.[1-9][0-9]{0,2}.[1-9][0-9]{0,2}.[1-9][0-9]{0,2}).*?')   # re.I 表示忽略大小寫
def Creating_Bar_Source(Five_Tuple):
    xaxis = []
    yaxis = []
    for x,y in Five_Tuple.items():

        if y[0] > Φ or y[1] > φ:                 ##設置閾值
          #xsrc=pattern.match(x)
          #xaxis.append(xsrc.group(1))
          xaxis.append(x)
          yaxis.append(y[0])
    print(xaxis)
    print(yaxis)
    return xaxis,yaxis
#2.小bar圖區
xaxis_small=['Φ','φ']
yaxis_small=[Φ,φ]
#3.玫瑰餅圖區
proto_types=["UDP","TCP","ARP","ICMP","IGMP","OSPF","Other"]
proto_nums=[cnt_udp,cnt_tcp,cnt_arp,cnt_icmp,cnt_igmp,cnt_ospf,cnt_other]
zipped=zip(proto_types,proto_nums)
#4.折線區域
##flow_relation_bag_total_length
flow_len_x = []
flow_len_y = []
for lenx,leny in flow_relation_bag_total_length.items():
    flow_len_x.append(str(lenx)+'k')
    flow_len_y.append(leny)
##flow_relation_bag_total_sum
flow_cnt_x = []
flow_cnt_y = []
for cntx,cnty in flow_relation_bag_total_sum.items():
    flow_cnt_x.append(str(cntx)+'k')
    flow_cnt_y.append(cnty)
# 繪圖區
app = Flask(__name__, static_folder="templates")  #建立一個Flask實例app程序
def grid_base() -> Grid():        #->起到一個修飾提醒的作用
  xaxis,yaxis =Creating_Bar_Source(five_tuple)

  bar_five = (
      Bar(init_opts=opts.InitOpts(width='60px', height='180px',bg_color="#654ea3"),)
          .add_xaxis(xaxis)
          .add_yaxis(
              series_name="count_five",
              y_axis=yaxis,
      )
          .set_global_opts(
                  title_opts=opts.TitleOpts(title="可疑流量探測器", subtitle="單詞抓取時間周期為{}s".format(control_time),pos_top="1%",pos_left="1%"),
                  legend_opts=opts.LegendOpts(pos_top="6%",pos_left="1%"),
                  xaxis_opts=opts.AxisOpts(name="五元組(流)"),
                  yaxis_opts=opts.AxisOpts(name="五元組總數(流數)")

      )

          .set_series_opts(label_opts=opts.LabelOpts(is_show= True))

  )
  bar_threshold = (
      Bar(init_opts=opts.InitOpts(width='30px', height='60px'))
          .add_xaxis(xaxis_small)
          .add_yaxis("閾值大小", yaxis_small)
          .set_global_opts(
               title_opts=opts.TitleOpts(title="閾值表",pos_top="3%", pos_bottom='80%', pos_left='75%',pos_right="10%"),
               legend_opts=opts.LegendOpts(pos_top="7%", pos_bottom='80%', pos_left='75%',pos_right="10%"))

  )
  pie = (
         Pie(init_opts=opts.InitOpts(width="600px",height="300px"))#,is_label_show=True
         .add("", [list(z) for z in zipped],rosetype=True,radius=[40,90],center=["17%","80%"])
        # .set_colors(["blue", "green", "yellow", "pink"])
         .set_global_opts(title_opts=opts.TitleOpts(
             title="包種類比例",pos_top="50%",pos_bottom="60%",pos_left="1%"),
             legend_opts=opts.LegendOpts(pos_left="1%",pos_top="55%"))
         .set_series_opts(label_opts=opts.LabelOpts(formatter="{b}: {c}"))
  )

  #折線圖
  line1 = (
    Line(init_opts=opts.InitOpts())
    .add_xaxis(flow_len_x)
    .add_yaxis(
        series_name="total_len",
        y_axis=flow_len_y,
        yaxis_index=0,
        label_opts=opts.LabelOpts(is_show=False),
        markpoint_opts=opts.MarkPointOpts(
            data=[opts.MarkPointItem(type_="max", name="最大值"),
                  opts.MarkPointItem(type_="min", name="最小值")]),
        areastyle_opts=opts.AreaStyleOpts(opacity=0.5)
        )
    .extend_axis(yaxis=opts.AxisOpts())
    .set_global_opts(
        title_opts=opts.TitleOpts(title="總包長和總包數與流量的關系", pos_top="50%", pos_left='50%'),
        legend_opts=opts.LegendOpts(pos_left="50%", pos_top="55%"),  #標簽的位置
        xaxis_opts=opts.AxisOpts(name="總流量"),                     #給x軸貼名字
        yaxis_opts=opts.AxisOpts(name="數值"),                     #給y軸貼名字
                    )
    .set_series_opts(label_opts=opts.LabelOpts(is_show=False))
  )
  line2 = (
      Line()
      .add_xaxis(flow_len_x)
      .add_yaxis(
          series_name="total_bag_cnt",
          y_axis=flow_cnt_y,
          yaxis_index=1,
          areastyle_opts=opts.AreaStyleOpts(opacity=0.5),
          label_opts=opts.LabelOpts(is_show=False),
          markpoint_opts=opts.MarkPointOpts(
          data=[opts.MarkPointItem(type_="max", name="最大值"),
                opts.MarkPointItem(type_="min", name="最小值")])
      )
  )
  line1.overlap(line2) #圖的疊加,但雙y軸一直用不了
  #組合圖
  grid = (
      Grid(init_opts=opts.InitOpts(width='1400px',height='1000px',bg_color="#f7b733"))#初始化寬度,高度和設置背景顏色
          #通過四個位置參數,給各種圖分配位置
          .add(bar_five, grid_opts=opts.GridOpts(pos_top="11%",pos_bottom='60%',pos_right="25%"))
          .add(bar_threshold, grid_opts=opts.GridOpts(pos_top="10%", pos_bottom='80%', pos_left='80%',pos_right="10%"))
          .add(line1, grid_opts=opts.GridOpts(pos_top="60%",pos_bottom="10%",pos_left="50%"))
          .add(pie, grid_opts=opts.GridOpts(pos_bottom="10%",pos_left="10%",pos_top="85%",pos_right="90%"))
  )
  return grid
#flask模板,flask對象和index的連接(@起到對函數修飾的作用)
@app.route("/")
def index():
  c = grid_base()   # 返回一個Grid()實例
  return Markup(c.render_embed())


#控制中心
if __name__ == "__main__":
  app.run(port=60)

感謝

感謝小白馬,xsgg,小o,lygg,卷神的指導!!!!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM