dash-asg / ASG.API /MScenoariotree.py
wasmdashai's picture
model push
62dcfec
# -*- coding: utf-8 -*-
"""
Created on Tue Dec 6 22:13:12 2022
@author: amaer
"""
import numpy as np
import copy
from ModelTEC import *
import pickle
from threading import Thread
class Graph:
def __init__(self,root,name=None,idtactic=0):
self.Root=root
self.Name=name
self.Idtactic=idtactic
self.Tactics=[]
#........................
def Filter(self):
for i in range(self.Idtactic,len(Scenoariotree.Basetree)):
self.Tactics.append(copy.deepcopy(Scenoariotree.Basetree[i]))
#........................
def Run(self,path="",state=" ",Cinput="",listAttackGod=[],numstop=-1):
self.Filter()
for tactic in self.Tactics:
tactic.Run(self.Root,path=path+"=> "+tactic.Name,state=state,Cinput=Cinput,listAttackGod=listAttackGod,numstop=numstop)
# thread=Thread(target = tactic.Run, args = (self.Root,path+"->"+tactic.Name))
# thread.start()
# thread.join()
#........................
class Technique:
PreprocessingFunc=None
ExtractFeaturesFunc=None
objFile=None
Counter=0
Cinput=' '
listAttackGod=[]
PrintScenoario=print
def __init__(self,name,description,weight=None):
self.Name=name
self.Description=description
self.Weight=weight
self.CleanDescription=None
self.FeaturesDescription=None
self.Graph=None
#........................................
def Preprocessing(self):
if Technique.PreprocessingFunc:
return Technique.PreprocessingFunc([self.Description])
return self.Description
#........................................
def ExtractFeatures(self):
if Technique.ExtractFeaturesFunc:
return Technique.ExtractFeaturesFunc(self.CleanDescription if self.CleanDescription else self.Description)
return np.zeros((1,10))
#........................................
def Fit(self):
self.CleanDescription=self.Preprocessing()
#self.FeaturesDescription=self.ExtractFeatures()
#........................................
def Run(self,id,path="",state=" ",Cinput="",listAttackGod=[],numstop=-1):
if (numstop ==-1 or len(listAttackGod)<numstop):
if id<len(Scenoariotree.Basetree) :
# Technique.objFile.write("=")
# print('=',end='')
path=path+" *-> "+self.Name+" "
row=Technique.PrintScenoario(path,Cinput)
if row is not None:
listAttackGod.append(row)
self.Graph=Graph(root=self,name=self.Name,idtactic=id+1)
self.Graph.Run(path=path,state=state,Cinput=Cinput,listAttackGod=listAttackGod,numstop=numstop)
else :
try:
row=Technique.PrintScenoario(path,Cinput)
if row is not None:
listAttackGod.append(row)
except:
pass
#........................................
def __str__(self):
return f"(Name: {self.Name} , Weights: {self.Weight})"
class Tactic():
dataMS=None
WF="thrshold"
def __init__(self,name,id=0,description=None,weight=None,techniques=None,wfilter="thrshold"):
self.Name=name
self.Id=id
self.Weight=weight
self.Techniques=techniques if techniques else []
#........................................
def Filter1(self,root,path=""):
i=0
while i<len(self.Techniques):
sim=Tactic.dataMS[root.Name][self.Techniques[i].Name]
if sim>=Scenoariotree.ThresholdTechnique:
self.Techniques[i].Weight=sim
else:
# row=Technique.PrintScenoario(path,Technique.Cinput)
# if row is not None:
# Technique.listAttackGod.append(row)
# Technique.Counter+=1
self.Techniques.remove(self.Techniques[i])
i-=1
i+=1
#........................................
def Filter2(self,root,path=""):
listd=[]
max=0
for i in range(len(self.Techniques)):
sim=Tactic.dataMS[root.Name][self.Techniques[i].Name]
if sim>max and sim>=Scenoariotree.ThresholdTechnique:
listd=[self.Techniques[i]]
max=sim
# Scenoariotree.CurrentSoft.predict()
self.Techniques=listd
#........................................
def Filter(self,root,path=""):
if Tactic.WF=="thrshold":
self.Filter1(root,path)
else:
self.Filter2(root,path)
def Run(self,root,path="",state="",Cinput="",listAttackGod=[],numstop=-1):
self.Filter(root,path)
for technique in self.Techniques:
technique.Run(self.Id,path=path,state=state,Cinput=Cinput,listAttackGod=listAttackGod,numstop=numstop)
# thread=Thread(target=technique.Run,args=(self.Id,path))
# thread.start()
# thread.join()
#........................................
def __str__(self):
return f"(Name: {self.Name}, Weight: {self.Weight})"
from BasePath import BASEPATH
class Scenoariotree:
obTEC=None
obTECSodft=None
ThresholdTechnique=0.3
ThresholdTactic=0.3
Basetree=None
CurrentSoft=None
indecisT={}
CurrentInput=''
#....................................................
#....................................................
def __init__(self,file1,file2,Ntactics=None):
self.TacticsOrder=pickle.load(open(BASEPATH+file1,'rb'))
self.indecisT=pickle.load(open(BASEPATH+file2,'rb'))
self.Ntactics=len(self.TacticsOrder)
self.nlp=None#spacy.load('en_core_web_lg')
"""
"""
def setModels(self,ObTEC=None,ObTECSodft=None,obchk=None,isForm=False):
self.obTEC=ObTEC
self.obTECSodft=ObTECSodft
self.obTEC.ChangeModel(ob="svmK")
self.obTECSodft.ChangeModel(ob="svmK")
self.obchk=obchk
Technique.PrintScenoario=obchk.print_table if isForm==False else obchk.process
#....................................................
def InitBasetree(self):
tree=[]
i=0
for key in self.TacticsOrder:
tactic=key
tree.append(Tactic(name=tactic,id=i))
group=self.TacticsOrder[key]
i+=1
for j in range(len(group)):
tree[-1].Techniques.append(Technique(name=group[j],
description=" ",
))
return tree
#..............................................
def getordertactics(self):
return ''
def Fit(self,file="dataSM.pkl",wtype='ALL'):
Tactic.dataMS=pickle.load(open(BASEPATH+file,'rb'))
Scenoariotree.Basetree=self.InitBasetree()
# Scenoariotree.Basetree[6].Techniques.append(Technique(name="Exploitation of Remote Services",description="Exploitation of Remote Services")
#..............................................
def Predict(self,Description,ThresholdTechnique=0.5,ThresholdTactic=0.0,WF="thrshold",istrans=False,numstop=-1):
Technique.Counter=0
Technique.listAttackGod=[]
self.obchk.inintlist()
Tactic.WF=WF
Scenoariotree.ThresholdTechnique=ThresholdTechnique
Scenoariotree.ThresholdTactic=ThresholdTactic
if istrans:
Description=[self.obTEC.to_tran(Description)]
tech=self.obTEC.predict(Description)
if tech!="No":
print('-------------------------------------------')
print('Technique : ', tech)
tact=self.indecisT[tech]
print(' Tactic :',tact)
self.obTECSodft.ChangeModel(ob="svmK")
CurrentSoft=self.obTECSodft.predict(Description+[" "+tech])
print('input same as Software is : ',CurrentSoft)
self.obTECSodft.ChangeModel(ob="svmL")
print('-------------------------------------------')
print('---------------------senarios----------------------')
listofs=[]
self.Root=Technique(name=tech,description=Description)
idt=-1
for key in self.TacticsOrder:
if key==tact:
break
idt+=1
self.Root.Run(id=idt+1,path="=> "+tact,state="",Cinput=Description[0],listAttackGod=listofs,numstop=numstop)
if idt==self.Ntactics-1:
self.obchk.process(tact+" *-> "+ tech,Description[0],isclean=False)
else :
print( "no found any thing........")
return listofs
#..............................................