Nmap
Nmap
import os
import subprocess
import json
import datetime
import re
import webbrowser
from PyQt5.QtWidgets import (QApplication, QMainWindow, QLabel, QLineEdit,
QPushButton, QTextEdit, QVBoxLayout, QHBoxLayout,
QWidget, QComboBox, QGroupBox, QCheckBox, QTabWidget,
QFileDialog, QMessageBox, QProgressBar, QFrame,
QSplitter, QTreeWidget, QTreeWidgetItem, QGridLayout,
QMenu, QAction, QToolBar, QStatusBar, QTableWidget,
QTableWidgetItem, QHeaderView, QInputDialog,
QShortcut,
QSystemTrayIcon, QStyle)
from PyQt5.QtCore import Qt, QThread, pyqtSignal, QTimer, QDateTime, QSettings,
QUrl
from PyQt5.QtGui import QIcon, QFont, QPixmap, QKeySequence, QColor,
QDesktopServices
import platform
class NmapScanThread(QThread):
scan_output = pyqtSignal(str)
scan_complete = pyqtSignal(bool, str)
scan_progress = pyqtSignal(int)
scan_hosts = pyqtSignal(dict)
def run(self):
try:
self.scan_output.emit(f"بدأ الفحص:
{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
command = ["nmap"]
command.extend(self.options.split())
command.append(self.target)
process = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True
)
self.scan_output.emit(line.strip())
hosts_info[current_host]["ports"].append({
"number": port_num,
"type": port_type,
"state": port_state,
"service": port_service
})
process.wait()
self.scan_hosts.emit(hosts_info)
self.scan_output.emit(f"انتهى الفحص:
{datetime.datetime.now().strftime('%Y-%m-%d %H:%M:%S')}")
self.scan_complete.emit(True, xml_output)
except Exception as e:
self.scan_output.emit(f"حدث خطأ: {str(e)}")
self.scan_complete.emit(False, "")
def cancel(self):
self.canceled = True
class VulnerabilityScanner(QThread):
scan_output = pyqtSignal(str)
scan_complete = pyqtSignal(bool)
def run(self):
try:
# أمرnmap معNSE لفحص الثغرات
command = ["nmap", "-sV", "--script", "vuln"]
command.extend(self.options.split())
for target in self.targets:
command.append(target)
process = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True
)
process.wait()
self.scan_output.emit("اكتمل فحص الثغرات.")
self.scan_complete.emit(True)
except Exception as e:
self.scan_output.emit(f"حدث خطأ في فحص الثغرات: {str(e)}")
self.scan_complete.emit(False)
class ReportGenerator:
@staticmethod
def generate_html_report(scan_data, filename):
html = """
<!DOCTYPE html>
<html dir="rtl">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title> تقرير فحصNmap</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 20px;
background-color: #f5f5f5;
}
.container {
background-color: white;
border-radius: 5px;
box-shadow: 0 2px 5px rgba(0,0,0,0.1);
padding: 20px;
max-width: 1200px;
margin: 0 auto;
}
h1, h2, h3 {
color: #2c3e50;
}
.header {
border-bottom: 2px solid #3498db;
padding-bottom: 10px;
margin-bottom: 20px;
}
.host {
margin-bottom: 30px;
border: 1px solid #ddd;
border-radius: 5px;
padding: 15px;
}
table {
width: 100%;
border-collapse: collapse;
margin: 15px 0;
}
th, td {
padding: 12px 15px;
border: 1px solid #ddd;
text-align: right;
}
th {
background-color: #3498db;
color: white;
}
tr:nth-child(even) {
background-color: #f2f2f2;
}
.footer {
margin-top: 30px;
text-align: center;
color: #7f8c8d;
font-size: 0.9em;
}
.open {
color: green;
font-weight: bold;
}
.closed {
color: red;
}
.filtered {
color: orange;
}
.summary {
background-color: #eaf2f8;
padding: 15px;
border-radius: 5px;
margin-bottom: 20px;
}
</style>
</head>
<body>
<div class="container">
<div class="header">
<h1> تقرير فحصNmap</h1>
<p>تاريخ التقرير: """ + datetime.datetime.now().strftime("%Y-
%m-%d %H:%M:%S") + """</p>
</div>
<div class="summary">
<h2><ملخص الفحص/h2>
<p>عدد المضيفات التي تم فحصها: """ +
str(len(scan_data.get("hosts", {}))) + """</p>
</div>
"""
if host_info.get("hostname"):
html += f"<p>اسم المضيف: {host_info['hostname']}</p>"
# جدول المنافذ
ports = host_info.get("ports", [])
if ports:
html += """
<h3><المنافذ المفتوحة/h3>
<table>
<thead>
<tr>
<th><المنفذ/th>
<th><النوع/th>
<th><الحالة/th>
<th><الخدمة/th>
</tr>
</thead>
<tbody>
"""
html += """
</tbody>
</table>
"""
else:
html += "<p><لم يتم العثور على منافذ مفتوحة/p>"
html += "</div>"
<div class="footer">
<p> تم إنشاء هذا التقرير بواسطة برنامج واجهةNmap <الرسومية/p>
</div>
</div>
</body>
</html>
"""
return filename
class NetworkMapGenerator:
@staticmethod
def generate_map(hosts_info, filename):
# إنشاء مخطط الشبكة باستخدامmermaid
mermaid_code = """
graph TD
Internet(( ))الإنترنت--> Router[]الراوتر
"""
return filename
class SavedProfile:
def __init__(self, name, target, options, description=""):
self.name = name
self.target = target
self.options = options
self.description = description
self.created_date = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
class ProfileManager:
def __init__(self, settings):
self.settings = settings
self.profiles = self.load_profiles()
def load_profiles(self):
profiles = []
self.settings.beginGroup("ScanProfiles")
profile_count = self.settings.beginReadArray("profiles")
for i in range(profile_count):
self.settings.setArrayIndex(i)
name = self.settings.value("name")
target = self.settings.value("target")
options = self.settings.value("options")
description = self.settings.value("description", "")
created_date = self.settings.value("created_date",
datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"))
self.settings.endArray()
self.settings.endGroup()
return profiles
def save_profiles(self):
self.settings.beginGroup("ScanProfiles")
self.settings.beginWriteArray("profiles")
self.settings.endArray()
self.settings.endGroup()
self.settings.sync()
def get_profile_names(self):
return [profile.name for profile in self.profiles]
class ScheduledScan:
def __init__(self, name, target, options, schedule_time, repeat=False,
repeat_interval=0):
self.name = name
self.target = target
self.options = options
self.schedule_time = schedule_time # QDateTime
self.repeat = repeat
self.repeat_interval = repeat_interval # بالدقائق
self.last_run = None
self.enabled = True
class ScheduleManager:
def __init__(self, settings):
self.settings = settings
self.scheduled_scans = self.load_scheduled_scans()
def load_scheduled_scans(self):
scans = []
self.settings.beginGroup("ScheduledScans")
scan_count = self.settings.beginReadArray("scans")
for i in range(scan_count):
self.settings.setArrayIndex(i)
name = self.settings.value("name")
target = self.settings.value("target")
options = self.settings.value("options")
schedule_time_str = self.settings.value("schedule_time")
schedule_time = QDateTime.fromString(schedule_time_str, Qt.ISODate)
repeat = self.settings.value("repeat", False, type=bool)
repeat_interval = self.settings.value("repeat_interval", 0, type=int)
last_run_str = self.settings.value("last_run", "")
enabled = self.settings.value("enabled", True, type=bool)
if last_run_str:
scan.last_run = QDateTime.fromString(last_run_str, Qt.ISODate)
scan.enabled = enabled
scans.append(scan)
self.settings.endArray()
self.settings.endGroup()
return scans
def save_scheduled_scans(self):
self.settings.beginGroup("ScheduledScans")
self.settings.beginWriteArray("scans")
if scan.last_run:
self.settings.setValue("last_run",
scan.last_run.toString(Qt.ISODate))
self.settings.setValue("enabled", scan.enabled)
self.settings.endArray()
self.settings.endGroup()
self.settings.sync()
def get_scans_to_run(self):
""""""إرجاع قائمة بالفحوصات التي يجب تشغيلها الآن
current_time = QDateTime.currentDateTime()
scans_to_run = []
if scan.last_run is None:
# لم يتم تشغيلها من قبل
if scan.schedule_time <= current_time:
scans_to_run.append(scan)
elif scan.repeat:
# حساب وقت التشغيل التالي
minutes_since_last_run = scan.last_run.secsTo(current_time) / 60
if minutes_since_last_run >= scan.repeat_interval:
scans_to_run.append(scan)
return scans_to_run
class HostDiscoveryThread(QThread):
discovery_output = pyqtSignal(str)
discovery_complete = pyqtSignal(list)
process = subprocess.Popen(
command,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
universal_newlines=True
)
# البحث عن عناوينIP
if "Nmap scan report for" in line:
ip_match = re.search(r"for\s+(.+)\s+\((.+)\)", line)
if ip_match:
hostname = ip_match.group(1)
ip = ip_match.group(2)
hosts.append({"ip": ip, "hostname": hostname})
else:
# عنوانIP فقط
ip_match = re.search(r"for\s+(.+)", line)
if ip_match:
ip = ip_match.group(1)
hosts.append({"ip": ip, "hostname": ""})
process.wait()
self.discovery_output.emit(f" تم العثور على.اكتمل اكتشاف المضيفات
{len(hosts)} مضيف.")
self.discovery_complete.emit(hosts)
except Exception as e:
self.discovery_output.emit(f"حدث خطأ في اكتشاف المضيفات: {str(e)}")
self.discovery_complete.emit([])
class PortSuggestionHelper:
@staticmethod
def get_common_ports():
""""""إرجاع قائمة بالمنافذ الشائعة مع وصفها
return {
"21": "FTP",
"22": "SSH",
"23": "Telnet",
"25": "SMTP",
"53": "DNS",
"80": "HTTP",
"110": "POP3",
"115": "SFTP",
"135": "RPC",
"139": "NetBIOS",
"143": "IMAP",
"194": "IRC",
"443": "HTTPS",
"445": "SMB",
"1433": "MSSQL",
"1723": "PPTP",
"3306": "MySQL",
"3389": "RDP",
"5432": "PostgreSQL",
"5900": "VNC",
"8080": "HTTP Proxy"
}
@staticmethod
def get_port_groups():
""""""إرجاع مجموعات المنافذ الشائعة
return {
"23,25,53,80,110,143,443-20" :""المنافذ الأساسية,
"80,443,8080,8443" :""منافذ الويب,
"1433,1521,3306,5432,6379,27017" :""منافذ قواعد البيانات,
"22,23,3389,5900" :""منافذ الإدارة عن بعد,
"25,110,143,465,587,993,995" :""منافذ البريد الإلكتروني,
"135,139,445,3389" :""منافذ ويندوز,
" منفذ100 "أفضل: "--top-ports 100",
" منفذ1000 "أفضل: "--top-ports 1000"
}
class NmapGUI(QMainWindow):
def __init__(self):
super().__init__()
# إعدادات التطبيق
self.settings = QSettings("NmapGUI", "NmapScanner")
# المتغيرات
self.scan_history = []
self.current_hosts_info = {}
self.scheduled_scan_timer = QTimer()
self.scheduled_scan_timer.timeout.connect(self.check_scheduled_scans)
self.scheduled_scan_timer.start(60000) # التحقق كل دقيقة
self.initUI()
self.load_settings()
def setup_system_tray(self):
self.tray_icon = QSystemTrayIcon(self)
self.tray_icon.setIcon(self.style().standardIcon(QStyle.SP_ComputerIcon))
tray_menu.addAction(show_action)
tray_menu.addSeparator()
tray_menu.addAction(quit_action)
self.tray_icon.setContextMenu(tray_menu)
self.tray_icon.activated.connect(self.tray_icon_activated)
def toggle_window_visibility(self):
if self.isVisible():
self.hide()
else:
self.show()
self.setWindowState(self.windowState() & ~Qt.WindowMinimized |
Qt.WindowActive)
self.activateWindow()
def initUI(self):
self.setWindowTitle(" أداةNmap واجهة المستخدم الرسومية- )"المتقدمة
self.setGeometry(100, 100, 1000, 700)
self.tabs.addTab(self.scan_tab, ")"الفحص
self.tabs.addTab(self.discovery_tab, ")"اكتشاف المضيفات
self.tabs.addTab(self.vulnerability_tab, ")"فحص الثغرات
self.tabs.addTab(self.history_tab, ")"السجل
self.tabs.addTab(self.profiles_tab, ")"الملفات الشخصية
self.tabs.addTab(self.schedule_tab, ")"جدولة الفحص
self.tabs.addTab(self.reports_tab, ")"التقارير
self.tabs.addTab(self.settings_tab, ")"الإعدادات