mirror of
https://github.com/CyberSecurityUP/shellcode-tester-pro/
synced 2026-06-06 15:34:29 +00:00
126 lines
4.7 KiB
Python
126 lines
4.7 KiB
Python
import os
|
|
import requests
|
|
from PyQt5.QtWidgets import (
|
|
QWidget, QVBoxLayout, QLabel, QPushButton, QFileDialog,
|
|
QLineEdit, QTextEdit, QMessageBox
|
|
)
|
|
from PyQt5.QtCore import QTimer
|
|
|
|
class VirusTotalPlugin(QWidget):
|
|
def __init__(self, parent=None):
|
|
super().__init__(parent)
|
|
self.setWindowTitle("Integração VirusTotal")
|
|
self.api_key = ""
|
|
self.file_path = ""
|
|
self.analysis_id = ""
|
|
self.timer = None
|
|
self.init_ui()
|
|
|
|
def init_ui(self):
|
|
layout = QVBoxLayout()
|
|
|
|
self.api_input = QLineEdit()
|
|
self.api_input.setPlaceholderText("Insira sua API Key do VirusTotal")
|
|
layout.addWidget(QLabel("API Key:"))
|
|
layout.addWidget(self.api_input)
|
|
|
|
self.select_file_btn = QPushButton("Selecionar Arquivo")
|
|
self.select_file_btn.clicked.connect(self.select_file)
|
|
layout.addWidget(self.select_file_btn)
|
|
|
|
self.send_btn = QPushButton("Enviar para Análise")
|
|
self.send_btn.clicked.connect(self.send_to_virustotal)
|
|
layout.addWidget(self.send_btn)
|
|
|
|
self.result_output = QTextEdit()
|
|
self.result_output.setReadOnly(True)
|
|
layout.addWidget(QLabel("Resultado da Análise:"))
|
|
layout.addWidget(self.result_output)
|
|
|
|
self.setLayout(layout)
|
|
|
|
def select_file(self):
|
|
file_path, _ = QFileDialog.getOpenFileName(
|
|
self,
|
|
"Selecionar arquivo",
|
|
"",
|
|
"Arquivos Executáveis (*.bin *.exe *.dll *.elf *.out)"
|
|
)
|
|
if file_path:
|
|
self.file_path = file_path
|
|
self.result_output.append(f"[+] Arquivo selecionado: {file_path}")
|
|
|
|
def send_to_virustotal(self):
|
|
self.api_key = self.api_input.text().strip()
|
|
if not self.api_key:
|
|
self.result_output.setText("[!] API Key não fornecida.")
|
|
return
|
|
|
|
if not os.path.isfile(self.file_path):
|
|
self.result_output.setText("[!] Nenhum arquivo selecionado ou caminho inválido.")
|
|
return
|
|
|
|
try:
|
|
self.result_output.append("[*] Enviando arquivo para o VirusTotal...")
|
|
url = "https://www.virustotal.com/api/v3/files"
|
|
headers = {"x-apikey": self.api_key}
|
|
with open(self.file_path, "rb") as f:
|
|
files = {"file": f}
|
|
response = requests.post(url, headers=headers, files=files)
|
|
|
|
if response.status_code == 200:
|
|
json_data = response.json()
|
|
self.analysis_id = json_data.get("data", {}).get("id")
|
|
self.result_output.append(f"[+] Envio bem-sucedido. ID da Análise: {self.analysis_id}")
|
|
self.result_output.append("[*] Aguardando resultado da análise...")
|
|
self.start_timer()
|
|
else:
|
|
self.result_output.append(f"[!] Falha no envio: {response.status_code} {response.text}")
|
|
except Exception as e:
|
|
self.result_output.append(f"[!] Erro ao enviar para o VirusTotal: {str(e)}")
|
|
|
|
def start_timer(self):
|
|
if self.timer:
|
|
self.timer.stop()
|
|
|
|
self.timer = QTimer(self)
|
|
self.timer.timeout.connect(self.poll_analysis)
|
|
self.timer.start(4000) # a cada 4 segundos
|
|
|
|
def poll_analysis(self):
|
|
if not self.analysis_id:
|
|
self.result_output.append("[!] ID de análise não disponível.")
|
|
self.timer.stop()
|
|
return
|
|
|
|
url = f"https://www.virustotal.com/api/v3/analyses/{self.analysis_id}"
|
|
headers = {"x-apikey": self.api_key}
|
|
|
|
try:
|
|
response = requests.get(url, headers=headers)
|
|
if response.status_code == 200:
|
|
json_data = response.json()
|
|
status = json_data.get("data", {}).get("attributes", {}).get("status")
|
|
|
|
if status == "completed":
|
|
self.timer.stop()
|
|
stats = json_data["data"]["attributes"].get("stats", {})
|
|
self.result_output.append("\n[+] Análise Concluída:")
|
|
self.result_output.append(f" ✅ Harmless: {stats.get('harmless', 0)}")
|
|
self.result_output.append(f" ⚠️ Suspicious: {stats.get('suspicious', 0)}")
|
|
self.result_output.append(f" ❌ Malicious: {stats.get('malicious', 0)}")
|
|
else:
|
|
self.result_output.append("[*] Ainda processando...")
|
|
|
|
else:
|
|
self.timer.stop()
|
|
self.result_output.append(f"[!] Erro ao verificar análise: {response.status_code}")
|
|
|
|
except Exception as e:
|
|
self.timer.stop()
|
|
self.result_output.append(f"[!] Erro durante verificação: {str(e)}")
|
|
|
|
def register(main_app):
|
|
tab = VirusTotalPlugin()
|
|
main_app.tabs.addTab(tab, "VirusTotal")
|