Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
75 changes: 47 additions & 28 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,57 +1,76 @@
# Analisador de Malware
### Analisador de Malware com Python
Este é um conjunto de scripts de segurança para realizar análises rápidas (triagem) em arquivos e URLs suspeitas.

Este script realiza uma análise básica de arquivos suspeitos, verificando seu hash no VirusTotal e extraindo informações estáticas de executáveis PE (Portable Executable - EXE/DLL).
## Ferramentas Incluídas
Analisador de Arquivos (analisador.py): Verifica o hash de um arquivo no VirusTotal e extrai informações estáticas de executáveis (.exe/.dll).

# Funcionalidades
Verificador de URL (verificar_url.py): Consulta a reputação de uma URL ou domínio na API do VirusTotal.

Calcula o hash SHA-256 do arquivo.
Extrator de Metadados (extrator_exif.py): Exibe dados EXIF ocultos em arquivos de imagem.

Verifica se o hash já foi analisado no VirusTotal.
Monitor de Rede (monitor_rede.py): Lista as conexões de rede ativas e os processos associados.

Exibe a quantidade de detecções de malware no VirusTotal.
## Requisitos Gerais
Python 3.6+

Para arquivos PE (EXE/DLL), exibe informações das seções e do header PE.
Uma chave de API gratuita do VirusTotal.

# Requisitos
## Instalação e Configuração
### 1. Instale as Dependências
Cada script pode ter dependências específicas. Para instalar todas de uma vez, execute:

Certifique-se de ter o Python 3 instalado. Instale as dependências executando:

pip install requests pefile
pip install requests pefile Pillow psutil
### 2. Configure a Chave da API do VirusTotal
Para os scripts que usam o VirusTotal, a chave de API deve ser configurada como uma variável de ambiente para maior segurança.

# Uso
No Windows (PowerShell):

Execute o script passando o caminho do arquivo como argumento:
$env:VIRUSTOTAL_API_KEY="SUA_CHAVE_DE_API_AQUI"
No Windows (CMD tradicional):

python script.py <caminho_do_arquivo>
set VIRUSTOTAL_API_KEY="SUA_CHAVE_DE_API_AQUI"
No Linux ou macOS (Terminal):

# Exemplo de execução:
export VIRUSTOTAL_API_KEY="SUA_CHAVE_DE_API_AQUI"
Importante: Substitua SUA_CHAVE_DE_API_AQUI pela sua chave real.

python script.py exemplo.exe
## Como Usar os Scripts
Execute cada script a partir do terminal, passando os argumentos necessários.

# 🔑 Configuração da API do VirusTotal
### Analisador de Arquivos

Para utilizar a verificação no VirusTotal, insira sua chave de API na variável VIRUSTOTAL_API_KEY dentro do script:
python analisador.py <caminho_para_o_arquivo>

VIRUSTOTAL_API_KEY = 'SUA_CHAVE_DE_API'
Exemplo:
python analisador.py "C:\Users\Downloads\programa.exe"

Você pode obter uma chave gratuita criando uma conta no VirusTotal.
### Verificador de URL

# Como Funciona
python verificar_url.py <url_completa>

O script calcula o SHA-256 do arquivo.
Exemplo:
python verificar_url.py "http://site-suspeito.com/login.php"

Verifica se o hash está presente no VirusTotal.
### Extrator de Metadados

Se for um executável PE (EXE/DLL), exibe informações das seções e do EntryPoint.
python extrator_exif.py <caminho_para_a_imagem>

# Aviso
Exemplo:
python extrator_exif.py "C:\Fotos\minha_foto.jpg"

O script não executa o arquivo; ele apenas analisa estáticamente.
### Monitor de Rede

Ele não substitui uma solução antivírus completa.
python monitor_rede.py

Certifique-se de não compartilhar sua chave de API publicamente.
Dica: Para melhores resultados, execute este script como administrador (ou com sudo no Linux/macOS).

# Licença
## ⚠️ Aviso
Estas ferramentas realizam análises estáticas e de reputação, elas não executam nenhum arquivo.

Elas servem como uma primeira camada de análise e não substituem uma solução corporativa completa.

Nunca compartilhe sua chave de API publicamente.

## Licença
Este projeto é distribuído sob a licença MIT. Sinta-se à vontade para modificá-lo e distribuí-lo conforme necessário.
136 changes: 94 additions & 42 deletions malware_analysis.py
Original file line number Diff line number Diff line change
@@ -1,80 +1,132 @@
pip install requests pefile
# -*- coding: utf-8 -*-

import requests
import hashlib
import pefile
import sys
import os

# Insira sua chave de API do VirusTotal aqui
VIRUSTOTAL_API_KEY = 'SUA_CHAVE_DE_API'
# --- INÍCIO DA CONFIGURAÇÃO ---

# 1. Pega a chave da API a partir de uma variável de ambiente para mais segurança.
VIRUSTOTAL_API_KEY = os.getenv('VIRUSTOTAL_API_KEY')

# --- FIM DA CONFIGURAÇÃO ---

def check_api_key():
"""Verifica se a chave da API foi carregada corretamente."""
if not VIRUSTOTAL_API_KEY:
print("\n[ERRO] A variável de ambiente 'VIRUSTOTAL_API_KEY' não foi definida.")
print("Instruções:")
print(" - Windows (CMD): set VIRUSTOTAL_API_KEY=\"sua_chave_aqui\"")
print(" - Windows (PowerShell): $env:VIRUSTOTAL_API_KEY=\"sua_chave_aqui\"")
print(" - Linux/macOS: export VIRUSTOTAL_API_KEY=\"sua_chave_aqui\"")
sys.exit(1) # Encerra o script com um código de erro

# Função para calcular o hash SHA-256 de um arquivo
def calculate_sha256(file_path):
"""Calcula o hash SHA-256 de um arquivo de forma eficiente."""
sha256_hash = hashlib.sha256()
with open(file_path, "rb") as f:
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
try:
with open(file_path, "rb") as f:
for byte_block in iter(lambda: f.read(4096), b""):
sha256_hash.update(byte_block)
return sha256_hash.hexdigest()
except IOError as e:
print(f"Erro ao ler o arquivo: {e}")
return None

# Função para verificar o hash no VirusTotal
def check_virustotal(file_hash):
"""Verifica o hash no VirusTotal com tratamento de erros robusto."""
print("\n--- Verificando no VirusTotal ---")
url = f"https://www.virustotal.com/api/v3/files/{file_hash}"
headers = {
"x-apikey": VIRUSTOTAL_API_KEY
}
response = requests.get(url, headers=headers)
if response.status_code == 200:
headers = {"x-apikey": VIRUSTOTAL_API_KEY}

try:
# Adiciona um timeout de 15 segundos para evitar que o script trave
response = requests.get(url, headers=headers, timeout=15)

# O VirusTotal retorna 404 para hashes que nunca viu. Tratamos isso como "não encontrado".
if response.status_code == 404:
print("Hash não encontrado no banco de dados do VirusTotal.")
return None, None

# Lança uma exceção para outros erros HTTP (ex: 401 Unauthorized, 429 Rate Limit)
response.raise_for_status()

json_response = response.json()
positives = json_response["data"]["attributes"]["last_analysis_stats"]["malicious"]
total = json_response["data"]["attributes"]["last_analysis_stats"]["total"]

# Usamos .get() para evitar erros caso a estrutura da resposta mude
stats = json_response.get("data", {}).get("attributes", {}).get("last_analysis_stats", {})

if not stats:
print("Nenhuma análise encontrada para este hash.")
return 0, 0

positives = stats.get("malicious", 0)
total = sum(stats.values())
return positives, total
else:
print("Erro ao consultar o VirusTotal:", response.status_code)

except requests.exceptions.RequestException as e:
print(f"Erro de rede ao consultar o VirusTotal: {e}")
return None, None
except Exception as e:
print(f"Ocorreu um erro inesperado ao processar a resposta do VirusTotal: {e}")
return None, None

# Função para realizar análise estática em um executável PE
def analyze_pe_file(file_path):
"""Realiza análise estática em um executável PE, extraindo mais informações."""
print("\n--- Análise Estática do Arquivo PE ---")
try:
pe = pefile.PE(file_path)
print("\n--- Informações do Executável PE ---")
print("Número de seções:", len(pe.sections))
for section in pe.sections:
print(f"Seção: {section.Name.decode().strip()}, Tamanho: {section.SizeOfRawData}")
print("Entrypoint:", hex(pe.OPTIONAL_HEADER.AddressOfEntryPoint))
print("Imagem Base:", hex(pe.OPTIONAL_HEADER.ImageBase))

print(f"EntryPoint: {hex(pe.OPTIONAL_HEADER.AddressOfEntryPoint)}")
print(f"ImageBase: {hex(pe.OPTIONAL_HEADER.ImageBase)}")
print(f"Número de Seções: {len(pe.sections)}")

# Extrai as DLLs importadas, um forte indicador de funcionalidade
print("\n[+] DLLs Importadas:")
if hasattr(pe, 'DIRECTORY_ENTRY_IMPORT'):
for entry in pe.DIRECTORY_ENTRY_IMPORT:
# Usamos .decode com 'errors=ignore' para evitar problemas com nomes de DLL malformados
print(f" - {entry.dll.decode('utf-8', errors='ignore')}")
else:
print(" Nenhuma DLL importada encontrada (o arquivo pode ser 'packed').")

except pefile.PEFormatError:
print("O arquivo não é um executável PE válido.")
print("Erro: O arquivo não parece ser um executável PE válido.")
except Exception as e:
print(f"Ocorreu um erro inesperado durante a análise do PE: {e}")

# Função principal para realizar a análise de malware
def analyze_file(file_path):
"""Função principal que orquestra a análise completa do arquivo."""
if not os.path.isfile(file_path):
print("Arquivo não encontrado.")
print(f"Erro: Arquivo não encontrado em '{file_path}'")
return

print("Iniciando análise de:", file_path)
print(f"Iniciando análise de: {os.path.basename(file_path)}")

# Calcula o hash SHA-256 do arquivo
file_hash = calculate_sha256(file_path)
print("Hash SHA-256:", file_hash)
if not file_hash:
return # Encerra se não foi possível calcular o hash

print(f"Hash SHA-256: {file_hash}")

# Verifica o hash no VirusTotal
positives, total = check_virustotal(file_hash)
if positives is not None:
print(f"Detecções no VirusTotal: {positives}/{total}")
else:
print("Não foi possível verificar o hash no VirusTotal.")
print(f"Resultado: {positives}/{total} detecções maliciosas.")
if positives > 0:
print("[ALERTA] O arquivo foi identificado como malicioso por um ou mais antivírus.")

# Realiza análise estática no caso de executáveis PE
if file_path.endswith(('.exe', '.dll')):
if file_path.lower().endswith(('.exe', '.dll', '.sys')):
analyze_pe_file(file_path)
else:
print("Análise estática disponível apenas para arquivos PE (EXE/DLL).")
print("\nAnálise estática de PE não aplicável (apenas para .exe, .dll, .sys).")

# Uso do script: python script.py <caminho_do_arquivo>
if __name__ == "__main__":
check_api_key() # Primeiro, verifica se a chave existe

if len(sys.argv) != 2:
print("Uso: python script.py <caminho_do_arquivo>")
print("\nUso: python seu_script.py <caminho_do_arquivo>")
else:
file_path = sys.argv[1]
analyze_file(file_path)
file_to_analyze = sys.argv[1]
analyze_file(file_to_analyze)