diff --git a/README.md b/README.md index 94f2981..83181eb 100644 --- a/README.md +++ b/README.md @@ -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 +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 -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 -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 -# 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. diff --git a/malware_analysis.py b/malware_analysis.py index 340d433..24b3c49 100644 --- a/malware_analysis.py +++ b/malware_analysis.py @@ -1,4 +1,4 @@ -pip install requests pefile +# -*- coding: utf-8 -*- import requests import hashlib @@ -6,75 +6,127 @@ 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 if __name__ == "__main__": + check_api_key() # Primeiro, verifica se a chave existe + if len(sys.argv) != 2: - print("Uso: python script.py ") + print("\nUso: python seu_script.py ") else: - file_path = sys.argv[1] - analyze_file(file_path) + file_to_analyze = sys.argv[1] + analyze_file(file_to_analyze)