Dentro do escopo geral, cada script realiza uma tarefa específica. Preferi manter dessa maneira, pois achei importante conseguir fazer verificações intermediárias no processo.
Uma observação que cabe ser feita é que o VirusTotal não permite download de amostras de usuários comuns (mesmo com assinatura acadêmica), apenas usuários vinculados a empresas e que tenham assinatura. Por este motivo precisei utilizar outros repositórios para fazer o download das amostras. Atente-se também para as limitações impostas pelos repositórios para interações com suas API (se não houvesse limites, poderiamos causar um DoS):
VirusTotal (Licença Educacional/Pesquisa):
Request rate => 1000 lookups/min
Daily quota => 20 K lookups/day
Monthly quota => 620K lookups/month
VirusShare:
Request rate: 4 requests/min
Daily Quota: 5,760 requests
Monthly Quota: 172,800 requests
Transforma os arquivos
Cabe observar que os arquivos "JSON to TXT" e XXXX, que fazem a filtragem dos dados dos relatórios e grava em formato diferente estão com os trechos de seleção dos dados comentados de acordo com a sua utilização. O exemplo abaixo, retirado do arquivo "JSON to TXT", mostra como está organizado. Nele podemos ver que os trechos de código que extraem as informações das seções extracted e signatures estão comentadas, ao passo que a extração de dados da seção behavios está ativa.
"""
if ("extracted" in json_file):
for i in range(len(json_file["extracted"])):
for key in ["category", 'raw', 'program']:
filtered_json_file["extracted" + str(i)] = json_file["extracted"][i][key]
...
if ("signatures" in json_file):
for i in range(len(json_file['signatures'])):
filtered_json_file['signatures'] = json_file['signatures'][i]['description']
"""
if ("behavior" in json_file): filtered_json_file["behavior_summary"] = json_file["behavior"]["summary"] if (
"summary" in json_file["behavior"]) else None
Após o processamento dos relatórios gerados pelo cuckoo, tanto para os ransomwares quanto para os softwares benignos, foram gerados os conjuntos de dados descritos abaixo, divididos em dois grupos:
- Grupo com o conjunto de dados formados a partir da abordagem de chamadas de API:
Este grupo é formado pelo conjunto de dados 1075.csv. Neste arquivo cada linha representa uma amostra e as colunas representam as chamadas de API executadas na interação com o SO. O dataframe é populado com as quantidades de chamadas que determinado ransomware fez durante sua atividade.
- Grupo com conjuntos de dados populados com dados resultantes da transformação dos relatórios em texto e aplicação do TF-IDF:
Conforme será explicado com detalhes na próxima seção, devido a capacidade computacional disponível, não foi possível trabalhar com um conjunto de dados único a partir da aplicação da abordagem TF-IDF (arquivo Behavior.csv, com 3,95GB). Por esse motivo, houve a necessidade de particionamento dos dados e a criação de conjuntos de dados reduzidos. A execução dessa tarefa resultou em conjuntos de dados menores, representativos das seções Behavior, Network, Memory, Signatures e Strings.
Adicionalmente, como a seção behavior é a seção dos relatórios que contém a maior parte da interação dos ransomwares com a VM, mesmo com a separação dos dados em seções, seu tamanho continuou aquém da capacidade de memória disponível e, desse modo, optei por separar também por família de malware. Cabe ressaltar que as amostras benignas analisadas estão contidas em cada arquivo.
O resuldado das divisões são os arquivos listados abaixo:
Behaviorccel.csv -> seção behavior dos relatórios das amostras do Conti, Egregor, Clop e LockBit.
Behaviormnr.csv -> seção behavior dos relatórios das amostras do MountLocker, Netwalker e Ryuk.
Behaviorrevil.csv -> seção behavior dos relatórios das amostras do Revil.
Caso deseje utilizar os conjuntos de dados gerados por este trabalho, fique à vontade. A pasta com os conjuntos de dados pode ser acessada aqui.
Cabe ressaltar que as amostras benignas analisadas estão contidas em cada arquivo.Para realizar a classificação foram aplicados algoritmos de Aprendizado de Máquina conjuntamente com redutores de dimensionalidade (PCA) e padronizadores (Standard Scaler).
Para descobrirmos qual a melhor configuração para classificação dentro de intervalos pré definidos, utilizamos o Grid Search CV.