Merge pull request #1 from ampersandcastles/qt

Qt
This commit is contained in:
Tristan 2024-06-09 22:18:00 -04:00 committed by GitHub
commit 724662be42
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

104
qt.py Normal file
View file

@ -0,0 +1,104 @@
from PyQt5.QtWidgets import QApplication, QMainWindow, QVBoxLayout, QWidget, QTreeWidget, QTreeWidgetItem, QPushButton, QFileDialog, QLabel
from PyQt5.QtCore import Qt
from scapy.all import IP, UDP, Ether, sniff
import webbrowser
import sys
import threading
import os
# Define the destination IP address and UDP ports to filter
destination_ip = '255.255.255.255' # Destination IP address
source_port = 14236 # Source port
destination_port = 14235 # Destination port
# Username and password for the miners
username = "root"
password = "root"
class IPReporter(QMainWindow):
def __init__(self):
super().__init__()
self.setWindowTitle("IP Reporter")
self.setGeometry(100, 100, 600, 400)
self.central_widget = QWidget()
self.setCentralWidget(self.central_widget)
self.layout = QVBoxLayout(self.central_widget)
self.tree = QTreeWidget()
self.tree.setHeaderLabels(["IP Address", "MAC Address"])
self.tree.setColumnWidth(1, 400)
self.layout.addWidget(self.tree)
self.tree.itemDoubleClicked.connect(self.open_in_browser)
self.start_button = QPushButton("Start")
self.start_button.clicked.connect(self.toggle_listening)
self.layout.addWidget(self.start_button)
self.export_button = QPushButton("Export")
self.export_button.clicked.connect(self.export_data)
self.layout.addWidget(self.export_button)
self.status_label = QLabel("Stopped")
self.layout.addWidget(self.status_label)
self.listening = False
def extract_packet_info(self, packet):
# Check if the packet is an IP packet with UDP layer
if IP in packet and UDP in packet:
# Extract the source IP address, source port, and destination port
source_ip = packet[IP].src
udp_source_port = packet[UDP].sport
udp_destination_port = packet[UDP].dport
# Check if the packet matches the specified destination IP address and UDP ports
if (packet[IP].dst == destination_ip and
udp_source_port == source_port and
udp_destination_port == destination_port):
# Extract the MAC address from the Ethernet layer
source_mac = packet[Ether].src
# Display the information in the tree view
self.tree.addTopLevelItem(QTreeWidgetItem([source_ip, source_mac]))
def listen_for_packets(self):
sniff(prn=self.extract_packet_info, filter="udp and ip", store=0)
def toggle_listening(self):
if not self.listening:
# Start listening for packets in a separate thread
threading.Thread(target=self.listen_for_packets, daemon=True).start()
self.start_button.setText("Stop")
self.status_label.setText("Listening...")
self.listening = True
else:
# Stop listening for packets (terminate the program)
self.start_button.setText("Start")
self.status_label.setText("Stopped")
self.listening = False
def export_data(self):
options = QFileDialog.Options()
file_path, _ = QFileDialog.getSaveFileName(self, "Save File", "", "Text Files (*.txt);;All Files (*)", options=options)
if file_path:
with open(file_path, "w") as file:
for i in range(self.tree.topLevelItemCount()):
item = self.tree.topLevelItem(i)
ip_address = item.text(0)
mac_address = item.text(1)
file.write(f"IP Address: {ip_address}, MAC Address: {mac_address}\n")
self.status_label.setText(f"Data exported to {file_path}")
def open_in_browser(self, item):
ip_address = item.text(0)
url = f"http://{username}:{password}@{ip_address}"
webbrowser.open(url)
if __name__ == "__main__":
app = QApplication(sys.argv)
window = IPReporter()
window.show()
sys.exit(app.exec_())