[Quando a inteligência artificial encontra a segurança] 8. Exemplos detalhados de classificação familiar maliciosa com base na sequência de API e aprendizado de máquina

Como você provavelmente sabe, o autor compartilhará cada vez menos artigos sobre segurança de rede no futuro. Mas se você quiser aprender a aplicação de inteligência artificial e segurança, terá benefícios. O autor recriará uma série de blogs "Quando a inteligência artificial encontra a segurança", apresentará detalhadamente os artigos e práticas relacionadas à inteligência artificial e segurança, e compartilhar vários casos envolvendo detecção de código malicioso, identificação de solicitação maliciosa, detecção de intrusão, exemplos adversários, etc. Eu só quero ajudar melhor os iniciantes e compartilhar novos conhecimentos de forma mais sistemática. Esta série de artigos será mais focada, mais acadêmica e mais aprofundada, e é também a história de lento crescimento do autor. Na verdade, é difícil mudar de curso e a segurança do sistema também é um osso duro de roer, mas tentarei ver até onde poderei aprender nos próximos quatro anos. Aproveite o processo, vamos juntos ~

O artigo anterior introduziu conjuntos de dados relacionados à segurança para todos baixarem e experimentarem, incluindo URLs maliciosos, análise de tráfego, detecção de nomes de domínio, malware, classificação de imagens, spam, etc. Este artigo explicará como aprender os recursos extraídos da sequência da API e construir um algoritmo de aprendizado de máquina para classificar famílias maliciosas, o que também é uma tarefa ou trabalho típico na área de segurança. Artigo básico, espero que seja útil para você ~

Como um novato em segurança de rede, o autor compartilha alguns tutoriais básicos de auto-estudo para todos, principalmente notas online, espero que gostem. Ao mesmo tempo, espero que você possa operar e progredir junto comigo.No futuro, aprenderei mais sobre segurança de IA e conhecimento de segurança de sistema e compartilharei experimentos relacionados. Resumindo, espero que esta série de artigos seja útil para blogueiros. Não é fácil escrever artigos. Se você não gosta, não pulverize, obrigado! Se o artigo for útil para você, será a maior motivação para minha criação. Curtidas, comentários e bate-papos privados são aceitáveis. Vamos trabalhar juntos!

Recomendação anterior:

Recursos do github do autor:


1. Análise de malware

A análise de malware ou código malicioso geralmente inclui análise estática e análise dinâmica. Os tipos de recursos podem ser divididos em recursos estáticos e recursos dinâmicos, dependendo se o código malicioso está sendo executado no ambiente do usuário ou no ambiente de simulação.

Então, como extrair recursos estáticos ou dinâmicos de malware? Portanto, a primeira parte apresentará brevemente recursos estáticos e dinâmicos.

1. Recursos estáticos

Recursos que realmente não funcionam geralmente incluem:

  • bytecódigo: O código binário é convertido em bytecode, um recurso relativamente primitivo sem qualquer processamento
  • Tabela IAT: A parte mais importante da estrutura PE, que declara algumas funções e suas localizações, o que é conveniente para importar quando o programa é executado. As tabelas e funções estão relativamente relacionadas
  • Tabela de permissões do Android: Se o seu APP declarar algumas permissões que não são utilizadas pelas funções, pode haver propósitos maliciosos, como informações do telefone celular
  • caracteres imprimíveis: Converta código binário em código ASCII e execute estatísticas relacionadas
  • Bloco de salto de desmontagem IDA: O bloco de salto quando as ferramentas IDA estão depurando e é processado como dados de sequência ou dados de gráfico
  • Funções de API comumente usadas
  • Imagens de malware

Método de extração de recursos estáticos:


2. Recursos dinâmicos

Equivalente aos recursos estáticos são mais demorados, eles precisam realmente executar o código. Geralmente inclui:
-Relacionamento de chamada de API: Recursos mais óbvios, quais APIs são chamadas e expressam as funções correspondentes
gráfico de fluxo de controle: Comumente usado em engenharia de software, o aprendizado de máquina o representa como um vetor de classificação
Diagrama de fluxo de dados: Comumente usado em engenharia de software, o aprendizado de máquina o representa como um vetor para classificação

Método de extração de recursos dinâmicos:


2. Detecção de família maliciosa com base em regressão logística

A série anterior de artigos detalhou como extrair características estáticas e dinâmicas de malware, incluindo sequências de API. A seguir, construiremos um modelo de aprendizado de máquina para aprender sequências de API para obter classificação. O processo básico é o seguinte:

insira a descrição da imagem aqui

1. Conjunto de dados

Todo o conjunto de dados inclui amostras de 5 tipos de famílias maliciosas, cada amostra passada pelas sequências dinâmicas de API extraídas com sucesso por ferramentas CAPE anteriores. A distribuição dos conjuntos de dados é a seguinte: (os leitores são aconselhados a extrair amostras dos seus próprios conjuntos de dados, incluindo BIG2015, BODMAS, etc.)

família maliciosa categoria quantidade Conjunto de treinamento Conjunto de teste
AAAA classe 1 352 242 110
BBB classe2 335 235 100
CCCC classe3 363 243 120
DDDD classe4 293 163 130
EEEE classe5 548 358 190

O conjunto de dados é dividido em conjunto de treinamento e conjunto de teste, conforme mostrado na figura a seguir:

insira a descrição da imagem aqui

O conjunto de dados inclui principalmente quatro campos, nomeadamente número de série, categoria de família maliciosa, valor Md5, sequência ou recurso de API.

insira a descrição da imagem aqui

Deve-se notar que o processo de extração de características envolve uma grande quantidade de trabalho de pré-processamento e limpeza de dados, e os leitores precisam concluí-lo de acordo com as necessidades reais. Por exemplo, filtre o código que extrai recursos que são valores nulos.

#coding:utf-8
#By:Eastmount CSDN 2023-05-31
import csv
import re
import os

csv.field_size_limit(500 * 1024 * 1024)
filename = "AAAA_result.csv"
writename = "AAAA_result_final.csv"
fw = open(writename, mode="w", newline="")
writer = csv.writer(fw)
writer.writerow(['no', 'type', 'md5', 'api'])
with open(filename,encoding='utf-8') as fr:
    reader = csv.reader(fr)
    no = 1
    for row in reader: #['no','type','md5','api']
        tt = row[1]
        md5 = row[2]
        api = row[3]
        #print(no,tt,md5,api)
        #api空值的过滤
        if api=="" or api=="api":
            continue
        else:
            writer.writerow([str(no),tt,md5,api])
            no += 1
fr.close()

2. Construção do modelo

Como o algoritmo de aprendizado de máquina é relativamente simples, apenas os códigos-chave são fornecidos aqui. Além disso, as representações de recursos comumente usadas incluem TF-IDF e Word2Vec. Aqui, TF-IDF é usado para calcular o vetor de recursos. Os leitores podem tentar o Word2Vec para finalmente obter a classificação familiar e obter um valor Acc de 0,6215.

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2023-06-01
import os
import csv
import time
import numpy as np
import seaborn as sns
from sklearn import metrics
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

start = time.clock()
csv.field_size_limit(500 * 1024 * 1024)

#---------------------------第一步 加载数据集------------------------
#训练集
file = "train_dataset.csv"
label_train = []
content_train = []
with open(file, "r") as csv_file:
    csv_reader = csv.reader(csv_file)
    header = next(csv_reader)
    for row in csv_reader:
        label_train.append(row[1])
        value = str(row[3])
        content_train.append(value)
print(label_train[:2])
print(content_train[:2])

#测试集
file = "test_dataset.csv"
label_test = []
content_test = []
with open(file, "r") as csv_file:
    csv_reader = csv.reader(csv_file)
    header = next(csv_reader)
    for row in csv_reader:
        label_test.append(row[1])
        value = str(row[3])
        content_test.append(value)
print(len(label_train),len(label_test))
print(len(content_train),len(content_test)) #1241 650

#---------------------------第二步 向量转换------------------------
contents = content_train + content_test
labels = label_train + label_test

#计算词频 min_df max_df
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(contents)
words = vectorizer.get_feature_names()
print(words[:10])
print("特征词数量:",len(words))

#计算TF-IDF
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weights = tfidf.toarray()

#---------------------------第三步 编码转换------------------------
le = LabelEncoder()
y = le.fit_transform(labels)
X_train, X_test = weights[:1241], weights[1241:]
y_train, y_test = y[:1241], y[1241:]

#---------------------------第四步 分类检测------------------------
clf = LogisticRegression(solver='liblinear')
clf.fit(X_train, y_train)
pre = clf.predict(X_test)
print(clf)
print(classification_report(y_test, pre, digits=4))
print("accuracy:")
print(metrics.accuracy_score(y_test, pre))

#计算时间
elapsed = (time.clock() - start)
print("Time used:", elapsed)

O resultado de saída é mostrado na figura abaixo:

1241 650
1241 650
['__anomaly__', 'accept', 'bind', 'changewindowmessagefilter', 'closesocket', 'clsidfromprogid', 'cocreateinstance', 'cocreateinstanceex', 'cogetclassobject', 'colescript_parsescripttext']
特征词数量: 269
LogisticRegression(solver='liblinear')
              precision    recall  f1-score   support

           0     0.5398    0.5545    0.5471       110
           1     0.6526    0.6200    0.6359       100
           2     0.6596    0.5167    0.5794       120
           3     0.8235    0.5385    0.6512       130
           4     0.5665    0.7842    0.6578       190

    accuracy                         0.6215       650
   macro avg     0.6484    0.6028    0.6143       650
weighted avg     0.6438    0.6215    0.6199       650

accuracy:
0.6215384615384615
Time used: 2.2597622

3. Detecção de família maliciosa baseada em SVM

1. Modelo SVM

A ideia central do algoritmo de classificação SVM é encontrar um hiperplano que atenda aos requisitos de classificação em grandes dimensões, estabelecendo uma determinada função de kernel, de modo que os pontos no conjunto de treinamento estejam o mais distantes possível da superfície de classificação, que é encontrar uma superfície de classificação que faça com que seus dois lados O espaço em branco seja o maior. Conforme mostrado na Figura 19.16, as amostras de treinamento no hiperplano que está mais próximo da superfície de classificação e paralela à superfície de classificação ideal entre os dois tipos de amostras são chamadas de vetores de suporte.

insira a descrição da imagem aqui

O algoritmo de classificação SVM é implementado no pacote de aprendizado de máquina Sklearn svm.SVC, ou seja, C-Support Vector Classification, que é implementado com base em libsvm. O método de construção é o seguinte:

SVC(C=1.0, 
	cache_size=200, 
	class_weight=None, 
	coef0=0.0,
	decision_function_shape=None, 
	degree=3, 
	gamma='auto', 
	kernel='rbf',
	max_iter=-1, 
	probability=False, 
	random_state=None, 
	shrinking=True,
	tol=0.001, 
	verbose=False)

O algoritmo SVC inclui principalmente duas etapas:

  • treinamento :nbrs.fit(data, target)
  • Previsão :pre = clf.predict(data)

2. Implementação de código

A seguir é fornecido apenas o código-chave do SVM para realizar a classificação de famílias maliciosas.Este algoritmo também é um modelo comumente usado em várias tarefas de segurança. Deve-se notar que os resultados da previsão são salvos em um arquivo aqui.No experimento real, é recomendável salvar mais dados do processo experimental, para que você possa comparar melhor os vários desempenhos e refletir a contribuição do papel.

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2023-06-01
import os
import csv
import time
import numpy as np
import seaborn as sns
from sklearn import svm
from sklearn import metrics
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import classification_report

start = time.clock()
csv.field_size_limit(500 * 1024 * 1024)

#---------------------------第一步 加载数据集------------------------
#训练集
file = "train_dataset.csv"
label_train = []
content_train = []
with open(file, "r") as csv_file:
    csv_reader = csv.reader(csv_file)
    header = next(csv_reader)
    for row in csv_reader:
        label_train.append(row[1])
        value = str(row[3])
        content_train.append(value)
print(label_train[:2])
print(content_train[:2])

#测试集
file = "test_dataset.csv"
label_test = []
content_test = []
with open(file, "r") as csv_file:
    csv_reader = csv.reader(csv_file)
    header = next(csv_reader)
    for row in csv_reader:
        label_test.append(row[1])
        value = str(row[3])
        content_test.append(value)
print(len(label_train),len(label_test))
print(len(content_train),len(content_test)) #1241 650

#---------------------------第二步 向量转换------------------------
contents = content_train + content_test
labels = label_train + label_test

#计算词频 min_df max_df
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(contents)
words = vectorizer.get_feature_names()
print(words[:10])
print("特征词数量:",len(words))

#计算TF-IDF
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weights = tfidf.toarray()

#---------------------------第三步 编码转换------------------------
le = LabelEncoder()
y = le.fit_transform(labels)
X_train, X_test = weights[:1241], weights[1241:]
y_train, y_test = y[:1241], y[1241:]

#---------------------------第四步 分类检测------------------------
clf = svm.LinearSVC()
clf.fit(X_train, y_train)
pre = clf.predict(X_test)
print(clf)
print(classification_report(y_test, pre, digits=4))
print("accuracy:")
print(metrics.accuracy_score(y_test, pre))

#结果存储
f1 = open("svm_test_pre.txt", "w")
for n in pre:
    f1.write(str(n) + "\n")
f1.close()

f2 = open("svm_test_y.txt", "w")
for n in y_test:
    f2.write(str(n) + "\n")
f2.close()

#计算时间
elapsed = (time.clock() - start)
print("Time used:", elapsed)

Os resultados experimentais são mostrados na figura abaixo:

insira a descrição da imagem aqui

1241 650
1241 650

['__anomaly__', 'accept', 'bind', 'changewindowmessagefilter', 'closesocket', 'clsidfromprogid', 'cocreateinstance', 'cocreateinstanceex', 'cogetclassobject', 'colescript_parsescripttext']
特征词数量: 269
LinearSVC()
              precision    recall  f1-score   support

           0     0.6439    0.7727    0.7025       110
           1     0.8780    0.7200    0.7912       100
           2     0.7315    0.6583    0.6930       120
           3     0.9091    0.6154    0.7339       130
           4     0.6583    0.8316    0.7349       190

    accuracy                         0.7292       650
   macro avg     0.7642    0.7196    0.7311       650
weighted avg     0.7534    0.7292    0.7301       650

accuracy:
0.7292307692307692
Time used: 2.2672032

4. Detecção de família maliciosa com base em floresta aleatória

O código-chave desta parte é o seguinte e o código de análise visual é complementado.

# -*- coding: utf-8 -*-
# By:Eastmount CSDN 2023-06-01
import os
import csv
import time
import numpy as np
import seaborn as sns
from sklearn import svm
from sklearn import metrics
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.preprocessing import LabelEncoder, OneHotEncoder
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import classification_report
import matplotlib.pyplot as plt
from matplotlib.colors import ListedColormap

start = time.clock()
csv.field_size_limit(500 * 1024 * 1024)

#---------------------------第一步 加载数据集------------------------
#训练集
file = "train_dataset.csv"
label_train = []
content_train = []
with open(file, "r") as csv_file:
    csv_reader = csv.reader(csv_file)
    header = next(csv_reader)
    for row in csv_reader:
        label_train.append(row[1])
        value = str(row[3])
        content_train.append(value)
print(label_train[:2])
print(content_train[:2])

#测试集
file = "test_dataset.csv"
label_test = []
content_test = []
with open(file, "r") as csv_file:
    csv_reader = csv.reader(csv_file)
    header = next(csv_reader)
    for row in csv_reader:
        label_test.append(row[1])
        value = str(row[3])
        content_test.append(value)
print(len(label_train),len(label_test))
print(len(content_train),len(content_test)) #1241 650

#---------------------------第二步 向量转换------------------------
contents = content_train + content_test
labels = label_train + label_test

#计算词频 min_df max_df
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(contents)
words = vectorizer.get_feature_names()
print(words[:10])
print("特征词数量:",len(words))

#计算TF-IDF
transformer = TfidfTransformer()
tfidf = transformer.fit_transform(X)
weights = tfidf.toarray()

#---------------------------第三步 编码转换------------------------
le = LabelEncoder()
y = le.fit_transform(labels)
X_train, X_test = weights[:1241], weights[1241:]
y_train, y_test = y[:1241], y[1241:]

#---------------------------第四步 分类检测------------------------
clf = RandomForestClassifier(n_estimators=5)
clf.fit(X_train, y_train)
pre = clf.predict(X_test)
print(clf)
print(classification_report(y_test, pre, digits=4))
print("accuracy:")
print(metrics.accuracy_score(y_test, pre))

#结果存储
f1 = open("rf_test_pre.txt", "w")
for n in pre:
    f1.write(str(n) + "\n")
f1.close()

f2 = open("rf_test_y.txt", "w")
for n in y_test:
    f2.write(str(n) + "\n")
f2.close()

#计算时间
elapsed = (time.clock() - start)
print("Time used:", elapsed)

#---------------------------第五步 可视化分析------------------------
#降维
pca = PCA(n_components=2)
pca = pca.fit(X_test)
xx = pca.transform(X_test)

#画图
plt.figure()
plt.scatter(xx[:,0],xx[:,1],c=y_test, s=50)
plt.title("Malware Family Detection")
plt.show()

O resultado da saída é o seguinte, o efeito atingiu 0,8092, o que é muito bom.

1241 650
1241 650
['__anomaly__', 'accept', 'bind', 'changewindowmessagefilter', 'closesocket', 'clsidfromprogid', 'cocreateinstance', 'cocreateinstanceex', 'cogetclassobject', 'colescript_parsescripttext']
特征词数量: 269
RandomForestClassifier(n_estimators=5)
              precision    recall  f1-score   support

           0     0.7185    0.8818    0.7918       110
           1     0.9000    0.8100    0.8526       100
           2     0.7963    0.7167    0.7544       120
           3     0.9444    0.7846    0.8571       130
           4     0.7656    0.8421    0.8020       190

    accuracy                         0.8092       650
   macro avg     0.8250    0.8070    0.8116       650
weighted avg     0.8197    0.8092    0.8103       650

accuracy:
0.8092307692307692
Time used: 2.1914324

Ao mesmo tempo, cinco tipos de famílias maliciosas são analisados ​​visualmente. No entanto, o efeito geral é medíocre. É necessário otimizar ainda mais o código e a dimensão para distinguir conjuntos de dados ou gráficos de dispersão 3D. Os leitores são convidados a pensar por si próprios.

insira a descrição da imagem aqui


5. Resumo

Este é o final deste artigo, espero que seja útil para você. Maio ocupado, muito ocupado. Depois de terminar a tese do projeto, escreverei alguns blogs de segurança depois de terminar meu trabalho. Obrigado pelo seu apoio e companhia, especialmente pelo incentivo e apoio de sua família. Continue!

  • 1. Análise de malware
    1. Recursos estáticos
    2. Recursos dinâmicos
  • 2. Detecção de famílias mal-intencionadas com base em regressão logística
    1. Conjunto de dados
    2. Construção de modelo
  • 3. Detecção de família maliciosa baseada em SVM
    1. Modelo SVM
    2. Implementação de código
  • 4. Detecção de família maliciosa com base em floresta aleatória
  • 5. Resumo

O autor faz as seguintes perguntas, bem-vindo para acrescentar:

  • Quais são as características comuns de malware ou binários? Quais são as vantagens e desvantagens de cada um.
  • O malware para imagens em escala de cinza é um método comum de classificação familiar. Quais são suas vantagens e desvantagens em comparação com o método proposto neste artigo?
  • Como extrair malware CFG e ICFG? Como pode ser aprendido pelo modelo de aprendizado de máquina após a extração?
  • Quais são os métodos comuns de representação vetorial e quais são suas características? Você pode implementar o código para Word2Vec?
  • Qual é a conexão e a diferença entre aprendizado de máquina e aprendizado profundo? Se um modelo de aprendizagem profunda for construído para aprender sequências de API, quão eficaz será a detecção de famílias maliciosas?
  • Onde está o estado atual da classificação da família de malware ou da detecção de códigos maliciosos? Quais são as características e limitações da indústria e da academia e como se conectar melhor para promover o desenvolvimento da área?
  • Existe uma maneira melhor de inovar ou romper a direção binária? Como melhorar sua robustez, aprimoramento semântico e interpretabilidade.
  • Como detectar malware de famílias desconhecidas e como rastrear a origem do malware de alta ameaça?
  • Como a detecção de malware se integra melhor ao hardware e aos compiladores subjacentes? E como combater as variantes, o ofuscamento e o confronto.
  • A detecção de malware pode gerar variantes rapidamente por meio da tecnologia chatGPT? E como combater o desenvolvimento desta tecnologia.

A estrada da vida é feita de encruzilhadas, jogo após jogo, complicações e ganhos e perdas. Ganhos e perdas, ganhos e perdas, escolhas diferentes, emoções diferentes. Embora cansado e ocupado, ver Xiao Luoluo é bastante gratificante e agradeço à minha família pela companhia.
Xiao Luo: Pai, você voltou do trabalho.
Eu: Você chorou no supermercado com sua sogra hoje?
Xiao Luo: Sim, eu quero levar o bolinho de cabelo sozinho
Eu: Ouvi dizer que o vovô e a vovó riram de mim, de agora em diante...
Xiao Luo: Qual a utilidade deles rirem!

Sim, haha, de que adianta? O pequeno Luoluo cresceu, e a fofinha se tornou um pouco safada. Recentemente, estou relutante em pegar um táxi, pegar um ônibus e compartilhar uma motocicleta, mas também confio na compra de bilhetes de loteria.Nossas 5 milhões de palavras, por que não segui a deusa para comprar uma casa em nossa comunidade em 2017 ? Neste ano, sinto que posso ganhar quase 1 milhão de yuans, o que é suficiente para lecionar em Guizhou por dez anos. É tudo um jogo, é tudo uma escolha, é tudo doce e azedo, espero que Xiaoluo possa crescer feliz e saudável, eu te amo, continue trabalhando, vamos lá

insira a descrição da imagem aqui

(Por:Eastmount 2023-09-06 noite em Guiyang http://blog.csdn.net/eastmount/ )

Acho que você gosta

Origin blog.csdn.net/Eastmount/article/details/132708001
Recomendado
Clasificación