Spaces:
Running
Running
# -*- 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 | |
#.............................................. | |