From a6f7f951b84bc4ae21beac7d05309607eb442ad0 Mon Sep 17 00:00:00 2001 From: savio-code Date: Fri, 7 Sep 2018 16:01:23 +0100 Subject: [PATCH] Ported project from PyQt4 to PyQt5 --- Fern-Wifi-Cracker/core/database.py | 47 +-- Fern-Wifi-Cracker/core/fern.py | 166 ++++++----- .../core/toolbox/bruteforce_core.py | 75 ++--- .../core/toolbox/cookie_hijacker_core.py | 25 +- .../core/toolbox/fern_cookie_hijacker.py | 92 +++--- .../core/toolbox/fern_ray_fusion.py | 78 ++--- .../core/toolbox/fern_tracker.py | 39 +-- Fern-Wifi-Cracker/core/tools.py | 68 ++--- Fern-Wifi-Cracker/core/wep.py | 182 +++++++----- Fern-Wifi-Cracker/core/wpa.py | 174 ++++++----- Fern-Wifi-Cracker/core/wps.py | 32 +- Fern-Wifi-Cracker/execute.py | 6 +- Fern-Wifi-Cracker/gui/attack_panel.py | 236 +++++++-------- Fern-Wifi-Cracker/gui/attack_settings.py | 52 ++-- Fern-Wifi-Cracker/gui/cookie_hijacker.py | 213 +++++++------- Fern-Wifi-Cracker/gui/database.py | 66 ++--- Fern-Wifi-Cracker/gui/fern_pro_tip.py | 85 +++--- Fern-Wifi-Cracker/gui/font_settings.py | 66 ++--- Fern-Wifi-Cracker/gui/geotrack.py | 118 ++++---- Fern-Wifi-Cracker/gui/main_window.py | 278 +++++++++--------- Fern-Wifi-Cracker/gui/ray_fusion.py | 253 ++++++++-------- Fern-Wifi-Cracker/gui/settings.py | 72 +++-- Fern-Wifi-Cracker/gui/tips.py | 48 +-- Fern-Wifi-Cracker/gui/toolbox.py | 107 ++++--- Fern-Wifi-Cracker/resources/splash.png | Bin 56801 -> 66594 bytes Fern-Wifi-Cracker/version | 2 +- 26 files changed, 1331 insertions(+), 1249 deletions(-) diff --git a/Fern-Wifi-Cracker/core/database.py b/Fern-Wifi-Cracker/core/database.py index b1e658c..9f3f28d 100644 --- a/Fern-Wifi-Cracker/core/database.py +++ b/Fern-Wifi-Cracker/core/database.py @@ -1,4 +1,5 @@ import core +from PyQt5.QtWidgets import * from gui.database import * from core.functions import * from core.variables import * @@ -6,18 +7,20 @@ # # Class for Database key entries # -class database_dialog(QtGui.QDialog,database_ui): +class database_dialog(QtWidgets.QDialog,database_ui): + update_database_label_signal = QtCore.pyqtSignal() + def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) self.setWindowModality(QtCore.Qt.ApplicationModal) self.display_keys() - self.connect(self.insert_button,QtCore.SIGNAL("clicked()"),self.insert_row) - self.connect(self.delete_button,QtCore.SIGNAL("clicked()"),self.delete_row) - self.connect(self.save_button,QtCore.SIGNAL("clicked()"),self.save_changes) + self.insert_button.clicked.connect(self.insert_row) + self.delete_button.clicked.connect(self.delete_row) + self.save_button.clicked.connect(self.save_changes) @@ -48,25 +51,25 @@ def display_keys(self): self.key_table.insertRow(iterate) - access_point_display = QtGui.QTableWidgetItem() - mac_address_display = QtGui.QTableWidgetItem() - encryption_display = QtGui.QTableWidgetItem() - key_display = QtGui.QTableWidgetItem() - channel_display = QtGui.QTableWidgetItem() + access_point_display = QtWidgets.QTableWidgetItem() + mac_address_display = QtWidgets.QTableWidgetItem() + encryption_display = QtWidgets.QTableWidgetItem() + key_display = QtWidgets.QTableWidgetItem() + channel_display = QtWidgets.QTableWidgetItem() - access_point_display.setText(QtGui.QApplication.translate("Dialog", "%s"%(access_point_var), None, QtGui.QApplication.UnicodeUTF8)) + access_point_display.setText(QtCore.QCoreApplication.translate("Dialog", "%s"%(access_point_var), None, 0)) self.key_table.setItem(iterate,0,access_point_display) - mac_address_display.setText(QtGui.QApplication.translate("Dialog", "%s"%(mac_address_var), None, QtGui.QApplication.UnicodeUTF8)) + mac_address_display.setText(QtCore.QCoreApplication.translate("Dialog", "%s"%(mac_address_var), None, 0)) self.key_table.setItem(iterate,1,mac_address_display) - encryption_display.setText(QtGui.QApplication.translate("Dialog", "%s"%(encryption_var), None, QtGui.QApplication.UnicodeUTF8)) + encryption_display.setText(QtCore.QCoreApplication.translate("Dialog", "%s"%(encryption_var), None, 0)) self.key_table.setItem(iterate,2,encryption_display) - key_display.setText(QtGui.QApplication.translate("Dialog", "%s"%(key_var), None, QtGui.QApplication.UnicodeUTF8)) + key_display.setText(QtCore.QCoreApplication.translate("Dialog", "%s"%(key_var), None, 0)) self.key_table.setItem(iterate,3,key_display) - channel_display.setText(QtGui.QApplication.translate("Dialog", "%s"%(channel_var), None, QtGui.QApplication.UnicodeUTF8)) + channel_display.setText(QtCore.QCoreApplication.translate("Dialog", "%s"%(channel_var), None, 0)) self.key_table.setItem(iterate,4,channel_display) @@ -84,11 +87,11 @@ def save_changes(self): for controller in range(row_number): try: - access_point1 = QtGui.QTableWidgetItem(self.key_table.item(controller,0)) # Get Cell content - mac_address1 = QtGui.QTableWidgetItem(self.key_table.item(controller,1)) - encryption1 = QtGui.QTableWidgetItem(self.key_table.item(controller,2)) - key1 = QtGui.QTableWidgetItem(self.key_table.item(controller,3)) - channel1 = QtGui.QTableWidgetItem(self.key_table.item(controller,4)) + access_point1 = QtWidgets.QTableWidgetItem(self.key_table.item(controller,0)) # Get Cell content + mac_address1 = QtWidgets.QTableWidgetItem(self.key_table.item(controller,1)) + encryption1 = QtWidgets.QTableWidgetItem(self.key_table.item(controller,2)) + key1 = QtWidgets.QTableWidgetItem(self.key_table.item(controller,3)) + channel1 = QtWidgets.QTableWidgetItem(self.key_table.item(controller,4)) access_point = str(access_point1.text()) # Get cell content text mac_address = str(mac_address1.text()) @@ -103,10 +106,10 @@ def save_changes(self): set_key_entries(access_point,mac_address,encryption,key,channel) # Write enrties to database except(TypeError): - QtGui.QMessageBox.warning(self,"Empty Database Entries",\ + QtWidgets.QMessageBox.warning(self,"Empty Database Entries",\ "There are some fields with whitespaces,Please enter empty spaces with Access Point related data") break - self.emit(QtCore.SIGNAL('update database label')) # Update the Entries label on Main window + self.update_database_label_signal.emit() diff --git a/Fern-Wifi-Cracker/core/fern.py b/Fern-Wifi-Cracker/core/fern.py index 29e6b8d..795e4f0 100644 --- a/Fern-Wifi-Cracker/core/fern.py +++ b/Fern-Wifi-Cracker/core/fern.py @@ -10,7 +10,7 @@ import subprocess import variables -from PyQt4 import QtGui,QtCore +from PyQt5 import QtCore, QtGui, QtWidgets from wep import * from wpa import * @@ -23,14 +23,35 @@ from gui.main_window import * -__version__= 2.6 +__version__= 2.7 # # Main Window Class # -class mainwindow(QtGui.QDialog,Ui_Dialog): +class mainwindow(QtWidgets.QDialog,Ui_Dialog): + file_downloaded_signal = QtCore.pyqtSignal() + finished_downloading_signal = QtCore.pyqtSignal() + internal_scan_error_signal = QtCore.pyqtSignal() + restart_application_signal = QtCore.pyqtSignal() + download_failed_signal = QtCore.pyqtSignal() + current_version_signal = QtCore.pyqtSignal() + new_update_available_signal = QtCore.pyqtSignal() + already_latest_update_signal = QtCore.pyqtSignal() + previous_message_signal = QtCore.pyqtSignal() + failed_update_signal = QtCore.pyqtSignal() + interface_cards_not_found_signal = QtCore.pyqtSignal() + interface_cards_found_signal = QtCore.pyqtSignal() + monitor_mode_enabled_signal = QtCore.pyqtSignal() + monitor_failed_signal = QtCore.pyqtSignal() + wep_number_changed_signal = QtCore.pyqtSignal() + wep_button_true_signal = QtCore.pyqtSignal() + wep_button_false_signal = QtCore.pyqtSignal() + wpa_button_false_signal = QtCore.pyqtSignal() + wpa_button_true_signal = QtCore.pyqtSignal() + wpa_number_changed_signal = QtCore.pyqtSignal() + def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) self.refresh_interface() @@ -50,42 +71,42 @@ def __init__(self): self.settings = Fern_settings() self.timer = QtCore.QTimer() - self.connect(self.timer,QtCore.SIGNAL("timeout()"),self.display_timed_objects) - self.timer.setInterval(4000) - self.timer.start() - - self.connect(self,QtCore.SIGNAL("DoubleClicked()"),self.mouseDoubleClickEvent) - self.connect(self.refresh_intfacebutton,QtCore.SIGNAL("clicked()"),self.refresh_interface) - self.connect(self.interface_combo,QtCore.SIGNAL("currentIndexChanged(QString)"),self.setmonitor) - self.connect(self,QtCore.SIGNAL("monitor mode enabled"),self.monitor_mode_enabled) - self.connect(self,QtCore.SIGNAL("monitor_failed()"),self.display_error_monitor) - self.connect(self,QtCore.SIGNAL("interface cards found"),self.interface_cards_found) - self.connect(self,QtCore.SIGNAL("interface cards not found"),self.interface_card_not_found) - self.connect(self.scan_button,QtCore.SIGNAL("clicked()"),self.scan_network) - self.connect(self.wep_button,QtCore.SIGNAL("clicked()"),self.wep_attack_window) - self.connect(self.wpa_button,QtCore.SIGNAL("clicked()"),self.wpa_attack_window) - self.connect(self.tool_button,QtCore.SIGNAL("clicked()"),self.tool_box_window) - - self.connect(self,QtCore.SIGNAL("wep_number_changed"),self.wep_number_changed) - self.connect(self,QtCore.SIGNAL("wep_button_true"),self.wep_button_true) - self.connect(self,QtCore.SIGNAL("wep_button_false"),self.wep_button_false) - - self.connect(self,QtCore.SIGNAL("wpa_number_changed"),self.wpa_number_changed) - self.connect(self,QtCore.SIGNAL("wpa_button_true"),self.wpa_button_true) - self.connect(self,QtCore.SIGNAL("wpa_button_false"),self.wpa_button_false) - - self.connect(self.database_button,QtCore.SIGNAL("clicked()"),self.database_window) - self.connect(self.update_button,QtCore.SIGNAL("clicked()"),self.update_fern) - self.connect(self,QtCore.SIGNAL("finished downloading"),self.finished_downloading_files) - self.connect(self,QtCore.SIGNAL("restart application"),self.restart_application) - self.connect(self,QtCore.SIGNAL("failed update"),self.update_fail) - self.connect(self,QtCore.SIGNAL("already latest update"),self.latest_update) - self.connect(self,QtCore.SIGNAL("previous message"),self.latest_svn) - self.connect(self,QtCore.SIGNAL("new update available"),self.new_update_avialable) - self.connect(self,QtCore.SIGNAL("current_version"),self.current_update) - self.connect(self,QtCore.SIGNAL("download failed"),self.download_failed) - self.connect(self,QtCore.SIGNAL('internal scan error'),self.scan_error_display) - self.connect(self,QtCore.SIGNAL('file downloaded'),self.downloading_update_files) + self.timer.timeout.connect(self.display_timed_objects) + self.timer.setInterval(3000) + + + #self.DoubleClicked.connect(self.mouseDoubleClickEvent) + self.refresh_intfacebutton.clicked.connect(self.refresh_interface) + self.interface_combo.currentIndexChanged['QString'].connect(self.setmonitor) + self.monitor_mode_enabled_signal.connect(self.monitor_mode_enabled) + self.monitor_failed_signal.connect(self.display_error_monitor) + self.interface_cards_found_signal.connect(self.interface_cards_found) + self.interface_cards_not_found_signal.connect(self.interface_card_not_found) + self.scan_button.clicked.connect(self.scan_network) + self.wep_button.clicked.connect(self.wep_attack_window) + self.wpa_button.clicked.connect(self.wpa_attack_window) + self.tool_button.clicked.connect(self.tool_box_window) + + self.wep_number_changed_signal.connect(self.wep_number_changed) + self.wep_button_true_signal.connect(self.wep_button_true) + self.wep_button_false_signal.connect(self.wep_button_false) + + self.wpa_number_changed_signal.connect(self.wpa_number_changed) + self.wpa_button_true_signal.connect(self.wpa_button_true) + self.wpa_button_false_signal.connect(self.wpa_button_false) + + self.database_button.clicked.connect(self.database_window) + self.update_button.clicked.connect(self.update_fern) + self.finished_downloading_signal.connect(self.finished_downloading_files) + self.restart_application_signal.connect(self.restart_application) + self.failed_update_signal.connect(self.update_fail) + self.already_latest_update_signal.connect(self.latest_update) + self.previous_message_signal.connect(self.latest_svn) + self.new_update_available_signal.connect(self.new_update_avialable) + self.current_version_signal.connect(self.current_update) + self.download_failed_signal.connect(self.download_failed) + self.internal_scan_error_signal.connect(self.scan_error_display) + self.file_downloaded_signal.connect(self.downloading_update_files) self.update_label.setText('Currently installed version: Revision %s'%(self.installed_revision())) @@ -253,10 +274,10 @@ def update_launcher(self): response = svn_update.readline() if len(response) > 0: files_downloaded += 1 - self.emit(QtCore.SIGNAL('file downloaded')) + self.file_downloaded_signal.emit() if str('revision') in str(response): - self.emit(QtCore.SIGNAL("finished downloading")) + self.finished_downloading_signal.emit() # Delete all old files (*.py,*.py etc) except ".font_setting.dat" file for old_file in os.listdir(os.getcwd()): if os.path.isfile(os.getcwd() + os.sep + old_file) and old_file != '.font_settings.dat': @@ -276,14 +297,14 @@ def update_launcher(self): os.chmod(os.getcwd() + os.sep + new_file,0777) time.sleep(5) - self.emit(QtCore.SIGNAL("restart application")) + self.restart_application_signal.emit() break if len(svn_failure_message) > 2: - self.emit(QtCore.SIGNAL("download failed")) + self.download_failed_signal.emit() break except(urllib2.URLError,urllib2.HTTPError): - self.emit(QtCore.SIGNAL("download failed")) + self.download_failed_signal.emit() # @@ -307,17 +328,17 @@ def update_initializtion_check(self): update_version_number = float(online_response_string.split()[2]) if float(__version__) != update_version_number: - self.emit(QtCore.SIGNAL("new update available")) + self.new_update_available_signal.emit() break if float(__version__) == update_version_number: - self.emit(QtCore.SIGNAL("already latest update")) + self.already_latest_update_signal.emit() time.sleep(20) - self.emit(QtCore.SIGNAL("previous message")) + self.previous_message_signal.emit() break except Exception: - self.emit(QtCore.SIGNAL("failed update")) + self.failed_update_signal.emit() time.sleep(9) # @@ -336,8 +357,8 @@ def wep_attack_window(self): variables.exec_command('rm -r /tmp/fern-log/WEP-DUMP/*') wep_run = wep_attack_dialog() - self.connect(wep_run,QtCore.SIGNAL('update database label'),self.update_database_label) - self.connect(wep_run,QtCore.SIGNAL("stop scan"),self.stop_network_scan) + wep_run.update_database_label_signal.connect(self.update_database_label) + wep_run.stop_scan_signal.connect(self.stop_network_scan) wep_run.exec_() @@ -352,8 +373,8 @@ def wpa_attack_window(self): variables.exec_command('rm -r /tmp/fern-log/WPA-DUMP/*') wpa_run = wpa_attack_dialog() - self.connect(wpa_run,QtCore.SIGNAL('update database label'),self.update_database_label) - self.connect(wpa_run,QtCore.SIGNAL("stop scan"),self.stop_network_scan) + wpa_run.update_database_label_signal.connect(self.update_database_label) + wpa_run.stop_scan_signal.connect(self.stop_network_scan) wpa_run.exec_() # @@ -361,7 +382,7 @@ def wpa_attack_window(self): # def database_window(self): database_run = database_dialog() - self.connect(database_run,QtCore.SIGNAL('update database label'),self.update_database_label) + database_run.update_database_label_signal.connect(self.update_database_label) database_run.exec_() # # Refresh wireless network interface card and update combobo @@ -396,14 +417,14 @@ def refresh_card_thread(self): interface_list = os.listdir('/sys/class/net') # Interate over interface output and update combo box if compatible_interface.count('\t') == 0: - self.emit(QtCore.SIGNAL("interface cards not found")) + self.interface_cards_not_found_signal.emit() else: for interface in interface_list: if interface in compatible_interface: if not interface.startswith('mon'): self.interface_cards.append(interface) - self.emit(QtCore.SIGNAL("interface cards found")) + self.interface_cards_found_signal.emit() @@ -508,7 +529,7 @@ def set_monitor_thread(self,monitor_card,mac_setting_exists,last_settings): variables.monitor_interface = self.monitor_interface self.interface_combo.setEnabled(False) variables.wps_functions.monitor_interface = self.monitor_interface - self.emit(QtCore.SIGNAL("monitor mode enabled")) + self.monitor_mode_enabled_signal.emit() # Create Fake Mac Address and index for use mon_down = commands.getstatusoutput('ifconfig %s down'%(self.monitor_interface)) @@ -526,7 +547,7 @@ def set_monitor_thread(self,monitor_card,mac_setting_exists,last_settings): variables.monitor_mac_address = reader('/sys/class/net/' + self.monitor_interface + '/address').strip() variables.wps_functions.monitor_mac_address = variables.monitor_mac_address else: - self.emit(QtCore.SIGNAL("monitor_failed()")) + self.monitor_failed_signal.emit() @@ -572,7 +593,7 @@ def mouseDoubleClickEvent(self, event): def scan_error_display(self): global error_catch self.stop_scan_network() - QtGui.QMessageBox.warning(self,'Scan Error','Fern failed to start scan due to an airodump-ng error: ' \ + QtWidgets.QMessageBox.warning(self,'Scan Error','Fern failed to start scan due to an airodump-ng error: ' \ + error_catch[1] + '') @@ -608,8 +629,8 @@ def scan_network(self): self.wpa_clientlabel.setText("None Detected") self.label_7.setText("\t Initializing") thread.start_new_thread(self.scan_wep,()) - self.disconnect(self.scan_button,QtCore.SIGNAL("clicked()"),self.scan_network) - self.connect(self.scan_button,QtCore.SIGNAL("clicked()"),self.stop_scan_network) + self.scan_button.clicked.disconnect(self.scan_network) + self.scan_button.clicked.connect(self.stop_scan_network) @@ -624,8 +645,8 @@ def stop_scan_network(self): variables.wps_functions.stop_WPS_Scanning() # Stops WPS scanning self.wep_clientlabel.setText("None Detected") self.wpa_clientlabel.setText("None Detected") - self.disconnect(self.scan_button,QtCore.SIGNAL("clicked()"),self.stop_scan_network) - self.connect(self.scan_button,QtCore.SIGNAL("clicked()"),self.scan_network) + self.scan_button.clicked.disconnect(self.stop_scan_network) + self.scan_button.clicked.connect(self.scan_network) @@ -785,10 +806,10 @@ def scan_wep(self): self.wep_count = str(wep_access_file.count('WEP')/2) # number of access points wep detected if int(self.wep_count) > 0: - self.emit(QtCore.SIGNAL("wep_number_changed")) - self.emit(QtCore.SIGNAL("wep_button_true")) + self.wep_number_changed_signal.emit() + self.wep_button_true_signal.emit() else: - self.emit(QtCore.SIGNAL("wep_button_false")) + self.wep_button_false_signal.emit() for iterate in range(len(process)): detail_process1 = process[iterate] @@ -811,12 +832,12 @@ def scan_wep(self): self.wpa_count = str(read_wpa.count('WPA')) # number of access points wep detected if int(self.wpa_count) == 0: - self.emit(QtCore.SIGNAL("wpa_button_false")) + self.wpa_button_false_signal.emit() elif int(self.wpa_count >= 1): - self.emit(QtCore.SIGNAL("wpa_button_true")) - self.emit(QtCore.SIGNAL("wpa_number_changed")) + self.wpa_button_true_signal.emit() + self.wpa_number_changed_signal.emit() else: - self.emit(QtCore.SIGNAL("wpa_button_false")) + self.wpa_button_false_signal.emit() wpa_access_convert = wpa_access_file[0:wpa_access_file.index('Station MAC')] wpa_access_process = wpa_access_convert[wpa_access_convert.index('Key'):-1] @@ -841,9 +862,12 @@ def scan_wep(self): pass + def showEvent(self,event): + self.timer.start() + def evaliate_permissions(self): if os.geteuid() != 0: - QtGui.QMessageBox.warning(self,"Insufficient Priviledge","Aircrack and other dependencies need root priviledge to function, Please run application as root") + QtWidgets.QMessageBox.warning(self,"Insufficient Priviledge","Aircrack and other dependencies need root priviledge to function, Please run application as root") sys.exit() diff --git a/Fern-Wifi-Cracker/core/toolbox/bruteforce_core.py b/Fern-Wifi-Cracker/core/toolbox/bruteforce_core.py index 24dc4c9..2b47a1b 100644 --- a/Fern-Wifi-Cracker/core/toolbox/bruteforce_core.py +++ b/Fern-Wifi-Cracker/core/toolbox/bruteforce_core.py @@ -25,14 +25,14 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import re -import time -import base64 -import ftplib -import socket -import urllib2 +import re +import time +import base64 +import ftplib +import socket +import urllib2 -from PyQt4 import QtCore +from PyQt5 import QtCore class HTTP_Authentication(object): @@ -110,6 +110,11 @@ def login_ftp(self,username,password): class Bruteforce_Attack(QtCore.QThread): + successful_login_signal = QtCore.pyqtSignal('QString', 'QString') + We_Got_Error_signal = QtCore.pyqtSignal() + Next_Try_signal = QtCore.pyqtSignal() + Finished_bruteforce_signal = QtCore.pyqtSignal() + def __init__(self): QtCore.QThread.__init__(self) self._timer = 0 @@ -196,49 +201,49 @@ def _run_bruteforce(self): self.next_try_details = (self._calculate_percentage(),username,password) try: self.bruteforce_http_method.login_http(username,password) # TELNET HERE - self.emit(QtCore.SIGNAL("successful_login(QString,QString)"),username,password) + self.successful_login_signal.emit(username, password) except Exception,message: if("connection timed out" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("no route to host" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("error 404" in str(message).lower()): self._error_message = "The remote target returned an HTTP 404 error code, meaning that the requested page does not exist" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("name or service not known" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("unreachable" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("connection refused" in str(message).lower()): self._error_message = "The connection was refused by the remote service, Please try again" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("no address associated" in str(message).lower()): self._error_message = "No address is associated with the target hostname" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if(self.control == False): return - self.emit(QtCore.SIGNAL("Next Try")) + self.Next_Try_signal.emit() time.sleep(self._timer) - self.emit(QtCore.SIGNAL("Finished bruteforce")) + self.Finished_bruteforce_signal.emit() self.control = False @@ -252,44 +257,44 @@ def _run_bruteforce(self): self.next_try_details = (self._calculate_percentage(),username,password) try: if(self.bruteforce_http_method.login_telnet(username,password)): # FTP HERE - self.emit(QtCore.SIGNAL("successful_login(QString,QString)"),username,password) + self.successful_login_signal.emit(username, password) except Exception,message: if("name or service not known" in str(message).lower()): self._error_message = "Unable to resolve target hostname" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("connection timed out" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("no route to host" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("unreachable" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("connection refused" in str(message).lower()): self._error_message = "The connection was refused by the remote service, Please try again" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("no address associated" in str(message).lower()): self._error_message = "No address is associated with the target hostname" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if(self.control == False): return - self.emit(QtCore.SIGNAL("Next Try")) + self.Next_Try_signal.emit() time.sleep(self._timer) - self.emit(QtCore.SIGNAL("Finished bruteforce")) + self.Finished_bruteforce_signal.emit() self.control = False @@ -303,45 +308,45 @@ def _run_bruteforce(self): self.next_try_details = (self._calculate_percentage(),username,password) try: self.bruteforce_http_method.login_ftp(username,password) # FTP HERE - self.emit(QtCore.SIGNAL("successful_login(QString,QString)"),username,password) + self.successful_login_signal.emit(username, password) except Exception,message: if("name or service not known" in str(message).lower()): self._error_message = "Unable to resolve target hostname" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("connection timed out" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("no route to host" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("unreachable" in str(message).lower()): self._error_message = "Unable to connect to the remote address, Connection timed out" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("connection refused" in str(message).lower()): self._error_message = "The connection was refused by the remote service, Please try again" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if("no address associated" in str(message).lower()): self._error_message = "No address is associated with the target hostname" - self.emit(QtCore.SIGNAL("We Got Error")) + self.We_Got_Error_signal.emit() return if(self.control == False): return - self.emit(QtCore.SIGNAL("Next Try")) + self.Next_Try_signal.emit() time.sleep(self._timer) - self.emit(QtCore.SIGNAL("Finished bruteforce")) + self.Finished_bruteforce_signal.emit() self.control = False diff --git a/Fern-Wifi-Cracker/core/toolbox/cookie_hijacker_core.py b/Fern-Wifi-Cracker/core/toolbox/cookie_hijacker_core.py index b51578e..05d65c7 100644 --- a/Fern-Wifi-Cracker/core/toolbox/cookie_hijacker_core.py +++ b/Fern-Wifi-Cracker/core/toolbox/cookie_hijacker_core.py @@ -25,19 +25,22 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import re -import os -import time -import thread -import sqlite3 -import logging -import threading +import re +import os +import time +import thread +import sqlite3 +import logging +import threading -from PyQt4 import QtCore +from PyQt5 import QtCore -from scapy.all import * +from scapy.all import * class Cookie_Hijack_Core(QtCore.QThread): + cookie_buffer_detected_signal = QtCore.pyqtSignal() + New_Cookie_Captured_signal = QtCore.pyqtSignal() + def __init__(self): QtCore.QThread.__init__(self) self.control = True # Starts or Stop Thread processes [True = Start,False = Stop] @@ -162,7 +165,7 @@ def Process_Packet(self,captured_packet): src_addr = captured_packet.getlayer("IP").src # Source Mac address if(self.control): - self.emit(QtCore.SIGNAL("cookie buffer detected")) + self.cookie_buffer_detected_signal.emit() if("Cookie:" in captured_packet.load): @@ -200,7 +203,7 @@ def Process_Packet(self,captured_packet): self.captured_cookie_count += 1 if(self.control): - self.emit(QtCore.SIGNAL("New Cookie Captured")) # Notification Signal for GUI instance + self.New_Cookie_Captured_signal.emit() except AttributeError,message: pass diff --git a/Fern-Wifi-Cracker/core/toolbox/fern_cookie_hijacker.py b/Fern-Wifi-Cracker/core/toolbox/fern_cookie_hijacker.py index 7bc2396..03bfc4c 100644 --- a/Fern-Wifi-Cracker/core/toolbox/fern_cookie_hijacker.py +++ b/Fern-Wifi-Cracker/core/toolbox/fern_cookie_hijacker.py @@ -6,16 +6,24 @@ import commands import subprocess -from PyQt4 import QtCore,QtGui +from PyQt5 import QtCore, QtGui, QtWidgets from gui.cookie_hijacker import * from mozilla_cookie_core import * from cookie_hijacker_core import * -class Fern_Cookie_Hijacker(QtGui.QDialog,Ui_cookie_hijacker): +class Fern_Cookie_Hijacker(QtWidgets.QDialog,Ui_cookie_hijacker): + emit_buffer_red_light_signal = QtCore.pyqtSignal() + creating_cache_signal = QtCore.pyqtSignal() + display_error_signal = QtCore.pyqtSignal('QString') + Deactivate = QtCore.pyqtSignal() + on_sniff_green_light_signal = QtCore.pyqtSignal() + on_sniff_red_light_signal = QtCore.pyqtSignal() + Continue_Sniffing_signal = QtCore.pyqtSignal() + def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) @@ -43,11 +51,11 @@ def __init__(self): self.mozilla_cookie_engine = Mozilla_Cookie_Core() # Mozilla fierfox cookie engine - self.connect(self.refresh_button,QtCore.SIGNAL("clicked()"),self.refresh_interface) - self.connect(self.start_sniffing_button,QtCore.SIGNAL("clicked()"),self.start_Cookie_Attack) - self.connect(self.ethernet_mode_radio,QtCore.SIGNAL("clicked()"),self.set_attack_option) - self.connect(self.passive_mode_radio,QtCore.SIGNAL("clicked()"),self.set_attack_option) - self.connect(self.combo_interface,QtCore.SIGNAL("currentIndexChanged(QString)"),self.reset) + self.refresh_button.clicked.connect(self.refresh_interface) + self.start_sniffing_button.clicked.connect(self.start_Cookie_Attack) + self.ethernet_mode_radio.clicked.connect(self.set_attack_option) + self.passive_mode_radio.clicked.connect(self.set_attack_option) + self.combo_interface.currentIndexChanged['QString'].connect(self.reset) self.connect_objects() self.set_channel_options() @@ -57,17 +65,17 @@ def __init__(self): def connect_objects(self): - self.connect(self,QtCore.SIGNAL("creating cache"),self.creating_cache) - self.connect(self.cookie_core,QtCore.SIGNAL("New Cookie Captured"),self.display_cookie_captured) # Notification Signal for GUI instance")) - self.connect(self.cookie_core,QtCore.SIGNAL("cookie buffer detected"),self.emit_led_buffer) # Notification on new http packet - self.connect(self,QtCore.SIGNAL("emit buffer red light"),self.emit_buffer_red_light) + self.creating_cache_signal.connect(self.creating_cache) + self.cookie_core.New_Cookie_Captured_signal.connect(self.display_cookie_captured) # Notification Signal for GUI instance")) + self.cookie_core.cookie_buffer_detected_signal.connect(self.emit_led_buffer) + self.emit_buffer_red_light_signal.connect(self.emit_buffer_red_light) - self.connect(self,QtCore.SIGNAL("on sniff red light"),self.off_sniff_red_light) # Will bink the sniff led red for some seconds control from blink_light() - self.connect(self,QtCore.SIGNAL("on sniff green light"),self.on_sniff_green_light) # Will bink the sniff led green for some seconds control from blink_light() - self.connect(self,QtCore.SIGNAL("Continue Sniffing"),self.start_Cookie_Attack_part) + self.on_sniff_red_light_signal.connect(self.off_sniff_red_light) # Will bink the sniff led red for some seconds control from blink_light() + self.on_sniff_green_light_signal.connect(self.on_sniff_green_light) # Will bink the sniff led green for some seconds control from blink_light() + self.Continue_Sniffing_signal.connect(self.start_Cookie_Attack_part) - self.connect(self,QtCore.SIGNAL("display_error(QString)"),self.display_error) # Will display any error to main screen - self.connect(self,QtCore.SIGNAL("Deactivate"),self.deactivate) + self.display_error_signal['QString'].connect(self.display_error) + self.Deactivate.connect(self.deactivate) def set_channel_options(self): @@ -108,7 +116,7 @@ def enable_control(self,status): def set_attack_option(self,reset = False): selected_card = str(self.combo_interface.currentText()) if(selected_card == "Select Interface Card"): - QtGui.QMessageBox.warning(self,"Interface Option","Please select a valid interface card from the list of available interfaces") + QtWidgets.QMessageBox.warning(self,"Interface Option","Please select a valid interface card from the list of available interfaces") self.ethernet_mode_radio.setChecked(True) return @@ -118,7 +126,7 @@ def set_attack_option(self,reset = False): self.channel_display_option(False) else: if(self.interface_card_info[selected_card] == "ETHERNET"): - QtGui.QMessageBox.warning(self,"Interface Option","The selected mode only works with WIFI enabled interface cards") + QtWidgets.QMessageBox.warning(self,"Interface Option","The selected mode only works with WIFI enabled interface cards") self.ethernet_mode_radio.setChecked(True) return if(self.interface_card_info[selected_card] == "WIFI"): @@ -231,8 +239,8 @@ def set_monitor_mode(self): else: self.reset_card_state() display = '''%s is currently not on monitor mode, should a monitor interface be created using the selected interface'''%(selected_interface) - answer = QtGui.QMessageBox.question(self,"Enable Monitor Mode",display,QtGui.QMessageBox.Yes,QtGui.QMessageBox.No) - if(answer == QtGui.QMessageBox.Yes): + answer = QtWidgets.QMessageBox.question(self,"Enable Monitor Mode",display,QtWidgets.QMessageBox.Yes,QtWidgets.QMessageBox.No) + if(answer == QtWidgets.QMessageBox.Yes): if(selected_channel == self.promiscious_mode): self.active_monitor_mode = "Promiscious Mode" monitor_output = commands.getstatusoutput("airmon-ng start " + selected_interface) @@ -266,7 +274,7 @@ def Right_click_Menu(self): def Save_Cookies(self): - selected_path = str(QtGui.QFileDialog.getSaveFileName(self,"Save Cookies","cookies.txt")) + selected_path = str(QtWidgets.QFileDialog.getSaveFileName(self,"Save Cookies","cookies.txt"))[0] if(selected_path): cookie_open_file = open(selected_path,"w") @@ -305,13 +313,13 @@ def Save_Cookies(self): cookie_open_file.write("\n%s: %s" % (str(cookie),str(value))) cookie_open_file.close() - QtGui.QMessageBox.information(self,"Save Cookies","Successfully saved all captured cookies to: " + selected_path) + QtWidgets.QMessageBox.information(self,"Save Cookies","Successfully saved all captured cookies to: " + selected_path) def Clear_All(self): - answer = QtGui.QMessageBox.question(self,"Clear Captured Cookies","Are you sure you want to clear all captured cookies?",QtGui.QMessageBox.Yes,QtGui.QMessageBox.No) - if(answer == QtGui.QMessageBox.Yes): + answer = QtWidgets.QMessageBox.question(self,"Clear Captured Cookies","Are you sure you want to clear all captured cookies?",QtWidgets.QMessageBox.Yes,QtWidgets.QMessageBox.No) + if(answer == QtWidgets.QMessageBox.Yes): self.cookie_db_cursor.execute("delete from cookie_cache") self.cookie_db_jar.commit() self.cookie_core.captured_cookie_count = 0 @@ -358,7 +366,7 @@ def Hijack_Session(self): def _Right_Click_Options(self,pos): - menu = QtGui.QMenu() + menu = QtWidgets.QMenu() try: item_type = str(self.treeWidget.currentItem().text(0)) except AttributeError: @@ -400,7 +408,7 @@ def emit_buffer_red_light(self): def delay_thread(self): time.sleep(0.2) - self.emit(QtCore.SIGNAL("emit buffer red light")) + self.emit_buffer_red_light_signal.emit() @@ -418,7 +426,7 @@ def display_cookie_captured(self): for count_a,source in enumerate(source_addresses): # e.g [0,("192.168.0.1",)] ip_address = str(source[0]) - item_0 = QtGui.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) self.treeWidget.topLevelItem(count_a).setText(0,ip_address) self.cookie_db_cursor.execute("select distinct Web_Address from cookie_cache where source = '" + ip_address + "'") @@ -428,7 +436,7 @@ def display_cookie_captured(self): web_addr = str(web_address[0]) - item_1 = QtGui.QTreeWidgetItem(item_0) + item_1 = QtWidgets.QTreeWidgetItem(item_0) icon = QtGui.QIcon() icon.addPixmap(self.green_light) item_1.setIcon(0, icon) @@ -441,7 +449,7 @@ def display_cookie_captured(self): cookie = cookies[0] value = cookies[1] - item_2 = QtGui.QTreeWidgetItem(item_1) + item_2 = QtWidgets.QTreeWidgetItem(item_1) self.treeWidget.topLevelItem(count_a).child(count_b).child(count_c).setText(0,"%s: %s" % (str(cookie),str(value))) self.treeWidget.collapseAll() @@ -460,24 +468,24 @@ def prepare_Mozilla_Database(self): if(result): self.mozilla_cookie_engine.cookie_database = result[0] if not os.path.exists(self.mozilla_cookie_engine.cookie_database): - self.emit(QtCore.SIGNAL("creating cache")) + self.creating_cache_signal.emit() path = self.mozilla_cookie_engine.get_Cookie_Path("cookies.sqlite") if not path: error_str = "cookies.sqlite firefox database has not been created on this system, Please run firefox to create it" - self.emit(QtCore.SIGNAL("display_error(QString)"),error_str) - self.emit(QtCore.SIGNAL("Deactivate")) + self.display_error_signal.emit(error_str) + self.Deactivate_signal.emit() self.mozilla_cookie_engine.cookie_database = str() return cookie_db_cursor.execute("delete from cache_settings where setting = 'cookie_path'") cookie_db_cursor.execute(sql_code_c ,("cookie_path",path)) cookie_db_jar.commit() else: - self.emit(QtCore.SIGNAL("creating cache")) + self.creating_cache_signal.emit() path = self.mozilla_cookie_engine.get_Cookie_Path("cookies.sqlite") if not path: error_str = "cookies.sqlite firefox database has not been created on this system, Please run firefox to create it"; - self.emit(QtCore.SIGNAL("display_error(QString)"),error_str) - self.emit(QtCore.SIGNAL("Deactivate")) + self.display_error_signal.emit(error_str) + self.Deactivate_signal.emit() self.mozilla_cookie_engine.cookie_database = str() return cookie_db_cursor.execute(sql_code_c ,("cookie_path",path)) @@ -541,7 +549,7 @@ def start_Cookie_Attack(self): if(self.ethernet_mode_radio.isChecked()): if(not re.match("(\d+.){3}\d+",ip_wep_edit)): - QtGui.QMessageBox.warning(self,"Invalid IP Address","Please insert a valid IPv4 Address of the Default Gateway") + QtWidgets.QMessageBox.warning(self,"Invalid IP Address","Please insert a valid IPv4 Address of the Default Gateway") self.wep_key_edit.setFocus() return @@ -579,7 +587,7 @@ def start_Cookie_Attack(self): def start_Attack(self): self.cookies_captured_label.clear() if not self.firefox_is_installed(): - QtGui.QMessageBox.warning(self,"Mozilla Firefox Detection", + QtWidgets.QMessageBox.warning(self,"Mozilla Firefox Detection", "Mozilla firefox is currently not installed on this computer, you need firefox to browse hijacked sessions, Process will capture cookies for manual analysis") self.treeWidget.clear() @@ -614,13 +622,13 @@ def start_Cookie_Attack_part(self): def Led_Blink(self): for count in range(3): - self.emit(QtCore.SIGNAL("on sniff green light")) + self.on_sniff_green_light_signal.emit() time.sleep(1) - self.emit(QtCore.SIGNAL("on sniff red light")) + self.on_sniff_red_light_signal.emit() time.sleep(1) - self.emit(QtCore.SIGNAL("on sniff green light")) + self.on_sniff_green_light_signal.emit() - self.emit(QtCore.SIGNAL("Continue Sniffing")) + self.Continue_Sniffing_signal.emit() return diff --git a/Fern-Wifi-Cracker/core/toolbox/fern_ray_fusion.py b/Fern-Wifi-Cracker/core/toolbox/fern_ray_fusion.py index e945e81..6eaaaa9 100644 --- a/Fern-Wifi-Cracker/core/toolbox/fern_ray_fusion.py +++ b/Fern-Wifi-Cracker/core/toolbox/fern_ray_fusion.py @@ -1,7 +1,7 @@ import re import string import webbrowser -from PyQt4 import QtCore,QtGui +from PyQt5 import QtCore, QtGui, QtWidgets from gui.ray_fusion import * from core.variables import * @@ -11,9 +11,9 @@ tutorial_link = "http://www.youtube.com/watch?v=_ztQQWMoVX4" # Video Tutorial link -class Ray_Fusion(QtGui.QDialog,Ui_ray_fusion): +class Ray_Fusion(QtWidgets.QDialog,Ui_ray_fusion): def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) @@ -31,26 +31,26 @@ def __init__(self): self.red_led = QtGui.QPixmap("%s/resources/red_led.png" % (os.getcwd())) self.green_led = QtGui.QPixmap("%s/resources/green_led.png" % (os.getcwd())) - self.connect(self.http_https_radio,QtCore.SIGNAL("clicked()"),self.HTTP_HTTPS_Mode) - self.connect(self.telnet_radio,QtCore.SIGNAL("clicked()"),self.TELNET_Mode) - self.connect(self.ftp_radio,QtCore.SIGNAL("clicked()"),self.FTP_Mode) - self.connect(self.default_wordlist_radio,QtCore.SIGNAL("clicked()"),self.select_Wordlist_type) - self.connect(self.custom_wordlist_radio,QtCore.SIGNAL("clicked()"),self.select_Wordlist_type) - self.connect(self.settings_button,QtCore.SIGNAL("clicked()"),self.show_hide_settings) - self.connect(self.help_button,QtCore.SIGNAL("clicked()"),self.show_help) - self.connect(self.launch_bruteforce,QtCore.SIGNAL("clicked()"),self.Start_Attack) + self.http_https_radio.clicked.connect(self.HTTP_HTTPS_Mode) + self.telnet_radio.clicked.connect(self.TELNET_Mode) + self.ftp_radio.clicked.connect(self.FTP_Mode) + self.default_wordlist_radio.clicked.connect(self.select_Wordlist_type) + self.custom_wordlist_radio.clicked.connect(self.select_Wordlist_type) + self.settings_button.clicked.connect(self.show_hide_settings) + self.help_button.clicked.connect(self.show_help) + self.launch_bruteforce.clicked.connect(self.Start_Attack) - self.connect(self.save_credentials,QtCore.SIGNAL("clicked()"),self.save_bruteforced_credentials) - self.connect(self.clear_credentials,QtCore.SIGNAL("clicked()"),self.clear_bruteforced_credentials) + self.save_credentials.clicked.connect(self.save_bruteforced_credentials) + self.clear_credentials.clicked.connect(self.clear_bruteforced_credentials) - self.connect(self.userlist_button,QtCore.SIGNAL("clicked()"),self.select_custom_user_wordlist) - self.connect(self.passwordlist_button,QtCore.SIGNAL("clicked()"),self.select_custom_password_wordlist) + self.userlist_button.clicked.connect(self.select_custom_user_wordlist) + self.passwordlist_button.clicked.connect(self.select_custom_password_wordlist) - self.connect(self.bruteforce_core,QtCore.SIGNAL("Next Try"),self.display_progress) - self.connect(self.bruteforce_core,QtCore.SIGNAL("We Got Error"),self.display_error_message) - self.connect(self.bruteforce_core,QtCore.SIGNAL("successful_login(QString,QString)"),self.show_credentials) + self.bruteforce_core.Next_Try_signal.connect(self.display_progress) + self.bruteforce_core.We_Got_Error_signal.connect(self.display_error_message) + self.bruteforce_core.successful_login_signal['QString', 'QString'].connect(self.show_credentials) - self.connect(self.bruteforce_core,QtCore.SIGNAL("Finished bruteforce"),self.Stop_Notification) + self.bruteforce_core.Finished_bruteforce_signal.connect(self.Stop_Notification) self.reset_objects() self.set_Window_Max() @@ -80,9 +80,9 @@ def set_Window_Max(self): def show_help(self): - QtGui.QMessageBox.about(self,"About Fern - Ray Fusion","Fern - Ray Fusion is a bruteforce attack tool used to audit the list of supported network services and returns login credentials of the target service when successful.") - answer = QtGui.QMessageBox.question(self,"Tutorial","Would you like to view a video tutorial on how to use the tool?",QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if(answer == QtGui.QMessageBox.Yes): + QtWidgets.QMessageBox.about(self,"About Fern - Ray Fusion","Fern - Ray Fusion is a bruteforce attack tool used to audit the list of supported network services and returns login credentials of the target service when successful.") + answer = QtWidgets.QMessageBox.question(self,"Tutorial","Would you like to view a video tutorial on how to use the tool?",QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) + if(answer == QtWidgets.QMessageBox.Yes): webbrowser.open_new_tab(tutorial_link) @@ -127,7 +127,7 @@ def show_hide_settings(self): def select_custom_user_wordlist(self): self.custom_user_wordlist = str() - path = QtGui.QFileDialog.getOpenFileName(self,"Select User Wordlist",str()) + path = QtWidgets.QFileDialog.getOpenFileName(self,"Select User Wordlist",str())[0] if(path): self.custom_user_wordlist = path self.user_wordlist_led.setPixmap(self.green_led) @@ -138,7 +138,7 @@ def select_custom_user_wordlist(self): def select_custom_password_wordlist(self): self.custom_password_wordlist = str() - path = QtGui.QFileDialog.getOpenFileName(self,"Select Password Wordlist",str()) + path = QtWidgets.QFileDialog.getOpenFileName(self,"Select Password Wordlist",str())[0] if(path): self.custom_password_wordlist = path self.password_wordlist_led.setPixmap(self.green_led) @@ -181,7 +181,7 @@ def display_table_header(self): column_headers = ("Username","Password") for column,header in enumerate(column_headers): self.credential_table.insertColumn(column) - column_header = QtGui.QTableWidgetItem() + column_header = QtWidgets.QTableWidgetItem() self.credential_table.setHorizontalHeaderItem(column,column_header) self.credential_table.horizontalHeaderItem(column).setText(header + ' '* 5) self.credential_table.resizeColumnsToContents() @@ -194,11 +194,11 @@ def show_credentials(self,username,password): self.credential_table.insertRow(self.table_index) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.credential_table.setItem(self.table_index,0,item) item.setText(str(username) + ' ' * 5) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.credential_table.setItem(self.table_index,1,item) item.setText(str(password) + ' ' * 5) @@ -212,7 +212,7 @@ def show_credentials(self,username,password): def display_error_message(self): - QtGui.QMessageBox.warning(self,"Message",self.bruteforce_core.get_exception()) + QtWidgets.QMessageBox.warning(self,"Message",self.bruteforce_core.get_exception()) self.bruteforce_core.stop_Attack() self.launch_bruteforce.setText("Start") self.bruteforce_core.terminate() @@ -239,7 +239,7 @@ def save_bruteforced_credentials(self): if(self.ftp_radio.isChecked()): target_service = "FTP (File Transfer Protocol)" - file_path = QtGui.QFileDialog.getSaveFileName(self,"Save Credentials","report.html") + file_path = QtWidgets.QFileDialog.getSaveFileName(self,"Save Credentials","report.html")[0] if(file_path): rows = self.credential_table.rowCount() @@ -261,13 +261,13 @@ def save_bruteforced_credentials(self): file_object.flush() file_object.close() - QtGui.QMessageBox.information(self,"Reports","Successfully saved reports to " + file_path) + QtWidgets.QMessageBox.information(self,"Reports","Successfully saved reports to " + file_path) def clear_bruteforced_credentials(self): - choice = QtGui.QMessageBox.question(self,"Clear Credentials","Are you sure you want to clear all bruteforced results?",QtGui.QMessageBox.Yes | QtGui.QMessageBox.No) - if(choice == QtGui.QMessageBox.Yes): + choice = QtWidgets.QMessageBox.question(self,"Clear Credentials","Are you sure you want to clear all bruteforced results?",QtWidgets.QMessageBox.Yes | QtWidgets.QMessageBox.No) + if(choice == QtWidgets.QMessageBox.Yes): self.clear_table() self.save_credentials.setEnabled(False) self.clear_credentials.setEnabled(False) @@ -286,7 +286,7 @@ def Start_Attack(self): self.time_interval = int(self.time_interval_spinbox.value()) if(not bool(self.target_address)): - QtGui.QMessageBox.warning(self,"Target Address","Please input a valid target adddress") + QtWidgets.QMessageBox.warning(self,"Target Address","Please input a valid target adddress") self.target_edit.setFocus() return @@ -294,21 +294,21 @@ def Start_Attack(self): self.bruteforce_core.set_attack_type("HTTP") valid_http = re.compile("^(https|http)://\S*",re.IGNORECASE) # HTTP/HTTPS url regular expression if not valid_http.match(self.target_address): - QtGui.QMessageBox.warning(self,"Invalid HTTP Address","The HTTP(HyperText Transfer Protocol) address should be fully qualified:\n\nExample:\nhttp://10.18.122.15\nhttps://www.foobar.com\nhttp://www.foobar.com/sports/index.html") + QtWidgets.QMessageBox.warning(self,"Invalid HTTP Address","The HTTP(HyperText Transfer Protocol) address should be fully qualified:\n\nExample:\nhttp://10.18.122.15\nhttps://www.foobar.com\nhttp://www.foobar.com/sports/index.html") return if(self.telnet_radio.isChecked()): self.bruteforce_core.set_attack_type("TELNET") if not self.target_port.isdigit(): # Check if use inputed a valid TCP port number - QtGui.QMessageBox.warning(self,"Invalid Port Number","Remote Telnet Server port must be digits") + QtWidgets.QMessageBox.warning(self,"Invalid Port Number","Remote Telnet Server port must be digits") return if(self.start_flag == True): - QtGui.QMessageBox.warning(self,"Telnet Protocol","Please note that the Telnet protocol is very unreliable with its connection status responces, therefore the bruteforce attack on telnet might return false results as positive") + QtWidgets.QMessageBox.warning(self,"Telnet Protocol","Please note that the Telnet protocol is very unreliable with its connection status responces, therefore the bruteforce attack on telnet might return false results as positive") if(self.ftp_radio.isChecked()): self.bruteforce_core.set_attack_type("FTP") if not self.target_port.isdigit(): - QtGui.QMessageBox.warning(self,"Invalid Port Number","Remote FTP Server port must be digits") + QtWidgets.QMessageBox.warning(self,"Invalid Port Number","Remote FTP Server port must be digits") return if(self.default_wordlist_radio.isChecked()): @@ -318,10 +318,10 @@ def Start_Attack(self): if(self.custom_wordlist_radio.isChecked()): if(not bool(self.custom_user_wordlist)): # Check if custom user list has been set - QtGui.QMessageBox.warning(self,"Wordlist","Custom user wordlist has not been set, Please browse and select a user wordlist file of your choice") + QtWidgets.QMessageBox.warning(self,"Wordlist","Custom user wordlist has not been set, Please browse and select a user wordlist file of your choice") return if(not bool(self.custom_password_wordlist)): # Check if custom password list has been set - QtGui.QMessageBox.warning(self,"Wordlist","Custom password wordlist has not been set, Please browse and select a password wordlist file of your choice") + QtWidgets.QMessageBox.warning(self,"Wordlist","Custom password wordlist has not been set, Please browse and select a password wordlist file of your choice") return self.bruteforce_core.user_wordlist = self.custom_user_wordlist diff --git a/Fern-Wifi-Cracker/core/toolbox/fern_tracker.py b/Fern-Wifi-Cracker/core/toolbox/fern_tracker.py index 97c4b40..e15c3f7 100644 --- a/Fern-Wifi-Cracker/core/toolbox/fern_tracker.py +++ b/Fern-Wifi-Cracker/core/toolbox/fern_tracker.py @@ -1,20 +1,23 @@ -import os -import thread -import sqlite3 +import os +import thread +import sqlite3 -import tracker_core +import tracker_core -from gui.geotrack import * -from core import variables +from gui.geotrack import * +from core import variables -from PyQt4 import QtGui,QtCore +from PyQt5 import QtCore, QtGui, QtWidgets fern_map_access = tracker_core.Fern_Geolocation() -class Fern_geolocation_tracker(QtGui.QDialog,Ui_fern_geotrack): +class Fern_geolocation_tracker(QtWidgets.QDialog,Ui_fern_geotrack): '''Main windows class''' + network_timeout_signal = QtCore.pyqtSignal() + display_map_signal = QtCore.pyqtSignal() + def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) self.setWindowModality(QtCore.Qt.ApplicationModal) @@ -24,11 +27,11 @@ def __init__(self): self.set_database_access_points() self.display_html(variables.html_instructions_message) - self.connect(self.database_radio,QtCore.SIGNAL("clicked()"),self.set_database_mode) - self.connect(self.insert_mac_radio,QtCore.SIGNAL("clicked()"),self.set_mac_mode) - self.connect(self.track_button,QtCore.SIGNAL("clicked()"),self.launch_tracker) - self.connect(self,QtCore.SIGNAL("network timeout"),self.internet_connection_error) - self.connect(self,QtCore.SIGNAL("display map"),self.display_map) + self.database_radio.clicked.connect(self.set_database_mode) + self.insert_mac_radio.clicked.connect(self.set_mac_mode) + self.track_button.clicked.connect(self.launch_tracker) + self.network_timeout_signal.connect(self.internet_connection_error) + self.display_map_signal.connect(self.display_map) # @@ -71,7 +74,7 @@ def set_database_mode(self): else: self.target_combo.setEditable(True) self.insert_mac_radio.setChecked(True) - QtGui.QMessageBox.warning(self,'Empty Database entries',variables.database_null_error.strip('/n')) + QtWidgets.QMessageBox.warning(self,'Empty Database entries',variables.database_null_error.strip('/n')) self.target_combo.setFocus() self.target_combo.clear() @@ -110,7 +113,7 @@ def launch_tracker(self): self.track_button.setText('Tracking...') thread.start_new_thread(self.display_tracking,()) else: - QtGui.QMessageBox.warning(self,'Invalid Mac Address',variables.invalid_mac_address_error.strip('/n')) + QtWidgets.QMessageBox.warning(self,'Invalid Mac Address',variables.invalid_mac_address_error.strip('/n')) self.display_html(variables.html_instructions_message) self.target_combo.setFocus() @@ -132,9 +135,9 @@ def display_map(self): def display_tracking(self): ''' Processes and displays map ''' if int(variables.commands.getstatusoutput('ping www.google.com -c 3')[0]): - self.emit(QtCore.SIGNAL("network timeout")) + self.network_timeout_signal.emit() else: - self.emit(QtCore.SIGNAL("display map")) + self.display_map_signal.emit() # # Error display messages diff --git a/Fern-Wifi-Cracker/core/tools.py b/Fern-Wifi-Cracker/core/tools.py index aa52d80..e8ee417 100644 --- a/Fern-Wifi-Cracker/core/tools.py +++ b/Fern-Wifi-Cracker/core/tools.py @@ -15,23 +15,23 @@ # from toolbox.fern_cookie_hijacker import * from toolbox.fern_ray_fusion import * -from PyQt4 import QtGui,QtCore +from PyQt5 import QtCore, QtGui, QtWidgets # # Tool Box window class # -class tool_box_window(QtGui.QDialog,toolbox_win): +class tool_box_window(QtWidgets.QDialog,toolbox_win): def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) self.setWindowModality(QtCore.Qt.ApplicationModal) - self.connect(self.pushButton,QtCore.SIGNAL("clicked()"),self.font_exec) - self.connect(self.geotrack_button,QtCore.SIGNAL("clicked()"),self.geotrack_exec) - self.connect(self.attack_options_button,QtCore.SIGNAL("clicked()"),self.attack_settings_exec) - self.connect(self.cookie_hijack_button,QtCore.SIGNAL("clicked()"),self.cookie_hijack_exec) - self.connect(self.ray_fusion_button,QtCore.SIGNAL("clicked()"),self.ray_fusion_exec) + self.pushButton.clicked.connect(self.font_exec) + self.geotrack_button.clicked.connect(self.geotrack_exec) + self.attack_options_button.clicked.connect(self.attack_settings_exec) + self.cookie_hijack_button.clicked.connect(self.cookie_hijack_exec) + self.ray_fusion_button.clicked.connect(self.ray_fusion_exec) @@ -41,14 +41,14 @@ def __init__(self): # TOOLBOX FEATURES # def geotrack_exec(self): - QtGui.QMessageBox.warning(self,"Geo Tracker","This feature has been deprecated") + QtWidgets.QMessageBox.warning(self,"Geo Tracker","This feature has been deprecated") def cookie_hijack_exec(self): try: from toolbox import fern_cookie_hijacker except ImportError: - QtGui.QMessageBox.warning(self,"Scapy Dependency","Scapy library is currently not installed \nPlease run \"apt-get install python-scapy\" to install the dependency") + QtWidgets.QMessageBox.warning(self,"Scapy Dependency","Scapy library is currently not installed \nPlease run \"apt-get install python-scapy\" to install the dependency") return cookie_hijacker = fern_cookie_hijacker.Fern_Cookie_Hijacker() @@ -80,16 +80,16 @@ def attack_settings_exec(self): # # ################################################################################ -class font_dialog(QtGui.QDialog,font_dialog): +class font_dialog(QtWidgets.QDialog,font_dialog): def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) self.setWindowTitle('Font Settings') self.label_2.setText('Current Font: %s'% \ (reader(os.getcwd() + '/.font_settings.dat' ).split()[2])) - self.connect(self.buttonBox,QtCore.SIGNAL("accepted()"),self.set_font) + self.buttonBox.accepted.connect(self.set_font) font_range = [] for font_numbers in range(1,21): @@ -104,24 +104,24 @@ def set_font(self): write('.font_settings.dat',font_string) self.close() - QtGui.QMessageBox.information(self,'Font Settings','Please restart application to apply changes') + QtWidgets.QMessageBox.information(self,'Font Settings','Please restart application to apply changes') -class wifi_attack_settings(QtGui.QDialog,Ui_attack_settings): +class wifi_attack_settings(QtWidgets.QDialog,Ui_attack_settings): def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) self.settings = Fern_settings() self.display_components() - self.connect(self.mac_button,QtCore.SIGNAL("clicked()"),self.set_static_mac) - self.connect(self.mac_box,QtCore.SIGNAL("clicked()"),self.remove_mac_objects) - self.connect(self.capture_box,QtCore.SIGNAL("clicked()"),self.remove_capture_objects) - self.connect(self.direc_browse,QtCore.SIGNAL("clicked()"),self.set_capture_directory) + self.mac_button.clicked.connect(self.set_static_mac) + self.mac_box.clicked.connect(self.remove_mac_objects) + self.capture_box.clicked.connect(self.remove_capture_objects) + self.direc_browse.clicked.connect(self.set_capture_directory) @@ -139,14 +139,14 @@ def display_components(self): def set_static_mac(self): mac_address = str(self.mac_edit.text()) if not Check_MAC(mac_address): - QtGui.QMessageBox.warning(self,"Invalid MAC Address",variables.invalid_mac_address_error) + QtWidgets.QMessageBox.warning(self,"Invalid MAC Address",variables.invalid_mac_address_error) self.mac_edit.setFocus() else: self.settings.create_settings('mac_address',mac_address) def set_capture_directory(self): - directory = str(QtGui.QFileDialog.getExistingDirectory(self,"Select Capture Storage Directory","")) + directory = str(QtWidgets.QFileDialog.getExistingDirectory(self,"Select Capture Storage Directory","")) if directory: self.directory_label.setText('' + directory) self.settings.create_settings("capture_directory",directory) @@ -177,15 +177,15 @@ def remove_capture_objects(self): # # Tips Dialog, show user tips on how to access settings dialog and set scan preferences # -class tips_window(QtGui.QDialog,tips_dialog): +class tips_window(QtWidgets.QDialog,tips_dialog): def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.type = int() # Type of tip display e.g tip from mainwindow = 1 self.settings = Fern_settings() - self.connect(self.pushButton,QtCore.SIGNAL("clicked()"),self.accept) + self.pushButton.clicked.connect(self.accept) def accept(self): check_status = self.checkBox.isChecked() @@ -206,19 +206,19 @@ def accept(self): -class Fern_Pro_Tips(QtGui.QDialog,Fern_Pro_Tip_ui): +class Fern_Pro_Tips(QtWidgets.QDialog,Fern_Pro_Tip_ui): def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.settings = Fern_settings() - self.connect(self.yes_button,QtCore.SIGNAL("clicked()"),self.open_website) - self.connect(self.show_message_checkbox,QtCore.SIGNAL("clicked()"),self.toggle_tip) + self.yes_button.clicked.connect(self.open_website) + self.show_message_checkbox.clicked.connect(self.toggle_tip) def open_website(self): - QtGui.QDesktopServices.openUrl(QtCore.QUrl("http://www.fern-pro.com/")) + QtWidgets.QDesktopServices.openUrl(QtCore.QUrl("http://www.fern-pro.com/")) self.toggle_tip() self.close() @@ -240,9 +240,9 @@ def toggle_tip(self): # # Class for the settings dialog box # -class settings_dialog(QtGui.QDialog,settings): +class settings_dialog(QtWidgets.QDialog,settings): def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.settings = Fern_settings() @@ -256,8 +256,8 @@ def __init__(self): for list_numbers in range(1,15): list_.append(str(list_numbers)) self.channel_combobox.addItems(list_) - self.connect(self.buttonBox,QtCore.SIGNAL("accepted()"),self.change_settings) - self.connect(self.buttonBox,QtCore.SIGNAL("rejected()"),QtCore.SLOT("close()")) + self.buttonBox.accepted.connect(self.change_settings) + self.buttonBox.rejected.connect(self.close) # diff --git a/Fern-Wifi-Cracker/core/wep.py b/Fern-Wifi-Cracker/core/wep.py index da56128..37335ad 100644 --- a/Fern-Wifi-Cracker/core/wep.py +++ b/Fern-Wifi-Cracker/core/wep.py @@ -1,4 +1,5 @@ from core.fern import * +from PyQt5.QtWidgets import * from core.tools import* from core.functions import * from core.settings import * @@ -12,9 +13,34 @@ # Wep Attack window class for decrypting wep keys # -class wep_attack_dialog(QtGui.QDialog,Ui_attack_panel): +class wep_attack_dialog(QtWidgets.QDialog,Ui_attack_panel): + new_access_point_detected_signal = QtCore.pyqtSignal() + injection_not_working_signal = QtCore.pyqtSignal() + injection_working_signal = QtCore.pyqtSignal() + associating_signal = QtCore.pyqtSignal() + association_failed_signal = QtCore.pyqtSignal() + gathering_signal = QtCore.pyqtSignal() + passive_mode_signal = QtCore.pyqtSignal() + injecting_signal = QtCore.pyqtSignal() + chop_chop_injecting_signal = QtCore.pyqtSignal() + fragment_injecting_signal = QtCore.pyqtSignal() + hirte_injecting_signal = QtCore.pyqtSignal() + caffe_latte_injecting_signal = QtCore.pyqtSignal() + P0841_injecting_signal = QtCore.pyqtSignal() + update_progress_bar_signal = QtCore.pyqtSignal() + progress_maximum_signal = QtCore.pyqtSignal() + cracking_signal = QtCore.pyqtSignal() + next_try_signal = QtCore.pyqtSignal() + key_not_found_yet_signal = QtCore.pyqtSignal() + wep_found_signal = QtCore.pyqtSignal() + update_database_label_signal = QtCore.pyqtSignal() + change_tree_item_signal = QtCore.pyqtSignal() + start_automated_attack_signal = QtCore.pyqtSignal() + stop_scan_signal = QtCore.pyqtSignal() + display_stop_icon_signal = QtCore.pyqtSignal() + def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) self.setWindowModality(QtCore.Qt.ApplicationModal) @@ -40,40 +66,40 @@ def __init__(self): self.settings = Fern_settings() # For saving settings self.wps_update_timer = QtCore.QTimer(self) - self.connect(self.wps_update_timer,QtCore.SIGNAL("timeout()"),self.set_if_WPS_Support) + self.wps_update_timer.timeout.connect(self.set_if_WPS_Support) self.wps_update_timer.start(1000) self.wifi_icon = QtGui.QPixmap("%s/resources/radio-wireless-signal-icone-5919-96.png"%os.getcwd()) - self.connect(self,QtCore.SIGNAL("new access point detected"),self.display_new_access_point) + self.new_access_point_detected_signal.connect(self.display_new_access_point) - self.connect(self.general_group_box,QtCore.SIGNAL("DoubleClicked()"),self.mouseDoubleClickEvent) - self.connect(self.ap_listwidget,QtCore.SIGNAL("itemSelectionChanged()"),self.display_selected_target) - self.connect(self.attack_button,QtCore.SIGNAL("clicked()"),self.launch_attack) - self.connect(self.wps_attack_radio,QtCore.SIGNAL("clicked()"),self.check_reaver_status) - self.connect(self,QtCore.SIGNAL("display stop icon"),self.display_stop_icon) - self.connect(self,QtCore.SIGNAL("start automated attack"),self.wep_launch_attack) - self.connect(self,QtCore.SIGNAL("change tree item"),self.change_treeItem) + self.general_group_box.DoubleClicked.connect(self.mouseDoubleClickEvent) + self.ap_listwidget.itemSelectionChanged.connect(self.display_selected_target) + self.attack_button.clicked.connect(self.launch_attack) + self.wps_attack_radio.clicked.connect(self.check_reaver_status) + self.display_stop_icon_signal.connect(self.display_stop_icon) + self.start_automated_attack_signal.connect(self.wep_launch_attack) + self.change_tree_item_signal.connect(self.change_treeItem) ############## ATACK PANEL METHODS ##################### - self.connect(self,QtCore.SIGNAL("injection_working"),self.injection_working) - self.connect(self,QtCore.SIGNAL("injection_not_working"),self.injection_not_working) - self.connect(self,QtCore.SIGNAL("associating"),self.associating) - self.connect(self,QtCore.SIGNAL("update_progress_bar"),self.update_bar) - self.connect(self,QtCore.SIGNAL("progress maximum"),self.progress_maximum) - self.connect(self,QtCore.SIGNAL("injecting"),self.injecting) - self.connect(self,QtCore.SIGNAL("gathering"),self.gathering) - self.connect(self,QtCore.SIGNAL("chop-chop injecting"),self.chop_chop_attack) - self.connect(self,QtCore.SIGNAL("fragment injecting"),self.fragmented_attack) - self.connect(self,QtCore.SIGNAL("hirte injecting"),self.hirte_attack) - self.connect(self,QtCore.SIGNAL("caffe latte injecting"),self.caffe_latte_attack) - self.connect(self,QtCore.SIGNAL("P0841 injecting"),self.P0841_attack) - self.connect(self,QtCore.SIGNAL("key not found yet"),self.key_not_found_yet) - self.connect(self,QtCore.SIGNAL("wep found"),self.key_found) - self.connect(self,QtCore.SIGNAL("cracking"),self.cracking) - self.connect(self,QtCore.SIGNAL('passive mode'),self.passive_mode) - self.connect(self,QtCore.SIGNAL('association failed'),self.association_failed) + self.injection_working_signal.connect(self.injection_working) + self.injection_not_working_signal.connect(self.injection_not_working) + self.associating_signal.connect(self.associating) + self.update_progress_bar_signal.connect(self.update_bar) + self.progress_maximum_signal.connect(self.progress_maximum) + self.injecting_signal.connect(self.injecting) + self.gathering_signal.connect(self.gathering) + self.chop_chop_injecting_signal.connect(self.chop_chop_attack) + self.fragment_injecting_signal.connect(self.fragmented_attack) + self.hirte_injecting_signal.connect(self.hirte_attack) + self.caffe_latte_injecting_signal.connect(self.caffe_latte_attack) + self.P0841_injecting_signal.connect(self.P0841_attack) + self.key_not_found_yet_signal.connect(self.key_not_found_yet) + self.wep_found_signal.connect(self.key_found) + self.cracking_signal.connect(self.cracking) + self.passive_mode_signal.connect(self.passive_mode) + self.association_failed_signal.connect(self.association_failed) # wep_details = {'Elite': ['00:C0:CA:8B:15:62', '1', '54', '10']} @@ -122,12 +148,12 @@ def set_Key_Clipbord(self): self.conversion_type = "WEP" self.clipboard_key = str() self.original_key = str() - self.clipbord = QtGui.QApplication.clipboard() + self.clipbord = QtWidgets.QApplication.clipboard() self.key_label.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.wps_pin_label.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - self.connect(self.key_label,QtCore.SIGNAL("customContextMenuRequested(QPoint)"),self.show_key_menu) - self.connect(self.wps_pin_label,QtCore.SIGNAL("customContextMenuRequested(QPoint)"),self.show_wps_key_menu) + self.key_label.customContextMenuRequested[QtCore.QPoint].connect(self.show_key_menu) + self.wps_pin_label.customContextMenuRequested[QtCore.QPoint].connect(self.show_wps_key_menu) @@ -164,7 +190,7 @@ def Copy_Key(self,key_type): def show_key_menu(self,pos): - menu = QtGui.QMenu() + menu = QtWidgets.QMenu() copy_action = object() convert_ascii_action = object() @@ -192,7 +218,7 @@ def show_key_menu(self,pos): def show_wps_key_menu(self,pos): - menu = QtGui.QMenu() + menu = QtWidgets.QMenu() copy_action = menu.addAction("Copy WPS Pin") selected_action = menu.exec_(self.key_label.mapToGlobal(pos)) @@ -272,14 +298,14 @@ def display_access_points(self): self.ap_listwidget.setSpacing(12) for access_point in wep_details.keys(): self.access_points.add(access_point) - item = QtGui.QListWidgetItem(self.ap_listwidget) + item = QtWidgets.QListWidgetItem(self.ap_listwidget) icon = QtGui.QIcon() icon.addPixmap(self.wifi_icon) item.setIcon(icon) item.setText(access_point) self.ap_listwidget.addItem(item) self.ap_listwidget.sortItems(QtCore.Qt.AscendingOrder) - self.ap_listwidget.setMovement(QtGui.QListView.Snap) + self.ap_listwidget.setMovement(QtWidgets.QListView.Snap) def Check_New_Access_Point(self): @@ -288,7 +314,7 @@ def Check_New_Access_Point(self): if(True): new_list = self.access_points.symmetric_difference(updated_list) if(len(list(new_list))): - self.emit(QtCore.SIGNAL("new access point detected")) + self.new_access_point_detected_signal.emit() time.sleep(4) @@ -297,14 +323,14 @@ def display_new_access_point(self): new_access_points = self.access_points.symmetric_difference(set(wep_details.keys())) for access_point in list(new_access_points): self.access_points.add(access_point) - item = QtGui.QListWidgetItem(self.ap_listwidget) + item = QtWidgets.QListWidgetItem(self.ap_listwidget) icon = QtGui.QIcon() icon.addPixmap(self.wifi_icon) item.setIcon(icon) item.setText(access_point) self.ap_listwidget.addItem(item) self.ap_listwidget.sortItems(QtCore.Qt.AscendingOrder) - self.ap_listwidget.setMovement(QtGui.QListView.Snap) + self.ap_listwidget.setMovement(QtWidgets.QListView.Snap) @@ -342,7 +368,7 @@ def set_if_WPS_Support(self,messagebox = False): self.wps_support_label.setEnabled(False) self.wps_support_label.setText("Supports WPS") if(messagebox): - QtGui.QMessageBox.warning(self,"WPS Device Support","WPS (WIFI Protected Setup) is not supported or is disabled by the selected access point") + QtWidgets.QMessageBox.warning(self,"WPS Device Support","WPS (WIFI Protected Setup) is not supported or is disabled by the selected access point") self.regular_attack_radio.setChecked(True) return @@ -352,10 +378,10 @@ def set_if_WPS_Support(self,messagebox = False): def check_reaver_status(self): if not variables.wps_functions.reaver_Installed(): - answer = QtGui.QMessageBox.question(self,"Reaver not Detected", + answer = QtWidgets.QMessageBox.question(self,"Reaver not Detected", '''The Reaver tool is currently not installed,The tool is necessary for attacking WPS Access Points.\n\nDo you want to open the download link?''', - QtGui.QMessageBox.Yes,QtGui.QMessageBox.No) - if(answer == QtGui.QMessageBox.Yes): + QtWidgets.QMessageBox.Yes,QtWidgets.QMessageBox.No) + if(answer == QtWidgets.QMessageBox.Yes): variables.wps_functions.browse_Reaver_Link() self.regular_attack_radio.setChecked(True) @@ -518,9 +544,9 @@ def injection_status(self): injection_string = '' while 'Injection is working' not in injection_string: injection_string += str(commands.getstatusoutput('aireplay-ng -9 %s'%(monitor))) - self.emit(QtCore.SIGNAL("injection_not_working")) + self.injection_not_working_signal.emit() - self.emit(QtCore.SIGNAL("injection_working")) + self.injection_working_signal.emit() ########################################### SPECIAL COMMAND THREADS ###################################### @@ -535,7 +561,7 @@ def association_thread(self): monitor = variables.monitor_interface attacker_mac_address = variables.monitor_mac_address - self.emit(QtCore.SIGNAL("associating")) + self.associating_signal.emit() association_string = '' association_timer = 0 while True: @@ -552,24 +578,24 @@ def association_thread(self): def unsuccessful_association_process(self): - self.emit(QtCore.SIGNAL('association failed')) - self.emit(QtCore.SIGNAL("gathering")) + self.association_failed_signal.emit() + self.gathering_signal.emit() time.sleep(4) thread.start_new_thread(self.update_progress_bar,()) - self.emit(QtCore.SIGNAL('passive mode')) + self.passive_mode_signal.emit() def successful_accociation_process(self): attack_mode = self.attack_type_combo.currentText() thread.start_new_thread(self.update_progress_bar,()) - self.emit(QtCore.SIGNAL("gathering")) + self.gathering_signal.emit() thread.start_new_thread(self.update_progress_bar,()) time.sleep(4) if attack_mode == 'ARP Request Replay': thread.start_new_thread(self.arp_request_thread,()) # arp_request_thread - self.emit(QtCore.SIGNAL("injecting")) + self.injecting_signal.emit() elif attack_mode == 'Chop-Chop Attack': # Chop-Chop attack thread thread.start_new_thread(self.chop_chop_thread,()) @@ -605,8 +631,8 @@ def chop_chop_thread(self): variables.exec_command('%s packetforge-ng -0 -a %s -h %s -k 255.255.255.255 -l 255.255.255.255 -y \ /tmp/fern-log/WEP-DUMP/*.xor -w /tmp/fern-log/WEP-DUMP/chop_chop.cap'%(variables.xterm_setting,access_point_mac,attacker_mac_address),"/tmp/fern-log/WEP-DUMP/") - self.emit(QtCore.SIGNAL("chop-chop injecting")) - self.emit(QtCore.SIGNAL("chop-chop injecting")) + self.chop_chop_injecting_signal.emit() + self.chop_chop_injecting_signal.emit() variables.exec_command('%s aireplay-ng -2 -F -r /tmp/fern-log/WEP-DUMP/chop_chop.cap %s'%(variables.xterm_setting,monitor),"/tmp/fern-log/WEP-DUMP/") def fragmentation_thread(self): @@ -616,28 +642,28 @@ def fragmentation_thread(self): variables.exec_command('%s aireplay-ng -5 -F -b %s -h %s %s'%(variables.xterm_setting,access_point_mac,attacker_mac_address,monitor),"/tmp/fern-log/WEP-DUMP/") variables.exec_command('%s packetforge-ng -0 -a %s -h %s -k 255.255.255.255 -l 255.255.255.255 -y /tmp/fern-log/WEP-DUMP/*.xor -w /tmp/fern-log/WEP-DUMP/fragmented.cap'%(variables.xterm_setting,access_point_mac,attacker_mac_address),"/tmp/fern-log/WEP-DUMP/") - self.emit(QtCore.SIGNAL("fragment injecting")) + self.fragment_injecting_signal.emit() variables.exec_command('%s aireplay-ng -2 -F -r /tmp/fern-log/WEP-DUMP/fragmented.cap %s'%(variables.xterm_setting,monitor),"/tmp/fern-log/WEP-DUMP/") def hirte_thread(self): command = "aireplay-ng -7 -h %s -D %s" % (variables.monitor_mac_address,variables.monitor_interface) process = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,cwd="/tmp/fern-log/WEP-DUMP/") - self.emit(QtCore.SIGNAL("hirte injecting")) + self.hirte_injecting_signal.emit() process.stdin.write("y") def caffe_latte_thread(self): command = "aireplay-ng -6 -h %s -b %s -D %s" % (variables.monitor_mac_address,variables.victim_mac,variables.monitor_interface) process = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,cwd="/tmp/fern-log/WEP-DUMP/") - self.emit(QtCore.SIGNAL("caffe latte injecting")) + self.caffe_latte_injecting_signal.emit() process.stdin.write("y") def P0841_thread(self): command = "aireplay-ng -2 -p 0841 -c FF:FF:FF:FF:FF:FF -b %s -h %s %s" % (variables.victim_mac,variables.monitor_mac_address,variables.monitor_interface) process = subprocess.Popen(command,shell=True,stdin=subprocess.PIPE,stdout=subprocess.PIPE,stderr=subprocess.PIPE,cwd="/tmp/fern-log/WEP-DUMP/") - self.emit(QtCore.SIGNAL("P0841 injecting")) + self.P0841_injecting_signal.emit() process.stdin.write("y") @@ -672,38 +698,38 @@ def update_progress_bar(self): while self.ivs_number <= self.ivs_value: time.sleep(0.4) - self.emit(QtCore.SIGNAL("update_progress_bar")) + self.update_progress_bar_signal.emit() - self.emit(QtCore.SIGNAL("progress maximum")) + self.progress_maximum_signal.emit() thread.start_new_thread(self.crack_wep,()) #Thread for cracking wep thread.start_new_thread(self.key_check,()) - self.emit(QtCore.SIGNAL("cracking")) + self.cracking_signal.emit() time.sleep(13) if 'wep_key.txt' not in os.listdir('/tmp/fern-log/WEP-DUMP/'): - self.emit(QtCore.SIGNAL("next_try")) - QtCore.SIGNAL("update_progress_bar") + self.next_try_signal.emit() + self.update_progress_bar_signal.emit() thread.start_new_thread(self.updater,()) def updater(self): global wep_string while 'wep_key.txt' not in os.listdir('/tmp/fern-log/WEP-DUMP/'): - self.emit(QtCore.SIGNAL("update_progress_bar")) + self.update_progress_bar_signal.emit() time.sleep(1) def key_check(self): global wep_key_commit while 'wep_key.txt' not in os.listdir('/tmp/fern-log/WEP-DUMP/'): - self.emit(QtCore.SIGNAL("key not found yet")) + self.key_not_found_yet_signal.emit() time.sleep(2) key = reader('/tmp/fern-log/WEP-DUMP/wep_key.txt') self.WEP = key - self.emit(QtCore.SIGNAL("wep found")) + self.wep_found_signal.emit() variables.exec_command('killall aircrack-ng') variables.exec_command('killall aireplay-ng') variables.exec_command('killall airmon-ng') @@ -711,7 +737,7 @@ def key_check(self): if len(self.WEP) > 0: if wep_key_commit == 0: set_key_entries(variables.victim_access_point,variables.victim_mac,'WEP',str(self.WEP.replace(':','')),variables.victim_channel) #Add WEP Key to Database Here - self.emit(QtCore.SIGNAL('update database label')) + self.update_database_label_signal.emit() wep_key_commit += 1 self.isfinished = True @@ -751,8 +777,8 @@ def launch_attack_2(self): if(self.index == (len(wep_details.keys()) - 1)): self.control = False if(index >= 1): - self.emit(QtCore.SIGNAL("change tree item")) - self.emit(QtCore.SIGNAL("start automated attack")) + self.change_tree_item_signal.emit() + self.start_automated_attack_signal.emit() self.index = index self.isfinished = False @@ -784,8 +810,8 @@ def wep_launch_attack(self): return if(is_already_Cracked(variables.victim_mac,"WEP")): - answer = QtGui.QMessageBox.question(self,"Access Point Already Cracked",variables.victim_access_point + "'s key already exists in the database, Do you want to attack and update the already saved key?",QtGui.QMessageBox.Yes,QtGui.QMessageBox.No); - if(answer == QtGui.QMessageBox.No): + answer = QtWidgets.QMessageBox.question(self,"Access Point Already Cracked",variables.victim_access_point + "'s key already exists in the database, Do you want to attack and update the already saved key?",QtWidgets.QMessageBox.Yes,QtWidgets.QMessageBox.No); + if(answer == QtWidgets.QMessageBox.No): self.control = True return @@ -798,9 +824,9 @@ def wep_launch_attack(self): self.wep_disable_items() - self.emit(QtCore.SIGNAL("stop scan")) + self.stop_scan_signal.emit() - self.emit(QtCore.SIGNAL("display stop icon")) + self.display_stop_icon_signal.emit() variables.exec_command('rm -r /tmp/fern-log/WEP-DUMP/*') # WPS AND REGULAR ATTACK STARTUP @@ -818,11 +844,11 @@ def wep_launch_attack(self): def set_WPS_Objects(self,instance): self.progressBar.setMaximum(100) self.progressBar.setValue(0) - self.connect(instance,QtCore.SIGNAL("Associating with WPS device"),self.associating_wps) - self.connect(instance,QtCore.SIGNAL("Bruteforcing WPS Device"),self.associated_bruteforing) - self.connect(instance,QtCore.SIGNAL("WPS Progress"),self.updating_progress) - self.connect(instance,QtCore.SIGNAL("Cracked WPS Pin"),self.display_WPS_pin) - self.connect(instance,QtCore.SIGNAL("Cracked WPS Key"),self.display_Cracked_Key) + instance.Associating_with_WPS_device_signal.connect(self.associating_wps) + instance.Bruteforcing_WPS_Device_signal.connect(self.associated_bruteforing) + instance.WPS_Progress_signal.connect(self.updating_progress) + instance.Cracked_WPS_Pin_signal.connect(self.display_WPS_pin) + instance.Cracked_WPS_Key_signal.connect(self.display_Cracked_Key) def associating_wps(self): @@ -866,7 +892,7 @@ def display_Cracked_Key(self): self.key_label.setText("WEP KEY: " + variables.wps_functions.get_keys()[1] + "" ) self.set_Progressbar_color("green") set_key_entries(variables.victim_access_point,variables.victim_mac,'WEP',variables.wps_functions.get_keys()[1],variables.victim_channel) - self.emit(QtCore.SIGNAL('update database label')) + self.update_database_label_signal.emit() self.finished_label.setText("Finished") self.new_automate_key() self.cancel_wep_attack() @@ -876,4 +902,4 @@ def display_Cracked_Key(self): def closeEvent(self,event): - self.wps_update_timer.stop() \ No newline at end of file + self.wps_update_timer.stop() diff --git a/Fern-Wifi-Cracker/core/wpa.py b/Fern-Wifi-Cracker/core/wpa.py index 64fc554..7a277b1 100644 --- a/Fern-Wifi-Cracker/core/wpa.py +++ b/Fern-Wifi-Cracker/core/wpa.py @@ -7,14 +7,34 @@ from core import variables -from PyQt4 import QtGui,QtCore +from PyQt5 import QtCore, QtGui, QtWidgets # # Wpa Attack window class for decrypting wep keys # -class wpa_attack_dialog(QtGui.QDialog,Ui_attack_panel): +class wpa_attack_dialog(QtWidgets.QDialog,Ui_attack_panel): + update_client_signal = QtCore.pyqtSignal() + new_access_point_detected_signal = QtCore.pyqtSignal() + update_database_label_signal = QtCore.pyqtSignal() + client_is_there_signal = QtCore.pyqtSignal() + client_not_in_list_signal = QtCore.pyqtSignal() + update_word_signal = QtCore.pyqtSignal('QString') + update_progressbar_signal = QtCore.pyqtSignal() + update_speed_signal = QtCore.pyqtSignal('QString') + wpa_key_found_signal = QtCore.pyqtSignal() + deauthenticating_signal = QtCore.pyqtSignal() + handshake_captured_signal = QtCore.pyqtSignal() + Stop_progress_display_signal = QtCore.pyqtSignal() + bruteforcing_signal = QtCore.pyqtSignal() + set_maximum_signal = QtCore.pyqtSignal() + wpa_key_not_found_signal = QtCore.pyqtSignal() + change_tree_item_signal = QtCore.pyqtSignal() + start_automated_attack_signal = QtCore.pyqtSignal() + stop_scan_signal = QtCore.pyqtSignal() + wordlist_lines_counted_signal = QtCore.pyqtSignal('QString') + def __init__(self): - QtGui.QDialog.__init__(self) + QtWidgets.QDialog.__init__(self) self.setupUi(self) self.retranslateUi(self) self.setWindowModality(QtCore.Qt.ApplicationModal) @@ -27,26 +47,26 @@ def __init__(self): self.settings = Fern_settings() # For saving settings self.wps_update_timer = QtCore.QTimer(self) - self.connect(self.wps_update_timer,QtCore.SIGNAL("timeout()"),self.set_if_WPS_Support) + self.wps_update_timer.timeout.connect(self.set_if_WPS_Support) self.wps_update_timer.start(1000) - self.connect(self.attack_button,QtCore.SIGNAL("clicked()"),self.launch_attack) - self.connect(self.dictionary_set,QtCore.SIGNAL("clicked()"),self.dictionary_setting) - self.connect(self,QtCore.SIGNAL("update client"),self.update_client_list) - self.connect(self,QtCore.SIGNAL("client not in list"),self.display_client) - self.connect(self,QtCore.SIGNAL("client is there"),self.client_available) - self.connect(self.wps_attack_radio,QtCore.SIGNAL("clicked()"),self.check_reaver_status) - self.connect(self,QtCore.SIGNAL("deauthenticating"),self.deauthenticating_display) - self.connect(self,QtCore.SIGNAL("handshake captured"),self.handshake_captured) - self.connect(self,QtCore.SIGNAL("bruteforcing"),self.bruteforce_display) - self.connect(self,QtCore.SIGNAL("wpa key found"),self.wpa_key_found) - self.connect(self,QtCore.SIGNAL("update_word(QString)"),self.update_word_label) - self.connect(self,QtCore.SIGNAL("update_progressbar"),self.update_progress_bar) - self.connect(self,QtCore.SIGNAL("update_speed(QString)"),self.update_speed_label) - self.connect(self,QtCore.SIGNAL("wpa key not found"),self.key_not_found) - self.connect(self,QtCore.SIGNAL("set maximum"),self.set_maximum) - self.connect(self,QtCore.SIGNAL("Stop progress display"),self.display_label) - self.connect(self,QtCore.SIGNAL("wordlist_lines_counted(QString)"),self.set_progress_bar) + self.attack_button.clicked.connect(self.launch_attack) + self.dictionary_set.clicked.connect(self.dictionary_setting) + self.update_client_signal.connect(self.update_client_list) + self.client_not_in_list_signal.connect(self.display_client) + self.client_is_there_signal.connect(self.client_available) + self.wps_attack_radio.clicked.connect(self.check_reaver_status) + self.deauthenticating_signal.connect(self.deauthenticating_display) + self.handshake_captured_signal.connect(self.handshake_captured) + self.bruteforcing_signal.connect(self.bruteforce_display) + self.wpa_key_found_signal.connect(self.wpa_key_found) + self.update_word_signal['QString'].connect(self.update_word_label) + self.update_progressbar_signal.connect(self.update_progress_bar) + self.update_speed_signal['QString'].connect(self.update_speed_label) + self.wpa_key_not_found_signal.connect(self.key_not_found) + self.set_maximum_signal.connect(self.set_maximum) + self.Stop_progress_display_signal.connect(self.display_label) + self.wordlist_lines_counted_signal['QString'].connect(self.set_progress_bar) if len(self.client_list) == 0: thread.start_new_thread(self.auto_add_clients,()) @@ -97,11 +117,11 @@ def __init__(self): self.mac_address = str() self.wifi_icon = QtGui.QPixmap("%s/resources/radio-wireless-signal-icone-5919-96.png"%os.getcwd()) - self.connect(self,QtCore.SIGNAL("new access point detected"),self.display_new_access_point) - self.connect(self.ap_listwidget,QtCore.SIGNAL("itemSelectionChanged()"),self.display_selected_target) + self.new_access_point_detected_signal.connect(self.display_new_access_point) + self.ap_listwidget.itemSelectionChanged.connect(self.display_selected_target) - self.connect(self,QtCore.SIGNAL("start automated attack"),self.wpa_launch_attack) - self.connect(self,QtCore.SIGNAL("change tree item"),self.change_treeItem) + self.start_automated_attack_signal.connect(self.wpa_launch_attack) + self.change_tree_item_signal.connect(self.change_treeItem) self.wpa_disable_items() self.ap_listwidget.clear() @@ -117,12 +137,12 @@ def __init__(self): def set_Key_Clipbord(self): self.clipboard_key = str() - self.clipbord = QtGui.QApplication.clipboard() + self.clipbord = QtWidgets.QApplication.clipboard() self.key_label.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) self.wps_pin_label.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) - self.connect(self.key_label,QtCore.SIGNAL("customContextMenuRequested(QPoint)"),self.show_key_menu) - self.connect(self.wps_pin_label,QtCore.SIGNAL("customContextMenuRequested(QPoint)"),self.show_wps_key_menu) + self.key_label.customContextMenuRequested[QtCore.QPoint].connect(self.show_key_menu) + self.wps_pin_label.customContextMenuRequested[QtCore.QPoint].connect(self.show_wps_key_menu) def Copy_Key(self,key_type): @@ -142,7 +162,7 @@ def Copy_Key(self,key_type): def show_key_menu(self,pos): - menu = QtGui.QMenu() + menu = QtWidgets.QMenu() copy_action = object() convert_ascii_action = object() @@ -158,7 +178,7 @@ def show_key_menu(self,pos): def show_wps_key_menu(self,pos): - menu = QtGui.QMenu() + menu = QtWidgets.QMenu() copy_action = menu.addAction("Copy WPS Pin") selected_action = menu.exec_(self.key_label.mapToGlobal(pos)) @@ -215,7 +235,7 @@ def display_selected_target(self): self.key_label.setVisible(False) self.client_update() - self.emit(QtCore.SIGNAL("update client")) + self.update_client_signal.emit() if len(self.client_list) == 0: thread.start_new_thread(self.auto_add_clients,()) @@ -246,14 +266,14 @@ def display_access_points(self): self.ap_listwidget.setSpacing(12) for access_point in wpa_details.keys(): self.access_points.add(access_point) - item = QtGui.QListWidgetItem(self.ap_listwidget) + item = QtWidgets.QListWidgetItem(self.ap_listwidget) icon = QtGui.QIcon() icon.addPixmap(self.wifi_icon) item.setIcon(icon) item.setText(access_point) self.ap_listwidget.addItem(item) self.ap_listwidget.sortItems(QtCore.Qt.AscendingOrder) - self.ap_listwidget.setMovement(QtGui.QListView.Snap) + self.ap_listwidget.setMovement(QtWidgets.QListView.Snap) def Check_New_Access_Point(self): @@ -262,7 +282,7 @@ def Check_New_Access_Point(self): if(True): new_list = self.access_points.symmetric_difference(updated_list) if(len(list(new_list))): - self.emit(QtCore.SIGNAL("new access point detected")) + self.new_access_point_detected_signal.emit() time.sleep(4) @@ -271,14 +291,14 @@ def display_new_access_point(self): new_access_points = self.access_points.symmetric_difference(set(wpa_details.keys())) for access_point in list(new_access_points): self.access_points.add(access_point) - item = QtGui.QListWidgetItem(self.ap_listwidget) + item = QtWidgets.QListWidgetItem(self.ap_listwidget) icon = QtGui.QIcon() icon.addPixmap(self.wifi_icon) item.setIcon(icon) item.setText(access_point) self.ap_listwidget.addItem(item) self.ap_listwidget.sortItems(QtCore.Qt.AscendingOrder) - self.ap_listwidget.setMovement(QtGui.QListView.Snap) + self.ap_listwidget.setMovement(QtWidgets.QListView.Snap) # # SIGNALS AND SLOTS @@ -319,7 +339,7 @@ def set_if_WPS_Support(self,messagebox = False): self.wps_support_label.setEnabled(False) self.wps_support_label.setText("Supports WPS") if(messagebox): - QtGui.QMessageBox.warning(self,"WPS Device Support","WPS (WIFI Protected Setup) is not supported or is disabled by the selected access point") + QtWidgets.QMessageBox.warning(self,"WPS Device Support","WPS (WIFI Protected Setup) is not supported or is disabled by the selected access point") self.regular_attack_radio.setChecked(True) return @@ -329,10 +349,10 @@ def set_if_WPS_Support(self,messagebox = False): def check_reaver_status(self): if not variables.wps_functions.reaver_Installed(): - answer = QtGui.QMessageBox.question(self,"Reaver not Detected", + answer = QtWidgets.QMessageBox.question(self,"Reaver not Detected", '''The Reaver tool is currently not installed,The tool is necessary for attacking WPS Access Points.\n\nDo you want to open the download link?''', - QtGui.QMessageBox.Yes,QtGui.QMessageBox.No) - if(answer == QtGui.QMessageBox.Yes): + QtWidgets.QMessageBox.Yes,QtWidgets.QMessageBox.No) + if(answer == QtWidgets.QMessageBox.Yes): variables.wps_functions.browse_Reaver_Link() self.regular_attack_radio.setChecked(True) @@ -348,8 +368,8 @@ def cancel_wpa_attack(self): commands.getstatusoutput('killall airodump-ng') commands.getstatusoutput('killall aircrack-ng') commands.getstatusoutput('killall aireplay-ng') - self.disconnect(self.attack_button,QtCore.SIGNAL("clicked()"),self.cancel_wpa_attack) - self.connect(self.attack_button,QtCore.SIGNAL("clicked()"),self.launch_attack) + self.attack_button.clicked.disconnect(self.cancel_wpa_attack) + self.attack_button.clicked.connect(self.launch_attack) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("%s/resources/wifi_4.png"%(os.getcwd()))) self.attack_button.setIcon(icon) @@ -421,7 +441,7 @@ def wpa_key_found(self): if self.wpa_key_commit == 0: set_key_entries(variables.victim_access_point,variables.victim_mac,'WPA',wpa_key_read,variables.victim_channel) #Add WPA Key to Database Here - self.emit(QtCore.SIGNAL('update database label')) + self.update_database_label_signal.emit() self.wpa_key_commit += 1 self.isfinished = True @@ -473,22 +493,22 @@ def auto_add_clients(self): while temp_mac_address not in self.client_list: if(self.wps_attack_radio.isChecked()): if(variables.wps_functions.is_WPS_Device(variables.victim_mac)): - self.emit(QtCore.SIGNAL("client is there")) - self.emit(QtCore.SIGNAL("update client")) + self.client_is_there_signal.emit() + self.update_client_signal.emit() return if len(self.client_list) >= 1: - self.emit(QtCore.SIGNAL("client is there")) - self.emit(QtCore.SIGNAL("update client")) + self.client_is_there_signal.emit() + self.update_client_signal.emit() break else: time.sleep(6) if not self.started: - self.emit(QtCore.SIGNAL("client not in list")) + self.client_not_in_list_signal.emit() if(loop_control): thread.start_new_thread(self.probe_for_Client_Mac,()) loop_control = False self.client_update() - self.emit(QtCore.SIGNAL("update client")) + self.update_client_signal.emit() def probe_for_Client_Mac(self): @@ -524,19 +544,19 @@ def launch_brutefore(self): current_word = current_word_regex.findall(stdout_read) if(current_word): self.current_word = current_word[0] - self.emit(QtCore.SIGNAL("update_word(QString)"),self.current_word) + self.update_word_signal.emit(self.current_word) word_number = keys_tested_regex.findall(stdout_read) if(word_number): self.word_number = int(word_number[0]) - self.emit(QtCore.SIGNAL("update_progressbar")) + self.update_progressbar_signal.emit() current_speed = keys_speed_regex.findall(stdout_read) if(current_speed): self.current_speed = current_speed[0] - self.emit(QtCore.SIGNAL("update_speed(QString)"),self.current_speed) + self.update_speed_signal.emit(self.current_speed) - self.emit(QtCore.SIGNAL("wpa key found")) + self.wpa_key_found_signal.emit() @@ -553,18 +573,18 @@ def capture_check(self): def capture_loop(self): time.sleep(3) - self.emit(QtCore.SIGNAL("deauthenticating")) + self.deauthenticating_signal.emit() while '1 handshake' not in reader('/tmp/fern-log/WPA-DUMP/capture_status.log'): if(self.started == False): # Break deauthentication loop if attack has been stopped return thread.start_new_thread(self.deauthenticate_client,()) time.sleep(10) thread.start_new_thread(self.capture_check,()) - self.emit(QtCore.SIGNAL("handshake captured")) # Handshake captured + self.handshake_captured_signal.emit() commands.getstatusoutput('killall airodump-ng') commands.getstatusoutput('killall aireplay-ng') time.sleep(1) - self.emit(QtCore.SIGNAL("bruteforcing")) + self.bruteforcing_signal.emit() thread.start_new_thread(self.launch_brutefore,()) thread.start_new_thread(self.wordlist_check,()) @@ -578,8 +598,8 @@ def wordlist_check(self): time.sleep(30) if controller == self.current_word: control_word = 1 - self.emit(QtCore.SIGNAL("set maximum")) - self.emit(QtCore.SIGNAL("wpa key not found")) + self.set_maximum_signal.emit() + self.wpa_key_not_found_signal.emit() def display_current_wordlist(self): @@ -619,8 +639,8 @@ def launch_attack_2(self): if(self.index == (len(wpa_details.keys()) - 1)): self.control = False if(index >= 1): - self.emit(QtCore.SIGNAL("change tree item")) - self.emit(QtCore.SIGNAL("start automated attack")) + self.change_tree_item_signal.emit() + self.start_automated_attack_signal.emit() self.index = index self.isfinished = False @@ -651,8 +671,8 @@ def wpa_launch_attack(self): self.wpa_disable_items() if(is_already_Cracked(variables.victim_mac,"WPA")): - answer = QtGui.QMessageBox.question(self,"Access Point Already Cracked",variables.victim_access_point + "'s key already exists in the database, Do you want to attack and update the already saved key?",QtGui.QMessageBox.Yes,QtGui.QMessageBox.No); - if(answer == QtGui.QMessageBox.No): + answer = QtWidgets.QMessageBox.question(self,"Access Point Already Cracked",variables.victim_access_point + "'s key already exists in the database, Do you want to attack and update the already saved key?",QtWidgets.QMessageBox.Yes,QtWidgets.QMessageBox.No); + if(answer == QtWidgets.QMessageBox.No): self.control = True return @@ -664,8 +684,8 @@ def wpa_launch_attack(self): variables.wps_functions.start() self.isfinished = False self.progressBar.setValue(0) - self.disconnect(self.attack_button,QtCore.SIGNAL("clicked()"),self.launch_attack) - self.connect(self.attack_button,QtCore.SIGNAL("clicked()"),self.cancel_wpa_attack) + self.attack_button.clicked.disconnect(self.launch_attack) + self.attack_button.clicked.connect(self.cancel_wpa_attack) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("%s/resources/stop.png"%(os.getcwd()))) self.attack_button.setIcon(icon) @@ -677,15 +697,15 @@ def wpa_launch_attack(self): self.select_client = self.attack_type_combo.currentText() if(self.select_client == str()): - QtGui.QMessageBox.warning(self,"WPA Attack Requirement","At least one client MAC-Address asscociated with the Access Point is required to successfully attack the WPA Encryption, If you know a client MAC Address you can add it manually or wait for the probing process to detect client addresses") + QtWidgets.QMessageBox.warning(self,"WPA Attack Requirement","At least one client MAC-Address asscociated with the Access Point is required to successfully attack the WPA Encryption, If you know a client MAC Address you can add it manually or wait for the probing process to detect client addresses") self.attack_type_combo.setFocus() return if not Check_MAC(self.select_client): - QtGui.QMessageBox.warning(self,'Invalid Client MAC Address',variables.invalid_mac_address_error.strip('/n')) + QtWidgets.QMessageBox.warning(self,'Invalid Client MAC Address',variables.invalid_mac_address_error.strip('/n')) return - self.emit(QtCore.SIGNAL("stop scan")) + self.stop_scan_signal.emit() commands.getstatusoutput('killall airodump-ng') commands.getstatusoutput('killall airmon-ng') commands.getstatusoutput('rm -r /tmp/fern-log/WPA-DUMP/*') @@ -723,8 +743,8 @@ def wpa_launch_attack(self): self.associate_label.setText("Probing Access Point") commands.getstatusoutput('touch /tmp/fern-log/WPA-DUMP/capture_status.log') self.progressBar.setValue(0) - self.disconnect(self.attack_button,QtCore.SIGNAL("clicked()"),self.launch_attack) - self.connect(self.attack_button,QtCore.SIGNAL("clicked()"),self.cancel_wpa_attack) + self.attack_button.clicked.disconnect(self.launch_attack) + self.attack_button.clicked.connect(self.cancel_wpa_attack) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("%s/resources/stop.png"%(os.getcwd()))) self.attack_button.setIcon(icon) @@ -739,7 +759,7 @@ def wpa_launch_attack(self): def find_dictionary_length(self,filename): self.progress_bar_max = line_count(filename) - self.emit(QtCore.SIGNAL("wordlist_lines_counted(QString)"),filename) + self.wordlist_lines_counted_signal.emit(filename) def set_progress_bar(self,filename): @@ -749,7 +769,7 @@ def set_progress_bar(self,filename): def dictionary_setting(self): - filename = QtGui.QFileDialog.getOpenFileName(self,"Select Wordlist","") + filename = QtWidgets.QFileDialog.getOpenFileName(self,"Select Wordlist","")[0] if(filename): self.settings.create_settings("wordlist",filename) @@ -771,11 +791,11 @@ def dictionary_setting(self): def set_WPS_Objects(self,instance): self.progressBar.setMaximum(100) self.progressBar.setValue(0) - self.connect(instance,QtCore.SIGNAL("Associating with WPS device"),self.associating_wps) - self.connect(instance,QtCore.SIGNAL("Bruteforcing WPS Device"),self.associated_bruteforing) - self.connect(instance,QtCore.SIGNAL("WPS Progress"),self.updating_progress) - self.connect(instance,QtCore.SIGNAL("Cracked WPS Pin"),self.display_WPS_pin) - self.connect(instance,QtCore.SIGNAL("Cracked WPS Key"),self.display_Cracked_Key) + instance.Associating_with_WPS_device_signal.connect(self.associating_wps) + instance.Bruteforcing_WPS_Device_signal.connect(self.associated_bruteforing) + instance.WPS_Progress_signal.connect(self.updating_progress) + instance.Cracked_WPS_Pin_signal.connect(self.display_WPS_pin) + instance.Cracked_WPS_Key_signal.connect(self.display_Cracked_Key) def associating_wps(self): @@ -819,7 +839,7 @@ def display_Cracked_Key(self): self.key_label.setText("WPA KEY: " + variables.wps_functions.get_keys()[1] + "" ) self.set_Progressbar_color("green") set_key_entries(variables.victim_access_point,variables.victim_mac,'WPA',variables.wps_functions.get_keys()[1],variables.victim_channel) - self.emit(QtCore.SIGNAL('update database label')) + self.update_database_label_signal.emit() self.finished_label.setText("Finished") self.new_automate_key() self.cancel_wpa_attack() diff --git a/Fern-Wifi-Cracker/core/wps.py b/Fern-Wifi-Cracker/core/wps.py index 4038e50..67ac5c5 100644 --- a/Fern-Wifi-Cracker/core/wps.py +++ b/Fern-Wifi-Cracker/core/wps.py @@ -25,17 +25,23 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -import re -import time -import thread -import signal -import commands -import subprocess -import webbrowser +import re +import time +import thread +import signal +import commands +import subprocess +import webbrowser -from PyQt4 import QtCore +from PyQt5 import QtCore class WPS_Attack(QtCore.QThread): + Bruteforcing_WPS_Device_signal = QtCore.pyqtSignal() + WPS_Progress_signal = QtCore.pyqtSignal() + Cracked_WPS_Pin_signal = QtCore.pyqtSignal() + Cracked_WPS_Key_signal = QtCore.pyqtSignal() + Associating_with_WPS_device_signal = QtCore.pyqtSignal() + def __init__(self): QtCore.QThread.__init__(self) self.monitor_interface = str() # Monitor Interface used for scanning @@ -132,24 +138,24 @@ def _bruteforce_WPS_Device(self): responce = sys_file.readline() if(associate_regex.findall(str(responce))): self._associate_flag = True - self.emit(QtCore.SIGNAL("Bruteforcing WPS Device")) + self.Bruteforcing_WPS_Device_signal.emit() information = progress_regex.findall(str(responce)) if(bool(information)): self.progress = information[0] - self.emit(QtCore.SIGNAL("WPS Progress")) + self.WPS_Progress_signal.emit() self._associate_flag = True wps_pin = wps_pin_regex.findall(str(responce)) if(bool(wps_pin)): self._wps_pin = wps_pin[0] - self.emit(QtCore.SIGNAL("Cracked WPS Pin")) + self.Cracked_WPS_Pin_signal.emit() wps_key = wps_key_regex.findall(str(responce)) if(bool(wps_key)): if(str(wps_key[0]) != str(self._wps_pin)): self._final_key = wps_key[0] - self.emit(QtCore.SIGNAL("Cracked WPS Key")) + self.Cracked_WPS_Key_signal.emit() return @@ -171,7 +177,7 @@ def start_Attack_WPS_Device(self): self._final_key = str() self._wps_pin = str() self._associate_flag = False - self.emit(QtCore.SIGNAL("Associating with WPS device")) + self.Associating_with_WPS_device_signal.emit() thread.start_new_thread(self._associate_WPS_Device_Aireplay,()) time.sleep(3) self._bruteforce_WPS_Device() diff --git a/Fern-Wifi-Cracker/execute.py b/Fern-Wifi-Cracker/execute.py index d5ad4e4..0ed0d04 100644 --- a/Fern-Wifi-Cracker/execute.py +++ b/Fern-Wifi-Cracker/execute.py @@ -5,7 +5,7 @@ import time import shutil import commands -from PyQt4 import QtGui,QtCore +from PyQt5 import QtCore, QtGui, QtWidgets def initialize(): @@ -78,11 +78,11 @@ def cleanup(): if __name__ == '__main__': - app = QtGui.QApplication(sys.argv) + app = QtWidgets.QApplication(sys.argv) run = fern.mainwindow() pixmap = QtGui.QPixmap("%s/resources/screen_splash.png" % (os.getcwd())) - screen_splash = QtGui.QSplashScreen(pixmap,QtCore.Qt.WindowStaysOnTopHint) + screen_splash = QtWidgets.QSplashScreen(pixmap,QtCore.Qt.WindowStaysOnTopHint) screen_splash.setMask(pixmap.mask()) screen_splash.show() app.processEvents() diff --git a/Fern-Wifi-Cracker/gui/attack_panel.py b/Fern-Wifi-Cracker/gui/attack_panel.py index 7956bca..d4e8d5a 100644 --- a/Fern-Wifi-Cracker/gui/attack_panel.py +++ b/Fern-Wifi-Cracker/gui/attack_panel.py @@ -3,12 +3,12 @@ # Form implementation generated from reading ui file 'C:\Users\SAVIOUR\Desktop\untitled.ui' # # Created: Sun Sep 02 13:02:23 2012 -# by: PyQt4 UI code generator 4.8.4 +# by: PyQt5 UI code generator 4.8.4 # # WARNING! All changes made in this file will be lost! import os from main_window import font_size -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets, QtGui font_setting = font_size() @@ -24,19 +24,19 @@ def setupUi(self, attack_panel): icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/wifi_4.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) attack_panel.setWindowIcon(icon) - self.verticalLayout_13 = QtGui.QVBoxLayout(attack_panel) + self.verticalLayout_13 = QtWidgets.QVBoxLayout(attack_panel) self.verticalLayout_13.setObjectName(_fromUtf8("verticalLayout_13")) - self.general_group_box = QtGui.QGroupBox(attack_panel) + self.general_group_box = QtWidgets.QGroupBox(attack_panel) font = QtGui.QFont() font.setPointSize(font_setting) self.general_group_box.setFont(font) self.general_group_box.setTitle(_fromUtf8("")) self.general_group_box.setObjectName(_fromUtf8("general_group_box")) - self.verticalLayout_12 = QtGui.QVBoxLayout(self.general_group_box) + self.verticalLayout_12 = QtWidgets.QVBoxLayout(self.general_group_box) self.verticalLayout_12.setObjectName(_fromUtf8("verticalLayout_12")) - self.horizontalLayout_7 = QtGui.QHBoxLayout() + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) - self.groupBox_2 = QtGui.QGroupBox(self.general_group_box) + self.groupBox_2 = QtWidgets.QGroupBox(self.general_group_box) self.groupBox_2.setEnabled(True) font = QtGui.QFont() font.setPointSize(font_setting) @@ -44,38 +44,38 @@ def setupUi(self, attack_panel): self.groupBox_2.setAlignment(QtCore.Qt.AlignCenter) self.groupBox_2.setFlat(True) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) - self.verticalLayout_9 = QtGui.QVBoxLayout(self.groupBox_2) + self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout_9.setObjectName(_fromUtf8("verticalLayout_9")) - self.ap_listwidget = QtGui.QListWidget(self.groupBox_2) + self.ap_listwidget = QtWidgets.QListWidget(self.groupBox_2) font = QtGui.QFont() font.setFamily(_fromUtf8("Segoe UI")) font.setPointSize(9) self.ap_listwidget.setFont(font) - self.ap_listwidget.setSelectionBehavior(QtGui.QAbstractItemView.SelectItems) - self.ap_listwidget.setMovement(QtGui.QListView.Snap) + self.ap_listwidget.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectItems) + self.ap_listwidget.setMovement(QtWidgets.QListView.Snap) self.ap_listwidget.setSpacing(12) - self.ap_listwidget.setViewMode(QtGui.QListView.IconMode) + self.ap_listwidget.setViewMode(QtWidgets.QListView.IconMode) self.ap_listwidget.setObjectName(_fromUtf8("ap_listwidget")) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(_fromUtf8("../Documents/Projects/SVN Projects/Fern-Wifi-Cracker/resources/radio-wireless-signal-icone-5919-96.png")), QtGui.QIcon.Normal, QtGui.QIcon.Off) - item = QtGui.QListWidgetItem(self.ap_listwidget) + item = QtWidgets.QListWidgetItem(self.ap_listwidget) item.setIcon(icon1) - item = QtGui.QListWidgetItem(self.ap_listwidget) + item = QtWidgets.QListWidgetItem(self.ap_listwidget) item.setIcon(icon1) self.verticalLayout_9.addWidget(self.ap_listwidget) - spacerItem = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_9.addItem(spacerItem) - self.line = QtGui.QFrame(self.groupBox_2) - self.line.setFrameShape(QtGui.QFrame.HLine) - self.line.setFrameShadow(QtGui.QFrame.Sunken) + self.line = QtWidgets.QFrame(self.groupBox_2) + self.line.setFrameShape(QtWidgets.QFrame.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName(_fromUtf8("line")) self.verticalLayout_9.addWidget(self.line) self.horizontalLayout_7.addWidget(self.groupBox_2) - self.verticalLayout_2 = QtGui.QVBoxLayout() + self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem1) - self.attack_button = QtGui.QPushButton(self.general_group_box) + self.attack_button = QtWidgets.QPushButton(self.general_group_box) font = QtGui.QFont() font.setPointSize(font_setting) self.attack_button.setFont(font) @@ -83,136 +83,136 @@ def setupUi(self, attack_panel): self.attack_button.setIconSize(QtCore.QSize(28, 27)) self.attack_button.setObjectName(_fromUtf8("attack_button")) self.verticalLayout_2.addWidget(self.attack_button) - self.automate_checkbox = QtGui.QCheckBox(self.general_group_box) + self.automate_checkbox = QtWidgets.QCheckBox(self.general_group_box) self.automate_checkbox.setObjectName(_fromUtf8("automate_checkbox")) self.verticalLayout_2.addWidget(self.automate_checkbox) - spacerItem2 = QtGui.QSpacerItem(20, 50, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem2 = QtWidgets.QSpacerItem(20, 50, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem2) self.horizontalLayout_7.addLayout(self.verticalLayout_2) self.verticalLayout_12.addLayout(self.horizontalLayout_7) - self.groupBox = QtGui.QGroupBox(self.general_group_box) + self.groupBox = QtWidgets.QGroupBox(self.general_group_box) self.groupBox.setEnabled(True) font = QtGui.QFont() font.setPointSize(font_setting) self.groupBox.setFont(font) self.groupBox.setObjectName(_fromUtf8("groupBox")) - self.verticalLayout_11 = QtGui.QVBoxLayout(self.groupBox) + self.verticalLayout_11 = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout_11.setObjectName(_fromUtf8("verticalLayout_11")) - self.horizontalLayout_6 = QtGui.QHBoxLayout() + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) - spacerItem3 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem3 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem3) - self.label_9 = QtGui.QLabel(self.groupBox) + self.label_9 = QtWidgets.QLabel(self.groupBox) self.label_9.setObjectName(_fromUtf8("label_9")) self.horizontalLayout_6.addWidget(self.label_9) - self.essid_label = QtGui.QLabel(self.groupBox) + self.essid_label = QtWidgets.QLabel(self.groupBox) self.essid_label.setObjectName(_fromUtf8("essid_label")) self.horizontalLayout_6.addWidget(self.essid_label) - spacerItem4 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem4 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem4) - self.label_10 = QtGui.QLabel(self.groupBox) + self.label_10 = QtWidgets.QLabel(self.groupBox) self.label_10.setObjectName(_fromUtf8("label_10")) self.horizontalLayout_6.addWidget(self.label_10) - self.bssid_label = QtGui.QLabel(self.groupBox) + self.bssid_label = QtWidgets.QLabel(self.groupBox) self.bssid_label.setObjectName(_fromUtf8("bssid_label")) self.horizontalLayout_6.addWidget(self.bssid_label) - spacerItem5 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem5 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem5) - self.label_11 = QtGui.QLabel(self.groupBox) + self.label_11 = QtWidgets.QLabel(self.groupBox) self.label_11.setObjectName(_fromUtf8("label_11")) self.horizontalLayout_6.addWidget(self.label_11) - self.channel_label = QtGui.QLabel(self.groupBox) + self.channel_label = QtWidgets.QLabel(self.groupBox) self.channel_label.setObjectName(_fromUtf8("channel_label")) self.horizontalLayout_6.addWidget(self.channel_label) - spacerItem6 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem6 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem6) - self.label_12 = QtGui.QLabel(self.groupBox) + self.label_12 = QtWidgets.QLabel(self.groupBox) self.label_12.setObjectName(_fromUtf8("label_12")) self.horizontalLayout_6.addWidget(self.label_12) - self.power_label = QtGui.QLabel(self.groupBox) + self.power_label = QtWidgets.QLabel(self.groupBox) self.power_label.setObjectName(_fromUtf8("power_label")) self.horizontalLayout_6.addWidget(self.power_label) - spacerItem7 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem7 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem7) - self.label_13 = QtGui.QLabel(self.groupBox) + self.label_13 = QtWidgets.QLabel(self.groupBox) self.label_13.setObjectName(_fromUtf8("label_13")) self.horizontalLayout_6.addWidget(self.label_13) - self.encrypt_wep_label = QtGui.QLabel(self.groupBox) + self.encrypt_wep_label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.encrypt_wep_label.setFont(font) self.encrypt_wep_label.setObjectName(_fromUtf8("encrypt_wep_label")) self.horizontalLayout_6.addWidget(self.encrypt_wep_label) - spacerItem8 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem8 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem8) - self.wps_support_label = QtGui.QLabel(self.groupBox) + self.wps_support_label = QtWidgets.QLabel(self.groupBox) self.wps_support_label.setEnabled(False) self.wps_support_label.setObjectName(_fromUtf8("wps_support_label")) self.horizontalLayout_6.addWidget(self.wps_support_label) - spacerItem9 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem9) self.verticalLayout_11.addLayout(self.horizontalLayout_6) self.verticalLayout_12.addWidget(self.groupBox) - self.groupBox_3 = QtGui.QGroupBox(self.general_group_box) + self.groupBox_3 = QtWidgets.QGroupBox(self.general_group_box) self.groupBox_3.setEnabled(True) font = QtGui.QFont() font.setPointSize(font_setting) self.groupBox_3.setFont(font) self.groupBox_3.setObjectName(_fromUtf8("groupBox_3")) - self.horizontalLayout_5 = QtGui.QHBoxLayout(self.groupBox_3) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.groupBox_3) self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) - self.horizontalLayout_4 = QtGui.QHBoxLayout() + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) - spacerItem10 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem10) - self.regular_attack_radio = QtGui.QRadioButton(self.groupBox_3) + self.regular_attack_radio = QtWidgets.QRadioButton(self.groupBox_3) self.regular_attack_radio.setChecked(True) self.regular_attack_radio.setObjectName(_fromUtf8("regular_attack_radio")) self.horizontalLayout_4.addWidget(self.regular_attack_radio) - spacerItem11 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem11) - self.wps_attack_radio = QtGui.QRadioButton(self.groupBox_3) + self.wps_attack_radio = QtWidgets.QRadioButton(self.groupBox_3) self.wps_attack_radio.setObjectName(_fromUtf8("wps_attack_radio")) self.horizontalLayout_4.addWidget(self.wps_attack_radio) - spacerItem12 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem12) self.horizontalLayout_5.addLayout(self.horizontalLayout_4) self.verticalLayout_12.addWidget(self.groupBox_3) - self.verticalLayout_8 = QtGui.QVBoxLayout() + self.verticalLayout_8 = QtWidgets.QVBoxLayout() self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8")) - self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) - self.verticalLayout_5 = QtGui.QVBoxLayout() + self.verticalLayout_5 = QtWidgets.QVBoxLayout() self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) - self.associate_label = QtGui.QLabel(self.general_group_box) + self.associate_label = QtWidgets.QLabel(self.general_group_box) self.associate_label.setEnabled(False) font = QtGui.QFont() font.setPointSize(font_setting) self.associate_label.setFont(font) self.associate_label.setObjectName(_fromUtf8("associate_label")) self.verticalLayout_5.addWidget(self.associate_label) - self.injecting_label = QtGui.QLabel(self.general_group_box) + self.injecting_label = QtWidgets.QLabel(self.general_group_box) self.injecting_label.setEnabled(False) font = QtGui.QFont() font.setPointSize(font_setting) self.injecting_label.setFont(font) self.injecting_label.setObjectName(_fromUtf8("injecting_label")) self.verticalLayout_5.addWidget(self.injecting_label) - self.gathering_label = QtGui.QLabel(self.general_group_box) + self.gathering_label = QtWidgets.QLabel(self.general_group_box) self.gathering_label.setEnabled(False) font = QtGui.QFont() font.setPointSize(font_setting) self.gathering_label.setFont(font) self.gathering_label.setObjectName(_fromUtf8("gathering_label")) self.verticalLayout_5.addWidget(self.gathering_label) - self.cracking_label_2 = QtGui.QLabel(self.general_group_box) + self.cracking_label_2 = QtWidgets.QLabel(self.general_group_box) self.cracking_label_2.setEnabled(False) font = QtGui.QFont() font.setPointSize(font_setting) self.cracking_label_2.setFont(font) self.cracking_label_2.setObjectName(_fromUtf8("cracking_label_2")) self.verticalLayout_5.addWidget(self.cracking_label_2) - self.finished_label = QtGui.QLabel(self.general_group_box) + self.finished_label = QtWidgets.QLabel(self.general_group_box) self.finished_label.setEnabled(False) font = QtGui.QFont() font.setPointSize(font_setting) @@ -220,61 +220,61 @@ def setupUi(self, attack_panel): self.finished_label.setObjectName(_fromUtf8("finished_label")) self.verticalLayout_5.addWidget(self.finished_label) self.horizontalLayout_3.addLayout(self.verticalLayout_5) - self.verticalLayout_7 = QtGui.QVBoxLayout() + self.verticalLayout_7 = QtWidgets.QVBoxLayout() self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7")) - self.horizontalLayout_10 = QtGui.QHBoxLayout() + self.horizontalLayout_10 = QtWidgets.QHBoxLayout() self.horizontalLayout_10.setObjectName(_fromUtf8("horizontalLayout_10")) - spacerItem13 = QtGui.QSpacerItem(248, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem13 = QtWidgets.QSpacerItem(248, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_10.addItem(spacerItem13) - self.verticalLayout_6 = QtGui.QVBoxLayout() + self.verticalLayout_6 = QtWidgets.QVBoxLayout() self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6")) - spacerItem14 = QtGui.QSpacerItem(200, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem14 = QtWidgets.QSpacerItem(200, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_6.addItem(spacerItem14) - self.verticalLayout_10 = QtGui.QVBoxLayout() + self.verticalLayout_10 = QtWidgets.QVBoxLayout() self.verticalLayout_10.setObjectName(_fromUtf8("verticalLayout_10")) - self.horizontalLayout_8 = QtGui.QHBoxLayout() + self.horizontalLayout_8 = QtWidgets.QHBoxLayout() self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8")) - self.injection_work_label_2 = QtGui.QLabel(self.general_group_box) + self.injection_work_label_2 = QtWidgets.QLabel(self.general_group_box) self.injection_work_label_2.setEnabled(False) self.injection_work_label_2.setAlignment(QtCore.Qt.AlignCenter) self.injection_work_label_2.setObjectName(_fromUtf8("injection_work_label_2")) self.horizontalLayout_8.addWidget(self.injection_work_label_2) - self.dictionary_set = QtGui.QPushButton(self.general_group_box) + self.dictionary_set = QtWidgets.QPushButton(self.general_group_box) self.dictionary_set.setObjectName(_fromUtf8("dictionary_set")) self.horizontalLayout_8.addWidget(self.dictionary_set) self.verticalLayout_10.addLayout(self.horizontalLayout_8) - self.horizontalLayout_9 = QtGui.QHBoxLayout() + self.horizontalLayout_9 = QtWidgets.QHBoxLayout() self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9")) - self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - self.attack_type_combo = QtGui.QComboBox(self.general_group_box) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.attack_type_combo = QtWidgets.QComboBox(self.general_group_box) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.attack_type_combo.sizePolicy().hasHeightForWidth()) self.attack_type_combo.setSizePolicy(sizePolicy) self.attack_type_combo.setAutoFillBackground(False) - self.attack_type_combo.setSizeAdjustPolicy(QtGui.QComboBox.AdjustToContentsOnFirstShow) + self.attack_type_combo.setSizeAdjustPolicy(QtWidgets.QComboBox.AdjustToContentsOnFirstShow) self.attack_type_combo.setDuplicatesEnabled(False) self.attack_type_combo.setObjectName(_fromUtf8("attack_type_combo")) self.horizontalLayout_2.addWidget(self.attack_type_combo) - spacerItem15 = QtGui.QSpacerItem(13, 30, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem15 = QtWidgets.QSpacerItem(13, 30, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout_2.addItem(spacerItem15) self.horizontalLayout_9.addLayout(self.horizontalLayout_2) - spacerItem16 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem16 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.horizontalLayout_9.addItem(spacerItem16) self.verticalLayout_10.addLayout(self.horizontalLayout_9) self.verticalLayout_6.addLayout(self.verticalLayout_10) self.horizontalLayout_10.addLayout(self.verticalLayout_6) self.verticalLayout_7.addLayout(self.horizontalLayout_10) - self.verticalLayout_4 = QtGui.QVBoxLayout() + self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) - self.ivs_progress_label = QtGui.QLabel(self.general_group_box) + self.ivs_progress_label = QtWidgets.QLabel(self.general_group_box) self.ivs_progress_label.setEnabled(False) self.ivs_progress_label.setAlignment(QtCore.Qt.AlignCenter) self.ivs_progress_label.setObjectName(_fromUtf8("ivs_progress_label")) self.verticalLayout_4.addWidget(self.ivs_progress_label) - self.progressBar = QtGui.QProgressBar(self.general_group_box) + self.progressBar = QtWidgets.QProgressBar(self.general_group_box) self.progressBar.setProperty(_fromUtf8("value"), 24) self.progressBar.setTextVisible(False) self.progressBar.setObjectName(_fromUtf8("progressBar")) @@ -282,23 +282,23 @@ def setupUi(self, attack_panel): self.verticalLayout_7.addLayout(self.verticalLayout_4) self.horizontalLayout_3.addLayout(self.verticalLayout_7) self.verticalLayout_8.addLayout(self.horizontalLayout_3) - spacerItem17 = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem17 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_8.addItem(spacerItem17) self.verticalLayout_12.addLayout(self.verticalLayout_8) - self.keys_cracked_label = QtGui.QLabel(self.general_group_box) + self.keys_cracked_label = QtWidgets.QLabel(self.general_group_box) self.keys_cracked_label.setAlignment(QtCore.Qt.AlignCenter) self.keys_cracked_label.setObjectName(_fromUtf8("keys_cracked_label")) self.verticalLayout_12.addWidget(self.keys_cracked_label) - self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.wps_pin_label = QtGui.QLabel(self.general_group_box) + self.wps_pin_label = QtWidgets.QLabel(self.general_group_box) font = QtGui.QFont() font.setPointSize(13) self.wps_pin_label.setFont(font) self.wps_pin_label.setAlignment(QtCore.Qt.AlignCenter) self.wps_pin_label.setObjectName(_fromUtf8("wps_pin_label")) self.verticalLayout.addWidget(self.wps_pin_label) - self.key_label = QtGui.QLabel(self.general_group_box) + self.key_label = QtWidgets.QLabel(self.general_group_box) font = QtGui.QFont() font.setPointSize(13) self.key_label.setFont(font) @@ -312,45 +312,45 @@ def setupUi(self, attack_panel): QtCore.QMetaObject.connectSlotsByName(attack_panel) def retranslateUi(self, attack_panel): - attack_panel.setWindowTitle(QtGui.QApplication.translate("attack_panel", "Attack Panel", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox_2.setTitle(QtGui.QApplication.translate("attack_panel", "Select Target Access Point", None, QtGui.QApplication.UnicodeUTF8)) + attack_panel.setWindowTitle(QtWidgets.QApplication.translate("attack_panel", "Attack Panel", None, 0)) + self.groupBox_2.setTitle(QtWidgets.QApplication.translate("attack_panel", "Select Target Access Point", None, 0)) self.ap_listwidget.setSortingEnabled(True) __sortingEnabled = self.ap_listwidget.isSortingEnabled() self.ap_listwidget.setSortingEnabled(False) - self.ap_listwidget.item(0).setText(QtGui.QApplication.translate("attack_panel", "Babarere", None, QtGui.QApplication.UnicodeUTF8)) - self.ap_listwidget.item(1).setText(QtGui.QApplication.translate("attack_panel", "SwiftNG", None, QtGui.QApplication.UnicodeUTF8)) + self.ap_listwidget.item(0).setText(QtWidgets.QApplication.translate("attack_panel", "Babarere", None, 0)) + self.ap_listwidget.item(1).setText(QtWidgets.QApplication.translate("attack_panel", "SwiftNG", None, 0)) self.ap_listwidget.setSortingEnabled(__sortingEnabled) - self.attack_button.setText(QtGui.QApplication.translate("attack_panel", "Attack", None, QtGui.QApplication.UnicodeUTF8)) - self.automate_checkbox.setToolTip(QtGui.QApplication.translate("attack_panel", "\n" + self.attack_button.setText(QtWidgets.QApplication.translate("attack_panel", "Attack", None, 0)) + self.automate_checkbox.setToolTip(QtWidgets.QApplication.translate("attack_panel", "\n" "\n" -"

Attack all Access points within range

", None, QtGui.QApplication.UnicodeUTF8)) - self.automate_checkbox.setText(QtGui.QApplication.translate("attack_panel", "Automate", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox.setTitle(QtGui.QApplication.translate("attack_panel", "Access Point Details", None, QtGui.QApplication.UnicodeUTF8)) - self.label_9.setText(QtGui.QApplication.translate("attack_panel", "ESSID:", None, QtGui.QApplication.UnicodeUTF8)) - self.essid_label.setText(QtGui.QApplication.translate("attack_panel", " Babarere", None, QtGui.QApplication.UnicodeUTF8)) - self.label_10.setText(QtGui.QApplication.translate("attack_panel", "BSSID:", None, QtGui.QApplication.UnicodeUTF8)) - self.bssid_label.setText(QtGui.QApplication.translate("attack_panel", "00:CA:30:34:DF:F9", None, QtGui.QApplication.UnicodeUTF8)) - self.label_11.setText(QtGui.QApplication.translate("attack_panel", "Channel:", None, QtGui.QApplication.UnicodeUTF8)) - self.channel_label.setText(QtGui.QApplication.translate("attack_panel", "1", None, QtGui.QApplication.UnicodeUTF8)) - self.label_12.setText(QtGui.QApplication.translate("attack_panel", "Power:", None, QtGui.QApplication.UnicodeUTF8)) - self.power_label.setText(QtGui.QApplication.translate("attack_panel", "-67", None, QtGui.QApplication.UnicodeUTF8)) - self.label_13.setText(QtGui.QApplication.translate("attack_panel", "Encryption:", None, QtGui.QApplication.UnicodeUTF8)) - self.encrypt_wep_label.setText(QtGui.QApplication.translate("attack_panel", "WEP", None, QtGui.QApplication.UnicodeUTF8)) - self.wps_support_label.setText(QtGui.QApplication.translate("attack_panel", "Supports WPS", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox_3.setTitle(QtGui.QApplication.translate("attack_panel", "Attack Option", None, QtGui.QApplication.UnicodeUTF8)) - self.regular_attack_radio.setText(QtGui.QApplication.translate("attack_panel", "Regular Attack", None, QtGui.QApplication.UnicodeUTF8)) - self.wps_attack_radio.setText(QtGui.QApplication.translate("attack_panel", "WPS Attack", None, QtGui.QApplication.UnicodeUTF8)) - self.associate_label.setText(QtGui.QApplication.translate("attack_panel", "Associating with Access Point", None, QtGui.QApplication.UnicodeUTF8)) - self.injecting_label.setText(QtGui.QApplication.translate("attack_panel", "Gathering Packets", None, QtGui.QApplication.UnicodeUTF8)) - self.gathering_label.setText(QtGui.QApplication.translate("attack_panel", "Packet Injection Status", None, QtGui.QApplication.UnicodeUTF8)) - self.cracking_label_2.setText(QtGui.QApplication.translate("attack_panel", "Cracking Encryption", None, QtGui.QApplication.UnicodeUTF8)) - self.finished_label.setText(QtGui.QApplication.translate("attack_panel", "Finished", None, QtGui.QApplication.UnicodeUTF8)) - self.injection_work_label_2.setText(QtGui.QApplication.translate("attack_panel", "Injection Capability Status", None, QtGui.QApplication.UnicodeUTF8)) - self.dictionary_set.setText(QtGui.QApplication.translate("attack_panel", "Browse", None, QtGui.QApplication.UnicodeUTF8)) - self.ivs_progress_label.setText(QtGui.QApplication.translate("attack_panel", "IVS status", None, QtGui.QApplication.UnicodeUTF8)) - self.keys_cracked_label.setText(QtGui.QApplication.translate("attack_panel", "2 Keys Cracked", None, QtGui.QApplication.UnicodeUTF8)) - self.wps_pin_label.setText(QtGui.QApplication.translate("attack_panel", "WPS PIN: 192345673", None, QtGui.QApplication.UnicodeUTF8)) - self.key_label.setText(QtGui.QApplication.translate("attack_panel", "WEP KEY: 1234567890", None, QtGui.QApplication.UnicodeUTF8)) +"

Attack all Access points within range

", None, 0)) + self.automate_checkbox.setText(QtWidgets.QApplication.translate("attack_panel", "Automate", None, 0)) + self.groupBox.setTitle(QtWidgets.QApplication.translate("attack_panel", "Access Point Details", None, 0)) + self.label_9.setText(QtWidgets.QApplication.translate("attack_panel", "ESSID:", None, 0)) + self.essid_label.setText(QtWidgets.QApplication.translate("attack_panel", " Babarere", None, 0)) + self.label_10.setText(QtWidgets.QApplication.translate("attack_panel", "BSSID:", None, 0)) + self.bssid_label.setText(QtWidgets.QApplication.translate("attack_panel", "00:CA:30:34:DF:F9", None, 0)) + self.label_11.setText(QtWidgets.QApplication.translate("attack_panel", "Channel:", None, 0)) + self.channel_label.setText(QtWidgets.QApplication.translate("attack_panel", "1", None, 0)) + self.label_12.setText(QtWidgets.QApplication.translate("attack_panel", "Power:", None, 0)) + self.power_label.setText(QtWidgets.QApplication.translate("attack_panel", "-67", None, 0)) + self.label_13.setText(QtWidgets.QApplication.translate("attack_panel", "Encryption:", None, 0)) + self.encrypt_wep_label.setText(QtWidgets.QApplication.translate("attack_panel", "WEP", None, 0)) + self.wps_support_label.setText(QtWidgets.QApplication.translate("attack_panel", "Supports WPS", None, 0)) + self.groupBox_3.setTitle(QtWidgets.QApplication.translate("attack_panel", "Attack Option", None, 0)) + self.regular_attack_radio.setText(QtWidgets.QApplication.translate("attack_panel", "Regular Attack", None, 0)) + self.wps_attack_radio.setText(QtWidgets.QApplication.translate("attack_panel", "WPS Attack", None, 0)) + self.associate_label.setText(QtWidgets.QApplication.translate("attack_panel", "Associating with Access Point", None, 0)) + self.injecting_label.setText(QtWidgets.QApplication.translate("attack_panel", "Gathering Packets", None, 0)) + self.gathering_label.setText(QtWidgets.QApplication.translate("attack_panel", "Packet Injection Status", None, 0)) + self.cracking_label_2.setText(QtWidgets.QApplication.translate("attack_panel", "Cracking Encryption", None, 0)) + self.finished_label.setText(QtWidgets.QApplication.translate("attack_panel", "Finished", None, 0)) + self.injection_work_label_2.setText(QtWidgets.QApplication.translate("attack_panel", "Injection Capability Status", None, 0)) + self.dictionary_set.setText(QtWidgets.QApplication.translate("attack_panel", "Browse", None, 0)) + self.ivs_progress_label.setText(QtWidgets.QApplication.translate("attack_panel", "IVS status", None, 0)) + self.keys_cracked_label.setText(QtWidgets.QApplication.translate("attack_panel", "2 Keys Cracked", None, 0)) + self.wps_pin_label.setText(QtWidgets.QApplication.translate("attack_panel", "WPS PIN: 192345673", None, 0)) + self.key_label.setText(QtWidgets.QApplication.translate("attack_panel", "WEP KEY: 1234567890", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/attack_settings.py b/Fern-Wifi-Cracker/gui/attack_settings.py index 5315b94..7ff7009 100644 --- a/Fern-Wifi-Cracker/gui/attack_settings.py +++ b/Fern-Wifi-Cracker/gui/attack_settings.py @@ -1,7 +1,7 @@ import os from main_window import font_size -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets, QtGui font_setting = font_size() @@ -18,36 +18,36 @@ def setupUi(self, attack_settings): icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/mac_address.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) attack_settings.setWindowIcon(icon) - self.verticalLayout_3 = QtGui.QVBoxLayout(attack_settings) + self.verticalLayout_3 = QtWidgets.QVBoxLayout(attack_settings) self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - self.mac_box = QtGui.QGroupBox(attack_settings) + self.mac_box = QtWidgets.QGroupBox(attack_settings) font = QtGui.QFont() font.setPointSize(font_setting) self.mac_box.setFont(font) self.mac_box.setCheckable(True) self.mac_box.setChecked(False) self.mac_box.setObjectName(_fromUtf8("mac_box")) - self.verticalLayout = QtGui.QVBoxLayout(self.mac_box) + self.verticalLayout = QtWidgets.QVBoxLayout(self.mac_box) self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.label = QtGui.QLabel(self.mac_box) + self.label = QtWidgets.QLabel(self.mac_box) font = QtGui.QFont() font.setPointSize(font_setting) self.label.setFont(font) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout.addWidget(self.label) - spacerItem = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem = QtWidgets.QSpacerItem(20, 5, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout.addItem(spacerItem) - self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - self.mac_edit = QtGui.QLineEdit(self.mac_box) + self.mac_edit = QtWidgets.QLineEdit(self.mac_box) font = QtGui.QFont() font.setPointSize(font_setting) self.mac_edit.setFont(font) self.mac_edit.setObjectName(_fromUtf8("mac_edit")) self.horizontalLayout.addWidget(self.mac_edit) - spacerItem1 = QtGui.QSpacerItem(22, 21, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem1 = QtWidgets.QSpacerItem(22, 21, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) - self.mac_button = QtGui.QPushButton(self.mac_box) + self.mac_button = QtWidgets.QPushButton(self.mac_box) font = QtGui.QFont() font.setPointSize(font_setting) self.mac_button.setFont(font) @@ -55,31 +55,31 @@ def setupUi(self, attack_settings): self.horizontalLayout.addWidget(self.mac_button) self.verticalLayout.addLayout(self.horizontalLayout) self.verticalLayout_3.addWidget(self.mac_box) - self.capture_box = QtGui.QGroupBox(attack_settings) + self.capture_box = QtWidgets.QGroupBox(attack_settings) font = QtGui.QFont() font.setPointSize(font_setting) self.capture_box.setFont(font) self.capture_box.setCheckable(True) self.capture_box.setChecked(False) self.capture_box.setObjectName(_fromUtf8("capture_box")) - self.verticalLayout_2 = QtGui.QVBoxLayout(self.capture_box) + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.capture_box) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.label_2 = QtGui.QLabel(self.capture_box) + self.label_2 = QtWidgets.QLabel(self.capture_box) font = QtGui.QFont() font.setPointSize(font_setting) self.label_2.setFont(font) self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout_2.addWidget(self.label_2) - spacerItem2 = QtGui.QSpacerItem(20, 1, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem2 = QtWidgets.QSpacerItem(20, 1, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_2.addItem(spacerItem2) - self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - self.directory_label = QtGui.QLabel(self.capture_box) + self.directory_label = QtWidgets.QLabel(self.capture_box) self.directory_label.setObjectName(_fromUtf8("directory_label")) self.horizontalLayout_2.addWidget(self.directory_label) - spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem3) - self.direc_browse = QtGui.QPushButton(self.capture_box) + self.direc_browse = QtWidgets.QPushButton(self.capture_box) self.direc_browse.setObjectName(_fromUtf8("direc_browse")) self.horizontalLayout_2.addWidget(self.direc_browse) self.verticalLayout_2.addLayout(self.horizontalLayout_2) @@ -89,12 +89,12 @@ def setupUi(self, attack_settings): QtCore.QMetaObject.connectSlotsByName(attack_settings) def retranslateUi(self, attack_settings): - attack_settings.setWindowTitle(QtGui.QApplication.translate("attack_settings", "WIFI Attack Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.mac_box.setTitle(QtGui.QApplication.translate("attack_settings", "Default MAC Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("attack_settings", "Set default MAC address to be used when attempting WIFI attacks", None, QtGui.QApplication.UnicodeUTF8)) - self.mac_button.setText(QtGui.QApplication.translate("attack_settings", "Set MAC", None, QtGui.QApplication.UnicodeUTF8)) - self.capture_box.setTitle(QtGui.QApplication.translate("attack_settings", "Capture File Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("attack_settings", "Set Directory for storing capture files for offline usage", None, QtGui.QApplication.UnicodeUTF8)) - self.directory_label.setText(QtGui.QApplication.translate("attack_settings", "", None, QtGui.QApplication.UnicodeUTF8)) - self.direc_browse.setText(QtGui.QApplication.translate("attack_settings", "Browse", None, QtGui.QApplication.UnicodeUTF8)) + attack_settings.setWindowTitle(QtWidgets.QApplication.translate("attack_settings", "WIFI Attack Settings", None, 0)) + self.mac_box.setTitle(QtWidgets.QApplication.translate("attack_settings", "Default MAC Settings", None, 0)) + self.label.setText(QtWidgets.QApplication.translate("attack_settings", "Set default MAC address to be used when attempting WIFI attacks", None, 0)) + self.mac_button.setText(QtWidgets.QApplication.translate("attack_settings", "Set MAC", None, 0)) + self.capture_box.setTitle(QtWidgets.QApplication.translate("attack_settings", "Capture File Settings", None, 0)) + self.label_2.setText(QtWidgets.QApplication.translate("attack_settings", "Set Directory for storing capture files for offline usage", None, 0)) + self.directory_label.setText(QtWidgets.QApplication.translate("attack_settings", "", None, 0)) + self.direc_browse.setText(QtWidgets.QApplication.translate("attack_settings", "Browse", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/cookie_hijacker.py b/Fern-Wifi-Cracker/gui/cookie_hijacker.py index dbd3492..2975a34 100644 --- a/Fern-Wifi-Cracker/gui/cookie_hijacker.py +++ b/Fern-Wifi-Cracker/gui/cookie_hijacker.py @@ -1,10 +1,9 @@ import os from main_window import font_size -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets, QtGui font_setting = font_size() -from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 @@ -16,44 +15,44 @@ class Ui_cookie_hijacker(object): def setupUi(self, cookie_hijacker): cookie_hijacker.setObjectName(_fromUtf8("cookie_hijacker")) cookie_hijacker.resize(857, 655) - self.verticalLayout_8 = QtGui.QVBoxLayout(cookie_hijacker) + self.verticalLayout_8 = QtWidgets.QVBoxLayout(cookie_hijacker) self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8")) - self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) - self.label_9 = QtGui.QLabel(cookie_hijacker) + self.label_9 = QtWidgets.QLabel(cookie_hijacker) self.label_9.setText(_fromUtf8("")) self.label_9.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/cookies-icon.png"%(os.getcwd())))) self.label_9.setObjectName(_fromUtf8("label_9")) self.horizontalLayout_3.addWidget(self.label_9) - self.verticalLayout_7 = QtGui.QVBoxLayout() + self.verticalLayout_7 = QtWidgets.QVBoxLayout() self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7")) - self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.label_2 = QtGui.QLabel(cookie_hijacker) + self.label_2 = QtWidgets.QLabel(cookie_hijacker) font = QtGui.QFont() font.setPointSize(font_setting) self.label_2.setFont(font) self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout.addWidget(self.label_2) - self.label_5 = QtGui.QLabel(cookie_hijacker) + self.label_5 = QtWidgets.QLabel(cookie_hijacker) font = QtGui.QFont() font.setPointSize(font_setting) self.label_5.setFont(font) self.label_5.setObjectName(_fromUtf8("label_5")) self.verticalLayout.addWidget(self.label_5) self.verticalLayout_7.addLayout(self.verticalLayout) - spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_7.addItem(spacerItem) - self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - self.horizontalLayout_14 = QtGui.QHBoxLayout() + self.horizontalLayout_14 = QtWidgets.QHBoxLayout() self.horizontalLayout_14.setObjectName(_fromUtf8("horizontalLayout_14")) - spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_14.addItem(spacerItem1) - self.verticalLayout_6 = QtGui.QVBoxLayout() + self.verticalLayout_6 = QtWidgets.QVBoxLayout() self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6")) - self.combo_interface = QtGui.QComboBox(cookie_hijacker) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.combo_interface = QtWidgets.QComboBox(cookie_hijacker) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.combo_interface.sizePolicy().hasHeightForWidth()) @@ -63,13 +62,13 @@ def setupUi(self, cookie_hijacker): self.combo_interface.setFont(font) self.combo_interface.setObjectName(_fromUtf8("combo_interface")) self.verticalLayout_6.addWidget(self.combo_interface) - spacerItem2 = QtGui.QSpacerItem(177, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem2 = QtWidgets.QSpacerItem(177, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_6.addItem(spacerItem2) self.horizontalLayout_14.addLayout(self.verticalLayout_6) - self.verticalLayout_5 = QtGui.QVBoxLayout() + self.verticalLayout_5 = QtWidgets.QVBoxLayout() self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) - self.refresh_button = QtGui.QPushButton(cookie_hijacker) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Fixed) + self.refresh_button = QtWidgets.QPushButton(cookie_hijacker) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.refresh_button.sizePolicy().hasHeightForWidth()) @@ -83,33 +82,33 @@ def setupUi(self, cookie_hijacker): self.refresh_button.setIconSize(QtCore.QSize(22, 23)) self.refresh_button.setObjectName(_fromUtf8("refresh_button")) self.verticalLayout_5.addWidget(self.refresh_button) - spacerItem3 = QtGui.QSpacerItem(82, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem3 = QtWidgets.QSpacerItem(82, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_5.addItem(spacerItem3) self.horizontalLayout_14.addLayout(self.verticalLayout_5) - spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_14.addItem(spacerItem4) - spacerItem5 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_14.addItem(spacerItem5) self.horizontalLayout_2.addLayout(self.horizontalLayout_14) self.verticalLayout_7.addLayout(self.horizontalLayout_2) self.horizontalLayout_3.addLayout(self.verticalLayout_7) self.verticalLayout_8.addLayout(self.horizontalLayout_3) - self.horizontalLayout_12 = QtGui.QHBoxLayout() + self.horizontalLayout_12 = QtWidgets.QHBoxLayout() self.horizontalLayout_12.setObjectName(_fromUtf8("horizontalLayout_12")) - spacerItem6 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_12.addItem(spacerItem6) - self.horizontalLayout_11 = QtGui.QHBoxLayout() + self.horizontalLayout_11 = QtWidgets.QHBoxLayout() self.horizontalLayout_11.setObjectName(_fromUtf8("horizontalLayout_11")) - self.horizontalLayout_10 = QtGui.QHBoxLayout() + self.horizontalLayout_10 = QtWidgets.QHBoxLayout() self.horizontalLayout_10.setObjectName(_fromUtf8("horizontalLayout_10")) - self.horizontalLayout_4 = QtGui.QHBoxLayout() + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) - self.monitor_interface_led = QtGui.QLabel(cookie_hijacker) + self.monitor_interface_led = QtWidgets.QLabel(cookie_hijacker) self.monitor_interface_led.setText(_fromUtf8("")) self.monitor_interface_led.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/red_led.png"%(os.getcwd())))) self.monitor_interface_led.setObjectName(_fromUtf8("monitor_interface_led")) self.horizontalLayout_4.addWidget(self.monitor_interface_led) - self.monitor_interface_label = QtGui.QLabel(cookie_hijacker) + self.monitor_interface_label = QtWidgets.QLabel(cookie_hijacker) self.monitor_interface_label.setEnabled(True) font = QtGui.QFont() font.setPointSize(font_setting) @@ -118,20 +117,20 @@ def setupUi(self, cookie_hijacker): self.horizontalLayout_4.addWidget(self.monitor_interface_label) self.horizontalLayout_10.addLayout(self.horizontalLayout_4) self.horizontalLayout_11.addLayout(self.horizontalLayout_10) - self.horizontalLayout_9 = QtGui.QHBoxLayout() + self.horizontalLayout_9 = QtWidgets.QHBoxLayout() self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9")) - self.horizontalLayout_8 = QtGui.QHBoxLayout() + self.horizontalLayout_8 = QtWidgets.QHBoxLayout() self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8")) - spacerItem7 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_8.addItem(spacerItem7) - self.horizontalLayout_6 = QtGui.QHBoxLayout() + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) - self.sniffing_status_led = QtGui.QLabel(cookie_hijacker) + self.sniffing_status_led = QtWidgets.QLabel(cookie_hijacker) self.sniffing_status_led.setText(_fromUtf8("")) self.sniffing_status_led.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/red_led.png"%(os.getcwd())))) self.sniffing_status_led.setObjectName(_fromUtf8("sniffing_status_led")) self.horizontalLayout_6.addWidget(self.sniffing_status_led) - self.sniffing_status_label = QtGui.QLabel(cookie_hijacker) + self.sniffing_status_label = QtWidgets.QLabel(cookie_hijacker) self.sniffing_status_label.setEnabled(True) font = QtGui.QFont() font.setPointSize(font_setting) @@ -140,18 +139,18 @@ def setupUi(self, cookie_hijacker): self.horizontalLayout_6.addWidget(self.sniffing_status_label) self.horizontalLayout_8.addLayout(self.horizontalLayout_6) self.horizontalLayout_9.addLayout(self.horizontalLayout_8) - self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - spacerItem8 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem8) - self.horizontalLayout_5 = QtGui.QHBoxLayout() + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) - self.cookie_detection_led = QtGui.QLabel(cookie_hijacker) + self.cookie_detection_led = QtWidgets.QLabel(cookie_hijacker) self.cookie_detection_led.setText(_fromUtf8("")) self.cookie_detection_led.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/red_led.png"%(os.getcwd())))) self.cookie_detection_led.setObjectName(_fromUtf8("cookie_detection_led")) self.horizontalLayout_5.addWidget(self.cookie_detection_led) - self.cookie_detection_label = QtGui.QLabel(cookie_hijacker) + self.cookie_detection_label = QtWidgets.QLabel(cookie_hijacker) self.cookie_detection_label.setEnabled(True) font = QtGui.QFont() font.setPointSize(font_setting) @@ -162,44 +161,44 @@ def setupUi(self, cookie_hijacker): self.horizontalLayout_9.addLayout(self.horizontalLayout) self.horizontalLayout_11.addLayout(self.horizontalLayout_9) self.horizontalLayout_12.addLayout(self.horizontalLayout_11) - spacerItem9 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_12.addItem(spacerItem9) self.verticalLayout_8.addLayout(self.horizontalLayout_12) - self.mitm_activated_label = QtGui.QLabel(cookie_hijacker) + self.mitm_activated_label = QtWidgets.QLabel(cookie_hijacker) self.mitm_activated_label.setEnabled(False) font = QtGui.QFont() font.setPointSize(font_setting) self.mitm_activated_label.setFont(font) self.mitm_activated_label.setObjectName(_fromUtf8("mitm_activated_label")) self.verticalLayout_8.addWidget(self.mitm_activated_label) - self.horizontalLayout_17 = QtGui.QHBoxLayout() + self.horizontalLayout_17 = QtWidgets.QHBoxLayout() self.horizontalLayout_17.setObjectName(_fromUtf8("horizontalLayout_17")) - spacerItem10 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_17.addItem(spacerItem10) - self.ethernet_mode_radio = QtGui.QRadioButton(cookie_hijacker) + self.ethernet_mode_radio = QtWidgets.QRadioButton(cookie_hijacker) font = QtGui.QFont() font.setPointSize(font_setting) self.ethernet_mode_radio.setFont(font) self.ethernet_mode_radio.setChecked(True) self.ethernet_mode_radio.setObjectName(_fromUtf8("ethernet_mode_radio")) self.horizontalLayout_17.addWidget(self.ethernet_mode_radio) - spacerItem11 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_17.addItem(spacerItem11) - self.passive_mode_radio = QtGui.QRadioButton(cookie_hijacker) + self.passive_mode_radio = QtWidgets.QRadioButton(cookie_hijacker) font = QtGui.QFont() font.setPointSize(font_setting) self.passive_mode_radio.setFont(font) self.passive_mode_radio.setObjectName(_fromUtf8("passive_mode_radio")) self.horizontalLayout_17.addWidget(self.passive_mode_radio) - spacerItem12 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_17.addItem(spacerItem12) self.verticalLayout_8.addLayout(self.horizontalLayout_17) - self.horizontalLayout_16 = QtGui.QHBoxLayout() + self.horizontalLayout_16 = QtWidgets.QHBoxLayout() self.horizontalLayout_16.setObjectName(_fromUtf8("horizontalLayout_16")) - self.verticalLayout_4 = QtGui.QVBoxLayout() + self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) - self.groupBox_2 = QtGui.QGroupBox(cookie_hijacker) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Preferred) + self.groupBox_2 = QtWidgets.QGroupBox(cookie_hijacker) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox_2.sizePolicy().hasHeightForWidth()) @@ -209,80 +208,80 @@ def setupUi(self, cookie_hijacker): self.groupBox_2.setFont(font) self.groupBox_2.setTitle(_fromUtf8("")) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) - self.verticalLayout_2 = QtGui.QVBoxLayout(self.groupBox_2) + self.verticalLayout_2 = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.horizontalLayout_7 = QtGui.QHBoxLayout() + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) - self.label = QtGui.QLabel(self.groupBox_2) + self.label = QtWidgets.QLabel(self.groupBox_2) font = QtGui.QFont() font.setPointSize(font_setting) self.label.setFont(font) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout_7.addWidget(self.label) - self.horizontalLayout_15 = QtGui.QHBoxLayout() + self.horizontalLayout_15 = QtWidgets.QHBoxLayout() self.horizontalLayout_15.setObjectName(_fromUtf8("horizontalLayout_15")) - self.wep_key_edit = QtGui.QLineEdit(self.groupBox_2) + self.wep_key_edit = QtWidgets.QLineEdit(self.groupBox_2) font = QtGui.QFont() font.setPointSize(font_setting) self.wep_key_edit.setFont(font) self.wep_key_edit.setObjectName(_fromUtf8("wep_key_edit")) self.horizontalLayout_15.addWidget(self.wep_key_edit) - self.channel_label = QtGui.QLabel(self.groupBox_2) + self.channel_label = QtWidgets.QLabel(self.groupBox_2) self.channel_label.setObjectName(_fromUtf8("channel_label")) self.horizontalLayout_15.addWidget(self.channel_label) - self.channel_combo = QtGui.QComboBox(self.groupBox_2) + self.channel_combo = QtWidgets.QComboBox(self.groupBox_2) self.channel_combo.setObjectName(_fromUtf8("channel_combo")) self.horizontalLayout_15.addWidget(self.channel_combo) self.horizontalLayout_7.addLayout(self.horizontalLayout_15) self.verticalLayout_2.addLayout(self.horizontalLayout_7) - spacerItem13 = QtGui.QSpacerItem(20, 6, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem13 = QtWidgets.QSpacerItem(20, 6, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_2.addItem(spacerItem13) self.verticalLayout_4.addWidget(self.groupBox_2) self.horizontalLayout_16.addLayout(self.verticalLayout_4) self.verticalLayout_8.addLayout(self.horizontalLayout_16) - self.treeWidget = QtGui.QTreeWidget(cookie_hijacker) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + self.treeWidget = QtWidgets.QTreeWidget(cookie_hijacker) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.treeWidget.sizePolicy().hasHeightForWidth()) self.treeWidget.setSizePolicy(sizePolicy) self.treeWidget.setObjectName(_fromUtf8("treeWidget")) - item_0 = QtGui.QTreeWidgetItem(self.treeWidget) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) font = QtGui.QFont() font.setPointSize(10) item_0.setFont(0, font) - item_1 = QtGui.QTreeWidgetItem(item_0) + item_1 = QtWidgets.QTreeWidgetItem(item_0) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/green_led.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) item_1.setIcon(0, icon1) - item_2 = QtGui.QTreeWidgetItem(item_1) - item_1 = QtGui.QTreeWidgetItem(item_0) + item_2 = QtWidgets.QTreeWidgetItem(item_1) + item_1 = QtWidgets.QTreeWidgetItem(item_0) item_1.setIcon(0, icon1) - item_2 = QtGui.QTreeWidgetItem(item_1) - item_0 = QtGui.QTreeWidgetItem(self.treeWidget) + item_2 = QtWidgets.QTreeWidgetItem(item_1) + item_0 = QtWidgets.QTreeWidgetItem(self.treeWidget) font = QtGui.QFont() font.setPointSize(10) item_0.setFont(0, font) - item_1 = QtGui.QTreeWidgetItem(item_0) + item_1 = QtWidgets.QTreeWidgetItem(item_0) item_1.setIcon(0, icon1) - item_2 = QtGui.QTreeWidgetItem(item_1) + item_2 = QtWidgets.QTreeWidgetItem(item_1) self.verticalLayout_8.addWidget(self.treeWidget) - self.verticalLayout_3 = QtGui.QVBoxLayout() + self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - self.cookies_captured_label = QtGui.QLabel(cookie_hijacker) + self.cookies_captured_label = QtWidgets.QLabel(cookie_hijacker) font = QtGui.QFont() font.setPointSize(font_setting) self.cookies_captured_label.setFont(font) self.cookies_captured_label.setObjectName(_fromUtf8("cookies_captured_label")) self.verticalLayout_3.addWidget(self.cookies_captured_label) - spacerItem14 = QtGui.QSpacerItem(20, 17, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) + spacerItem14 = QtWidgets.QSpacerItem(20, 17, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_3.addItem(spacerItem14) - self.horizontalLayout_13 = QtGui.QHBoxLayout() + self.horizontalLayout_13 = QtWidgets.QHBoxLayout() self.horizontalLayout_13.setObjectName(_fromUtf8("horizontalLayout_13")) - spacerItem15 = QtGui.QSpacerItem(1, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) + spacerItem15 = QtWidgets.QSpacerItem(1, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_13.addItem(spacerItem15) - self.start_sniffing_button = QtGui.QPushButton(cookie_hijacker) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Ignored) + self.start_sniffing_button = QtWidgets.QPushButton(cookie_hijacker) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.start_sniffing_button.sizePolicy().hasHeightForWidth()) @@ -293,7 +292,7 @@ def setupUi(self, cookie_hijacker): self.start_sniffing_button.setObjectName(_fromUtf8("start_sniffing_button")) self.horizontalLayout_13.addWidget(self.start_sniffing_button) self.verticalLayout_3.addLayout(self.horizontalLayout_13) - spacerItem16 = QtGui.QSpacerItem(20, 17, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) + spacerItem16 = QtWidgets.QSpacerItem(20, 17, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_3.addItem(spacerItem16) self.verticalLayout_8.addLayout(self.verticalLayout_3) @@ -301,44 +300,44 @@ def setupUi(self, cookie_hijacker): QtCore.QMetaObject.connectSlotsByName(cookie_hijacker) def retranslateUi(self, cookie_hijacker): - cookie_hijacker.setWindowTitle(QtGui.QApplication.translate("cookie_hijacker", "Fern - Cookie Hijacker", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("cookie_hijacker", "Fern Cookie Hijacker is an Ethernet and WIFI based session Hijacking tool able to clone remote online web sessions by sniffing and capturing session cookie", None, QtGui.QApplication.UnicodeUTF8)) - self.label_5.setText(QtGui.QApplication.translate("cookie_hijacker", "packets from remote hosts by leveraging various internal MITM attacks with routing capabilities", None, QtGui.QApplication.UnicodeUTF8)) - self.refresh_button.setText(QtGui.QApplication.translate("cookie_hijacker", "Refresh", None, QtGui.QApplication.UnicodeUTF8)) - self.monitor_interface_label.setText(QtGui.QApplication.translate("cookie_hijacker", "Ethernet Mode", None, QtGui.QApplication.UnicodeUTF8)) - self.sniffing_status_label.setText(QtGui.QApplication.translate("cookie_hijacker", "Sniffing Status", None, QtGui.QApplication.UnicodeUTF8)) - self.cookie_detection_label.setText(QtGui.QApplication.translate("cookie_hijacker", "Cookie Detection Buffer", None, QtGui.QApplication.UnicodeUTF8)) - self.mitm_activated_label.setText(QtGui.QApplication.translate("cookie_hijacker", "Internal MITM Engine Activated", None, QtGui.QApplication.UnicodeUTF8)) - self.ethernet_mode_radio.setToolTip(QtGui.QApplication.translate("cookie_hijacker", "\n" + cookie_hijacker.setWindowTitle(QtWidgets.QApplication.translate("cookie_hijacker", "Fern - Cookie Hijacker", None, 0)) + self.label_2.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Fern Cookie Hijacker is an Ethernet and WIFI based session Hijacking tool able to clone remote online web sessions by sniffing and capturing session cookie", None, 0)) + self.label_5.setText(QtWidgets.QApplication.translate("cookie_hijacker", "packets from remote hosts by leveraging various internal MITM attacks with routing capabilities", None, 0)) + self.refresh_button.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Refresh", None, 0)) + self.monitor_interface_label.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Ethernet Mode", None, 0)) + self.sniffing_status_label.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Sniffing Status", None, 0)) + self.cookie_detection_label.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Cookie Detection Buffer", None, 0)) + self.mitm_activated_label.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Internal MITM Engine Activated", None, 0)) + self.ethernet_mode_radio.setToolTip(QtWidgets.QApplication.translate("cookie_hijacker", "\n" "\n" -"

Use this option if you are currently connected to the ethernet gateway/access point

", None, QtGui.QApplication.UnicodeUTF8)) - self.ethernet_mode_radio.setText(QtGui.QApplication.translate("cookie_hijacker", "Ethernet Mode", None, QtGui.QApplication.UnicodeUTF8)) - self.passive_mode_radio.setToolTip(QtGui.QApplication.translate("cookie_hijacker", "\n" +"

Use this option if you are currently connected to the ethernet gateway/access point

", None, 0)) + self.ethernet_mode_radio.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Ethernet Mode", None, 0)) + self.passive_mode_radio.setToolTip(QtWidgets.QApplication.translate("cookie_hijacker", "\n" "\n" -"

Use this option if you are not connected to access point

", None, QtGui.QApplication.UnicodeUTF8)) - self.passive_mode_radio.setText(QtGui.QApplication.translate("cookie_hijacker", "Passive Mode", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("cookie_hijacker", "Gateway IP Address / Router IP Address:", None, QtGui.QApplication.UnicodeUTF8)) - self.channel_label.setText(QtGui.QApplication.translate("cookie_hijacker", "Channel:", None, QtGui.QApplication.UnicodeUTF8)) - self.treeWidget.headerItem().setText(0, QtGui.QApplication.translate("cookie_hijacker", " ", None, QtGui.QApplication.UnicodeUTF8)) +"

Use this option if you are not connected to access point

", None, 0)) + self.passive_mode_radio.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Passive Mode", None, 0)) + self.label.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Gateway IP Address / Router IP Address:", None, 0)) + self.channel_label.setText(QtWidgets.QApplication.translate("cookie_hijacker", "Channel:", None, 0)) + self.treeWidget.headerItem().setText(0, QtWidgets.QApplication.translate("cookie_hijacker", " ", None, 0)) __sortingEnabled = self.treeWidget.isSortingEnabled() self.treeWidget.setSortingEnabled(False) - self.treeWidget.topLevelItem(0).setText(0, QtGui.QApplication.translate("cookie_hijacker", "192.168.0.1", None, QtGui.QApplication.UnicodeUTF8)) - self.treeWidget.topLevelItem(0).child(0).setText(0, QtGui.QApplication.translate("cookie_hijacker", "www.google.com", None, QtGui.QApplication.UnicodeUTF8)) - self.treeWidget.topLevelItem(0).child(0).child(0).setText(0, QtGui.QApplication.translate("cookie_hijacker", "HTTP response", None, QtGui.QApplication.UnicodeUTF8)) - self.treeWidget.topLevelItem(0).child(1).setText(0, QtGui.QApplication.translate("cookie_hijacker", "www.twitter.com", None, QtGui.QApplication.UnicodeUTF8)) - self.treeWidget.topLevelItem(0).child(1).child(0).setText(0, QtGui.QApplication.translate("cookie_hijacker", "HTTP over", None, QtGui.QApplication.UnicodeUTF8)) - self.treeWidget.topLevelItem(1).setText(0, QtGui.QApplication.translate("cookie_hijacker", "198.178.23.1", None, QtGui.QApplication.UnicodeUTF8)) - self.treeWidget.topLevelItem(1).child(0).setText(0, QtGui.QApplication.translate("cookie_hijacker", "www.gmail.com", None, QtGui.QApplication.UnicodeUTF8)) - self.treeWidget.topLevelItem(1).child(0).child(0).setText(0, QtGui.QApplication.translate("cookie_hijacker", "respose server", None, QtGui.QApplication.UnicodeUTF8)) + self.treeWidget.topLevelItem(0).setText(0, QtWidgets.QApplication.translate("cookie_hijacker", "192.168.0.1", None, 0)) + self.treeWidget.topLevelItem(0).child(0).setText(0, QtWidgets.QApplication.translate("cookie_hijacker", "www.google.com", None, 0)) + self.treeWidget.topLevelItem(0).child(0).child(0).setText(0, QtWidgets.QApplication.translate("cookie_hijacker", "HTTP response", None, 0)) + self.treeWidget.topLevelItem(0).child(1).setText(0, QtWidgets.QApplication.translate("cookie_hijacker", "www.twitter.com", None, 0)) + self.treeWidget.topLevelItem(0).child(1).child(0).setText(0, QtWidgets.QApplication.translate("cookie_hijacker", "HTTP over", None, 0)) + self.treeWidget.topLevelItem(1).setText(0, QtWidgets.QApplication.translate("cookie_hijacker", "198.178.23.1", None, 0)) + self.treeWidget.topLevelItem(1).child(0).setText(0, QtWidgets.QApplication.translate("cookie_hijacker", "www.gmail.com", None, 0)) + self.treeWidget.topLevelItem(1).child(0).child(0).setText(0, QtWidgets.QApplication.translate("cookie_hijacker", "respose server", None, 0)) self.treeWidget.setSortingEnabled(__sortingEnabled) - self.cookies_captured_label.setText(QtGui.QApplication.translate("cookie_hijacker", "\n" + self.cookies_captured_label.setText(QtWidgets.QApplication.translate("cookie_hijacker", "\n" "\n" -"

5 Cookies Captured

", None, QtGui.QApplication.UnicodeUTF8)) - self.start_sniffing_button.setText(QtGui.QApplication.translate("cookie_hijacker", " Start Sniffing ", None, QtGui.QApplication.UnicodeUTF8)) +"

5 Cookies Captured

", None, 0)) + self.start_sniffing_button.setText(QtWidgets.QApplication.translate("cookie_hijacker", " Start Sniffing ", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/database.py b/Fern-Wifi-Cracker/gui/database.py index 0691dc0..319c11e 100644 --- a/Fern-Wifi-Cracker/gui/database.py +++ b/Fern-Wifi-Cracker/gui/database.py @@ -1,6 +1,6 @@ import os from main_window import font_size -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 @@ -16,26 +16,26 @@ def setupUi(self, database): icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/Database-64.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) database.setWindowIcon(icon) - self.verticalLayout_2 = QtGui.QVBoxLayout(database) + self.verticalLayout_2 = QtWidgets.QVBoxLayout(database) self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.label = QtGui.QLabel(database) + self.label = QtWidgets.QLabel(database) font = QtGui.QFont() font.setPointSize(font_setting) self.label.setFont(font) self.label.setObjectName(_fromUtf8("label")) self.verticalLayout.addWidget(self.label) - self.label_2 = QtGui.QLabel(database) + self.label_2 = QtWidgets.QLabel(database) font = QtGui.QFont() font.setPointSize(font_setting) self.label_2.setFont(font) self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout.addWidget(self.label_2) self.verticalLayout_2.addLayout(self.verticalLayout) - spacerItem = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem = QtWidgets.QSpacerItem(20, 5, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_2.addItem(spacerItem) - self.key_table = QtGui.QTableWidget(database) + self.key_table = QtWidgets.QTableWidget(database) font = QtGui.QFont() font.setPointSize(font_setting) self.key_table.setFont(font) @@ -44,34 +44,34 @@ def setupUi(self, database): self.key_table.setRowCount(0) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/router-icone-7671-128.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.key_table.setHorizontalHeaderItem(0, item) item.setIcon(icon1) icon2 = QtGui.QIcon() icon2.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/mac_address.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.key_table.setHorizontalHeaderItem(1, item) item.setIcon(icon2) icon3 = QtGui.QIcon() icon3.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/binary.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.key_table.setHorizontalHeaderItem(2, item) item.setIcon(icon3) icon4 = QtGui.QIcon() icon4.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/login_128.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.key_table.setHorizontalHeaderItem(3, item) item.setIcon(icon4) icon5 = QtGui.QIcon() icon5.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/wifi_5.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) - item = QtGui.QTableWidgetItem() + item = QtWidgets.QTableWidgetItem() self.key_table.setHorizontalHeaderItem(4, item) item.setIcon(icon5) self.verticalLayout_2.addWidget(self.key_table) - self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - self.save_button = QtGui.QPushButton(database) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Ignored) + self.save_button = QtWidgets.QPushButton(database) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.save_button.sizePolicy().hasHeightForWidth()) @@ -81,10 +81,10 @@ def setupUi(self, database): self.save_button.setFont(font) self.save_button.setObjectName(_fromUtf8("save_button")) self.horizontalLayout.addWidget(self.save_button) - spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem1) - self.insert_button = QtGui.QPushButton(database) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Ignored) + self.insert_button = QtWidgets.QPushButton(database) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.insert_button.sizePolicy().hasHeightForWidth()) @@ -94,10 +94,10 @@ def setupUi(self, database): self.insert_button.setFont(font) self.insert_button.setObjectName(_fromUtf8("insert_button")) self.horizontalLayout.addWidget(self.insert_button) - spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) + spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem2) - self.delete_button = QtGui.QPushButton(database) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Ignored) + self.delete_button = QtWidgets.QPushButton(database) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.delete_button.sizePolicy().hasHeightForWidth()) @@ -107,7 +107,7 @@ def setupUi(self, database): self.delete_button.setFont(font) self.delete_button.setObjectName(_fromUtf8("delete_button")) self.horizontalLayout.addWidget(self.delete_button) - spacerItem3 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem3 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.horizontalLayout.addItem(spacerItem3) self.verticalLayout_2.addLayout(self.horizontalLayout) @@ -115,15 +115,15 @@ def setupUi(self, database): QtCore.QMetaObject.connectSlotsByName(database) def retranslateUi(self, database): - database.setWindowTitle(QtGui.QApplication.translate("database", "Fern - Key Database", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("database", "Decrypted wireless keys are automatically added to the sqlite database after a successful", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("database", "attack, Alternatively you can insert keys to the database manually", None, QtGui.QApplication.UnicodeUTF8)) - self.key_table.horizontalHeaderItem(0).setText(QtGui.QApplication.translate("database", "Access Point", None, QtGui.QApplication.UnicodeUTF8)) - self.key_table.horizontalHeaderItem(1).setText(QtGui.QApplication.translate("database", "Mac Address", None, QtGui.QApplication.UnicodeUTF8)) - self.key_table.horizontalHeaderItem(2).setText(QtGui.QApplication.translate("database", "Encryption", None, QtGui.QApplication.UnicodeUTF8)) - self.key_table.horizontalHeaderItem(3).setText(QtGui.QApplication.translate("database", "Key", None, QtGui.QApplication.UnicodeUTF8)) - self.key_table.horizontalHeaderItem(4).setText(QtGui.QApplication.translate("database", "Channel", None, QtGui.QApplication.UnicodeUTF8)) - self.save_button.setText(QtGui.QApplication.translate("database", "Save Changes", None, QtGui.QApplication.UnicodeUTF8)) - self.insert_button.setText(QtGui.QApplication.translate("database", "Insert New Key", None, QtGui.QApplication.UnicodeUTF8)) - self.delete_button.setText(QtGui.QApplication.translate("database", "Delete", None, QtGui.QApplication.UnicodeUTF8)) + database.setWindowTitle(QtWidgets.QApplication.translate("database", "Fern - Key Database", None, 0)) + self.label.setText(QtWidgets.QApplication.translate("database", "Decrypted wireless keys are automatically added to the sqlite database after a successful", None, 0)) + self.label_2.setText(QtWidgets.QApplication.translate("database", "attack, Alternatively you can insert keys to the database manually", None, 0)) + self.key_table.horizontalHeaderItem(0).setText(QtWidgets.QApplication.translate("database", "Access Point", None, 0)) + self.key_table.horizontalHeaderItem(1).setText(QtWidgets.QApplication.translate("database", "Mac Address", None, 0)) + self.key_table.horizontalHeaderItem(2).setText(QtWidgets.QApplication.translate("database", "Encryption", None, 0)) + self.key_table.horizontalHeaderItem(3).setText(QtWidgets.QApplication.translate("database", "Key", None, 0)) + self.key_table.horizontalHeaderItem(4).setText(QtWidgets.QApplication.translate("database", "Channel", None, 0)) + self.save_button.setText(QtWidgets.QApplication.translate("database", "Save Changes", None, 0)) + self.insert_button.setText(QtWidgets.QApplication.translate("database", "Insert New Key", None, 0)) + self.delete_button.setText(QtWidgets.QApplication.translate("database", "Delete", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/fern_pro_tip.py b/Fern-Wifi-Cracker/gui/fern_pro_tip.py index 552b208..398770f 100644 --- a/Fern-Wifi-Cracker/gui/fern_pro_tip.py +++ b/Fern-Wifi-Cracker/gui/fern_pro_tip.py @@ -2,81 +2,76 @@ # # Created: Thu Aug 07 19:58:03 2014 -# by: PyQt4 UI code generator 4.10.1 +# by: PyQt5 UI code generator 4.10.1 # # WARNING! All changes made in this file will be lost! -import os -from main_window import font_size -from PyQt4 import QtCore, QtGui +import os +from PyQt5.QtWidgets import * +from main_window import font_size +from PyQt5 import QtCore, QtWidgets, QtGui font_setting = font_size() try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s - -try: - _encoding = QtGui.QApplication.UnicodeUTF8 + _encoding = 0 def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) + return QtCore.QCoreApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) + return QtCore.QCoreApplication.translate(context, text, disambig) class Fern_Pro_Tip_ui(object): def setupUi(self, Dialog): - Dialog.setObjectName(_fromUtf8("Dialog")) + Dialog.setObjectName("Dialog") Dialog.resize(413, 188) - self.verticalLayout_3 = QtGui.QVBoxLayout(Dialog) - self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - self.horizontalLayout_3 = QtGui.QHBoxLayout() - self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) - self.label_2 = QtGui.QLabel(Dialog) - self.label_2.setText(_fromUtf8("")) - self.label_2.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/fern_pro.png"%(os.getcwd())))) - self.label_2.setObjectName(_fromUtf8("label_2")) + self.verticalLayout_3 = QtWidgets.QVBoxLayout(Dialog) + self.verticalLayout_3.setObjectName("verticalLayout_3") + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() + self.horizontalLayout_3.setObjectName("horizontalLayout_3") + self.label_2 = QtWidgets.QLabel(Dialog) + self.label_2.setText("") + self.label_2.setPixmap(QtGui.QPixmap("%s/resources/fern_pro.png"%(os.getcwd()))) + self.label_2.setObjectName("label_2") self.horizontalLayout_3.addWidget(self.label_2) - self.verticalLayout_2 = QtGui.QVBoxLayout() - self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.verticalLayout = QtGui.QVBoxLayout() - self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - spacerItem = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + self.verticalLayout_2 = QtWidgets.QVBoxLayout() + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + spacerItem = QtWidgets.QSpacerItem(20, 5, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout.addItem(spacerItem) - self.label = QtGui.QLabel(Dialog) - self.label.setObjectName(_fromUtf8("label")) + self.label = QtWidgets.QLabel(Dialog) + self.label.setObjectName("label") self.verticalLayout.addWidget(self.label) - self.label_3 = QtGui.QLabel(Dialog) - self.label_3.setObjectName(_fromUtf8("label_3")) + self.label_3 = QtWidgets.QLabel(Dialog) + self.label_3.setObjectName("label_3") self.verticalLayout.addWidget(self.label_3) self.verticalLayout_2.addLayout(self.verticalLayout) - spacerItem1 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem1 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem1) self.horizontalLayout_3.addLayout(self.verticalLayout_2) self.verticalLayout_3.addLayout(self.horizontalLayout_3) - spacerItem2 = QtGui.QSpacerItem(20, 5, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem2 = QtWidgets.QSpacerItem(20, 5, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_3.addItem(spacerItem2) - self.show_message_checkbox = QtGui.QCheckBox(Dialog) - self.show_message_checkbox.setObjectName(_fromUtf8("show_message_checkbox")) + self.show_message_checkbox = QtWidgets.QCheckBox(Dialog) + self.show_message_checkbox.setObjectName("show_message_checkbox") self.verticalLayout_3.addWidget(self.show_message_checkbox) - self.horizontalLayout_2 = QtGui.QHBoxLayout() - self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem3) - self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - self.yes_button = QtGui.QPushButton(Dialog) - self.yes_button.setObjectName(_fromUtf8("yes_button")) + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.yes_button = QtWidgets.QPushButton(Dialog) + self.yes_button.setObjectName("yes_button") self.horizontalLayout.addWidget(self.yes_button) - self.no_button = QtGui.QPushButton(Dialog) - self.no_button.setObjectName(_fromUtf8("no_button")) + self.no_button = QtWidgets.QPushButton(Dialog) + self.no_button.setObjectName("no_button") self.horizontalLayout.addWidget(self.no_button) self.horizontalLayout_2.addLayout(self.horizontalLayout) self.verticalLayout_3.addLayout(self.horizontalLayout_2) self.retranslateUi(Dialog) - QtCore.QObject.connect(self.no_button, QtCore.SIGNAL(_fromUtf8("clicked()")), Dialog.close) + self.no_button.clicked.connect(Dialog.close) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): diff --git a/Fern-Wifi-Cracker/gui/font_settings.py b/Fern-Wifi-Cracker/gui/font_settings.py index 0a8e680..6042c2a 100644 --- a/Fern-Wifi-Cracker/gui/font_settings.py +++ b/Fern-Wifi-Cracker/gui/font_settings.py @@ -3,63 +3,59 @@ # Form implementation generated from reading ui file 'untitled.ui' # # Created: Wed Mar 30 10:34:13 2011 -# by: PyQt4 UI code generator 4.8.3 +# by: PyQt5 UI code generator 4.8.3 # # WARNING! All changes made in this file will be lost! -import os -from PyQt4 import QtCore, QtGui - -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - _fromUtf8 = lambda s: s +import os +from PyQt5.QtWidgets import * +from PyQt5 import QtCore, QtWidgets, QtGui class font_dialog(object): def setupUi(self, Dialog): - Dialog.setObjectName(_fromUtf8("Dialog")) + Dialog.setObjectName("Dialog") Dialog.resize(235, 105) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/1295906241_preferences-desktop-font.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap("%s/resources/1295906241_preferences-desktop-font.png"%(os.getcwd())), QtGui.QIcon.Normal, QtGui.QIcon.Off) Dialog.setWindowIcon(icon) - self.verticalLayout_2 = QtGui.QVBoxLayout(Dialog) - self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.verticalLayout = QtGui.QVBoxLayout() - self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.label_2 = QtGui.QLabel(Dialog) - self.label_2.setObjectName(_fromUtf8("label_2")) + self.verticalLayout_2 = QtWidgets.QVBoxLayout(Dialog) + self.verticalLayout_2.setObjectName("verticalLayout_2") + self.verticalLayout = QtWidgets.QVBoxLayout() + self.verticalLayout.setObjectName("verticalLayout") + self.label_2 = QtWidgets.QLabel(Dialog) + self.label_2.setObjectName("label_2") self.verticalLayout.addWidget(self.label_2) - self.horizontalLayout = QtGui.QHBoxLayout() - self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - self.label = QtGui.QLabel(Dialog) - self.label.setObjectName(_fromUtf8("label")) + self.horizontalLayout = QtWidgets.QHBoxLayout() + self.horizontalLayout.setObjectName("horizontalLayout") + self.label = QtWidgets.QLabel(Dialog) + self.label.setObjectName("label") self.horizontalLayout.addWidget(self.label) - self.comboBox = QtGui.QComboBox(Dialog) - self.comboBox.setObjectName(_fromUtf8("comboBox")) + self.comboBox = QtWidgets.QComboBox(Dialog) + self.comboBox.setObjectName("comboBox") self.horizontalLayout.addWidget(self.comboBox) self.verticalLayout.addLayout(self.horizontalLayout) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem) self.verticalLayout_2.addLayout(self.verticalLayout) - self.horizontalLayout_2 = QtGui.QHBoxLayout() - self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - spacerItem1 = QtGui.QSpacerItem(18, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() + self.horizontalLayout_2.setObjectName("horizontalLayout_2") + spacerItem1 = QtWidgets.QSpacerItem(18, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem1) - self.buttonBox = QtGui.QDialogButtonBox(Dialog) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName(_fromUtf8("buttonBox")) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) + self.buttonBox.setObjectName("buttonBox") self.horizontalLayout_2.addWidget(self.buttonBox) - spacerItem2 = QtGui.QSpacerItem(18, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem2 = QtWidgets.QSpacerItem(18, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem2) self.verticalLayout_2.addLayout(self.horizontalLayout_2) self.retranslateUi(Dialog) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) + self.buttonBox.accepted.connect(Dialog.accept) + self.buttonBox.rejected.connect(Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): - Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Dialog", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("Dialog", "Current Font: ", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("Dialog", "General Font Size:", None, QtGui.QApplication.UnicodeUTF8)) + Dialog.setWindowTitle(QtCore.QCoreApplication.translate("Dialog", "Dialog", None, 0)) + self.label_2.setText(QtCore.QCoreApplication.translate("Dialog", "Current Font: ", None, 0)) + self.label.setText(QtCore.QCoreApplication.translate("Dialog", "General Font Size:", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/geotrack.py b/Fern-Wifi-Cracker/gui/geotrack.py index 80b2e5e..2d049fc 100644 --- a/Fern-Wifi-Cracker/gui/geotrack.py +++ b/Fern-Wifi-Cracker/gui/geotrack.py @@ -1,6 +1,6 @@ import os from main_window import font_size -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets, QtGui font_setting = font_size() @@ -17,18 +17,18 @@ def setupUi(self, fern_geotrack): icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/map.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) fern_geotrack.setWindowIcon(icon) - self.verticalLayout_5 = QtGui.QVBoxLayout(fern_geotrack) + self.verticalLayout_5 = QtWidgets.QVBoxLayout(fern_geotrack) self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) - self.horizontalLayout_6 = QtGui.QHBoxLayout() + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) - spacerItem = QtGui.QSpacerItem(207, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem = QtWidgets.QSpacerItem(207, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem) - self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - spacerItem1 = QtGui.QSpacerItem(15, 28, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem1 = QtWidgets.QSpacerItem(15, 28, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout_2.addItem(spacerItem1) - self.target_combo = QtGui.QComboBox(fern_geotrack) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Ignored) + self.target_combo = QtWidgets.QComboBox(fern_geotrack) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.target_combo.sizePolicy().hasHeightForWidth()) @@ -40,33 +40,33 @@ def setupUi(self, fern_geotrack): self.target_combo.setObjectName(_fromUtf8("target_combo")) self.horizontalLayout_2.addWidget(self.target_combo) self.horizontalLayout_6.addLayout(self.horizontalLayout_2) - spacerItem2 = QtGui.QSpacerItem(248, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem2 = QtWidgets.QSpacerItem(248, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem2) self.verticalLayout_5.addLayout(self.horizontalLayout_6) - self.horizontalLayout_4 = QtGui.QHBoxLayout() + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) - spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem3) - self.database_radio = QtGui.QRadioButton(fern_geotrack) + self.database_radio = QtWidgets.QRadioButton(fern_geotrack) font = QtGui.QFont() font.setPointSize(font_setting) self.database_radio.setFont(font) self.database_radio.setChecked(True) self.database_radio.setObjectName(_fromUtf8("database_radio")) self.horizontalLayout_4.addWidget(self.database_radio) - spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem4) - self.insert_mac_radio = QtGui.QRadioButton(fern_geotrack) + self.insert_mac_radio = QtWidgets.QRadioButton(fern_geotrack) font = QtGui.QFont() font.setPointSize(font_setting) self.insert_mac_radio.setFont(font) self.insert_mac_radio.setChecked(False) self.insert_mac_radio.setObjectName(_fromUtf8("insert_mac_radio")) self.horizontalLayout_4.addWidget(self.insert_mac_radio) - spacerItem5 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem5) self.verticalLayout_5.addLayout(self.horizontalLayout_4) - spacerItem6 = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem6 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_5.addItem(spacerItem6) self.map_viewer = QtWebKit.QWebView(fern_geotrack) font = QtGui.QFont() @@ -75,102 +75,102 @@ def setupUi(self, fern_geotrack): self.map_viewer.setUrl(QtCore.QUrl(_fromUtf8(""))) self.map_viewer.setObjectName(_fromUtf8("map_viewer")) self.verticalLayout_5.addWidget(self.map_viewer) - self.groupBox = QtGui.QGroupBox(fern_geotrack) + self.groupBox = QtWidgets.QGroupBox(fern_geotrack) self.groupBox.setTitle(_fromUtf8("")) self.groupBox.setObjectName(_fromUtf8("groupBox")) - self.horizontalLayout = QtGui.QHBoxLayout(self.groupBox) + self.horizontalLayout = QtWidgets.QHBoxLayout(self.groupBox) self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - spacerItem7 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem7) - self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.mac_address_label = QtGui.QLabel(self.groupBox) + self.mac_address_label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.mac_address_label.setFont(font) self.mac_address_label.setObjectName(_fromUtf8("mac_address_label")) self.verticalLayout.addWidget(self.mac_address_label) - spacerItem8 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem8 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem8) - self.country_label = QtGui.QLabel(self.groupBox) + self.country_label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.country_label.setFont(font) self.country_label.setObjectName(_fromUtf8("country_label")) self.verticalLayout.addWidget(self.country_label) self.horizontalLayout.addLayout(self.verticalLayout) - spacerItem9 = QtGui.QSpacerItem(29, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem9 = QtWidgets.QSpacerItem(29, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem9) - self.verticalLayout_4 = QtGui.QVBoxLayout() + self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) - self.latitude_label = QtGui.QLabel(self.groupBox) + self.latitude_label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.latitude_label.setFont(font) self.latitude_label.setObjectName(_fromUtf8("latitude_label")) self.verticalLayout_4.addWidget(self.latitude_label) - spacerItem10 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem10 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_4.addItem(spacerItem10) - self.city_label = QtGui.QLabel(self.groupBox) + self.city_label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.city_label.setFont(font) self.city_label.setObjectName(_fromUtf8("city_label")) self.verticalLayout_4.addWidget(self.city_label) self.horizontalLayout.addLayout(self.verticalLayout_4) - spacerItem11 = QtGui.QSpacerItem(28, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem11 = QtWidgets.QSpacerItem(28, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem11) - self.verticalLayout_3 = QtGui.QVBoxLayout() + self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - self.longitude_label = QtGui.QLabel(self.groupBox) + self.longitude_label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.longitude_label.setFont(font) self.longitude_label.setObjectName(_fromUtf8("longitude_label")) self.verticalLayout_3.addWidget(self.longitude_label) - spacerItem12 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem12 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem12) - self.street_label = QtGui.QLabel(self.groupBox) + self.street_label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.street_label.setFont(font) self.street_label.setObjectName(_fromUtf8("street_label")) self.verticalLayout_3.addWidget(self.street_label) self.horizontalLayout.addLayout(self.verticalLayout_3) - spacerItem13 = QtGui.QSpacerItem(29, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem13 = QtWidgets.QSpacerItem(29, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem13) - self.verticalLayout_2 = QtGui.QVBoxLayout() + self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.accuracy_label = QtGui.QLabel(self.groupBox) + self.accuracy_label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.accuracy_label.setFont(font) self.accuracy_label.setObjectName(_fromUtf8("accuracy_label")) self.verticalLayout_2.addWidget(self.accuracy_label) - spacerItem14 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem14 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem14) - self.country_code_label = QtGui.QLabel(self.groupBox) + self.country_code_label = QtWidgets.QLabel(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.country_code_label.setFont(font) self.country_code_label.setObjectName(_fromUtf8("country_code_label")) self.verticalLayout_2.addWidget(self.country_code_label) self.horizontalLayout.addLayout(self.verticalLayout_2) - spacerItem15 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem15 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem15) self.verticalLayout_5.addWidget(self.groupBox) - self.horizontalLayout_5 = QtGui.QHBoxLayout() + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) - self.label = QtGui.QLabel(fern_geotrack) + self.label = QtWidgets.QLabel(fern_geotrack) self.label.setText(_fromUtf8("")) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout_5.addWidget(self.label) - spacerItem16 = QtGui.QSpacerItem(220, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem16 = QtWidgets.QSpacerItem(220, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_5.addItem(spacerItem16) - self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) - self.track_button = QtGui.QPushButton(fern_geotrack) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Ignored) + self.track_button = QtWidgets.QPushButton(fern_geotrack) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.track_button.sizePolicy().hasHeightForWidth()) @@ -184,10 +184,10 @@ def setupUi(self, fern_geotrack): self.track_button.setIconSize(QtCore.QSize(24, 29)) self.track_button.setObjectName(_fromUtf8("track_button")) self.horizontalLayout_3.addWidget(self.track_button) - spacerItem17 = QtGui.QSpacerItem(19, 38, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem17 = QtWidgets.QSpacerItem(19, 38, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout_3.addItem(spacerItem17) self.horizontalLayout_5.addLayout(self.horizontalLayout_3) - spacerItem18 = QtGui.QSpacerItem(277, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem18 = QtWidgets.QSpacerItem(277, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_5.addItem(spacerItem18) self.verticalLayout_5.addLayout(self.horizontalLayout_5) @@ -195,15 +195,15 @@ def setupUi(self, fern_geotrack): QtCore.QMetaObject.connectSlotsByName(fern_geotrack) def retranslateUi(self, fern_geotrack): - fern_geotrack.setWindowTitle(QtGui.QApplication.translate("fern_geotrack", "Fern - Mac Geolocatory Tracker", None, QtGui.QApplication.UnicodeUTF8)) - self.database_radio.setText(QtGui.QApplication.translate("fern_geotrack", "Use Database addresses", None, QtGui.QApplication.UnicodeUTF8)) - self.insert_mac_radio.setText(QtGui.QApplication.translate("fern_geotrack", "Insert Mac Address", None, QtGui.QApplication.UnicodeUTF8)) - self.mac_address_label.setText(QtGui.QApplication.translate("fern_geotrack", "Mac Address: ", None, QtGui.QApplication.UnicodeUTF8)) - self.country_label.setText(QtGui.QApplication.translate("fern_geotrack", "Country: ", None, QtGui.QApplication.UnicodeUTF8)) - self.latitude_label.setText(QtGui.QApplication.translate("fern_geotrack", "Latitude: ", None, QtGui.QApplication.UnicodeUTF8)) - self.city_label.setText(QtGui.QApplication.translate("fern_geotrack", "City: Lagos", None, QtGui.QApplication.UnicodeUTF8)) - self.longitude_label.setText(QtGui.QApplication.translate("fern_geotrack", "Longitude: ", None, QtGui.QApplication.UnicodeUTF8)) - self.street_label.setText(QtGui.QApplication.translate("fern_geotrack", "Street: ", None, QtGui.QApplication.UnicodeUTF8)) - self.accuracy_label.setText(QtGui.QApplication.translate("fern_geotrack", "Accuracy: ", None, QtGui.QApplication.UnicodeUTF8)) - self.country_code_label.setText(QtGui.QApplication.translate("fern_geotrack", "Country Code: ", None, QtGui.QApplication.UnicodeUTF8)) - self.track_button.setText(QtGui.QApplication.translate("fern_geotrack", "Track", None, QtGui.QApplication.UnicodeUTF8)) + fern_geotrack.setWindowTitle(QtWidgets.QApplication.translate("fern_geotrack", "Fern - Mac Geolocatory Tracker", None, 0)) + self.database_radio.setText(QtWidgets.QApplication.translate("fern_geotrack", "Use Database addresses", None, 0)) + self.insert_mac_radio.setText(QtWidgets.QApplication.translate("fern_geotrack", "Insert Mac Address", None, 0)) + self.mac_address_label.setText(QtWidgets.QApplication.translate("fern_geotrack", "Mac Address: ", None, 0)) + self.country_label.setText(QtWidgets.QApplication.translate("fern_geotrack", "Country: ", None, 0)) + self.latitude_label.setText(QtWidgets.QApplication.translate("fern_geotrack", "Latitude: ", None, 0)) + self.city_label.setText(QtWidgets.QApplication.translate("fern_geotrack", "City: Lagos", None, 0)) + self.longitude_label.setText(QtWidgets.QApplication.translate("fern_geotrack", "Longitude: ", None, 0)) + self.street_label.setText(QtWidgets.QApplication.translate("fern_geotrack", "Street: ", None, 0)) + self.accuracy_label.setText(QtWidgets.QApplication.translate("fern_geotrack", "Accuracy: ", None, 0)) + self.country_code_label.setText(QtWidgets.QApplication.translate("fern_geotrack", "Country Code: ", None, 0)) + self.track_button.setText(QtWidgets.QApplication.translate("fern_geotrack", "Track", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/main_window.py b/Fern-Wifi-Cracker/gui/main_window.py index bf18711..80d0ab8 100644 --- a/Fern-Wifi-Cracker/gui/main_window.py +++ b/Fern-Wifi-Cracker/gui/main_window.py @@ -1,7 +1,7 @@ import os import sys import commands -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets, QtGui # @@ -28,7 +28,7 @@ class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName(_fromUtf8("Dialog")) Dialog.resize(619, 623) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(Dialog.sizePolicy().hasHeightForWidth()) @@ -36,34 +36,34 @@ def setupUi(self, Dialog): icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/icon.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) Dialog.setWindowIcon(icon) - self.verticalLayout_30 = QtGui.QVBoxLayout(Dialog) + self.verticalLayout_30 = QtWidgets.QVBoxLayout(Dialog) self.verticalLayout_30.setObjectName(_fromUtf8("verticalLayout_30")) - self.verticalLayout_29 = QtGui.QVBoxLayout() + self.verticalLayout_29 = QtWidgets.QVBoxLayout() self.verticalLayout_29.setSpacing(6) - self.verticalLayout_29.setSizeConstraint(QtGui.QLayout.SetDefaultConstraint) + self.verticalLayout_29.setSizeConstraint(QtWidgets.QLayout.SetDefaultConstraint) self.verticalLayout_29.setObjectName(_fromUtf8("verticalLayout_29")) - self.horizontalLayout_7 = QtGui.QHBoxLayout() - self.horizontalLayout_7.setSizeConstraint(QtGui.QLayout.SetFixedSize) + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() + self.horizontalLayout_7.setSizeConstraint(QtWidgets.QLayout.SetFixedSize) self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) - self.verticalLayout_28 = QtGui.QVBoxLayout() + self.verticalLayout_28 = QtWidgets.QVBoxLayout() self.verticalLayout_28.setObjectName(_fromUtf8("verticalLayout_28")) - self.verticalLayout_26 = QtGui.QVBoxLayout() + self.verticalLayout_26 = QtWidgets.QVBoxLayout() self.verticalLayout_26.setObjectName(_fromUtf8("verticalLayout_26")) - self.label_14 = QtGui.QLabel(Dialog) + self.label_14 = QtWidgets.QLabel(Dialog) self.label_14.setText(_fromUtf8("")) self.label_14.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/splash.png"%(os.getcwd())))) self.label_14.setObjectName(_fromUtf8("label_14")) self.verticalLayout_26.addWidget(self.label_14) - spacerItem = QtGui.QSpacerItem(20, 17, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem = QtWidgets.QSpacerItem(20, 17, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_26.addItem(spacerItem) - self.verticalLayout_24 = QtGui.QVBoxLayout() + self.verticalLayout_24 = QtWidgets.QVBoxLayout() self.verticalLayout_24.setObjectName(_fromUtf8("verticalLayout_24")) - self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) - spacerItem1 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem1 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_3.addItem(spacerItem1) - self.update_label = QtGui.QLabel(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) + self.update_label = QtWidgets.QLabel(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.update_label.sizePolicy().hasHeightForWidth()) @@ -74,16 +74,16 @@ def setupUi(self, Dialog): self.update_label.setObjectName(_fromUtf8("update_label")) self.horizontalLayout_3.addWidget(self.update_label) self.verticalLayout_24.addLayout(self.horizontalLayout_3) - self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - spacerItem2 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem2 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem2) - self.verticalLayout_22 = QtGui.QVBoxLayout() + self.verticalLayout_22 = QtWidgets.QVBoxLayout() self.verticalLayout_22.setObjectName(_fromUtf8("verticalLayout_22")) - self.update_button = QtGui.QPushButton(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.update_button = QtWidgets.QPushButton(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.update_button.sizePolicy().hasHeightForWidth()) @@ -98,28 +98,28 @@ def setupUi(self, Dialog): self.update_button.setIconSize(QtCore.QSize(35, 34)) self.update_button.setObjectName(_fromUtf8("update_button")) self.verticalLayout_22.addWidget(self.update_button) - spacerItem3 = QtGui.QSpacerItem(13, 30, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem3 = QtWidgets.QSpacerItem(13, 30, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_22.addItem(spacerItem3) self.horizontalLayout.addLayout(self.verticalLayout_22) - spacerItem4 = QtGui.QSpacerItem(13, 74, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem4 = QtWidgets.QSpacerItem(13, 74, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout.addItem(spacerItem4) self.horizontalLayout_2.addLayout(self.horizontalLayout) - spacerItem5 = QtGui.QSpacerItem(124, 12, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem5 = QtWidgets.QSpacerItem(124, 12, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem5) self.verticalLayout_24.addLayout(self.horizontalLayout_2) self.verticalLayout_26.addLayout(self.verticalLayout_24) self.verticalLayout_28.addLayout(self.verticalLayout_26) - self.verticalLayout_23 = QtGui.QVBoxLayout() + self.verticalLayout_23 = QtWidgets.QVBoxLayout() self.verticalLayout_23.setObjectName(_fromUtf8("verticalLayout_23")) - self.horizontalLayout_6 = QtGui.QHBoxLayout() + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) - spacerItem6 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem6 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_6.addItem(spacerItem6) - self.verticalLayout_21 = QtGui.QVBoxLayout() + self.verticalLayout_21 = QtWidgets.QVBoxLayout() self.verticalLayout_21.setContentsMargins(0, -1, -1, -1) self.verticalLayout_21.setObjectName(_fromUtf8("verticalLayout_21")) - self.py_version_label = QtGui.QLabel(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) + self.py_version_label = QtWidgets.QLabel(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.py_version_label.sizePolicy().hasHeightForWidth()) @@ -129,8 +129,8 @@ def setupUi(self, Dialog): self.py_version_label.setFont(font) self.py_version_label.setObjectName(_fromUtf8("py_version_label")) self.verticalLayout_21.addWidget(self.py_version_label) - self.air_version = QtGui.QLabel(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) + self.air_version = QtWidgets.QLabel(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.air_version.sizePolicy().hasHeightForWidth()) @@ -140,8 +140,8 @@ def setupUi(self, Dialog): self.air_version.setFont(font) self.air_version.setObjectName(_fromUtf8("air_version")) self.verticalLayout_21.addWidget(self.air_version) - self.qt_version = QtGui.QLabel(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Preferred, QtGui.QSizePolicy.Preferred) + self.qt_version = QtWidgets.QLabel(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Preferred, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.qt_version.sizePolicy().hasHeightForWidth()) @@ -153,31 +153,31 @@ def setupUi(self, Dialog): self.verticalLayout_21.addWidget(self.qt_version) self.horizontalLayout_6.addLayout(self.verticalLayout_21) self.verticalLayout_23.addLayout(self.horizontalLayout_6) - spacerItem7 = QtGui.QSpacerItem(20, 37, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem7 = QtWidgets.QSpacerItem(20, 37, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_23.addItem(spacerItem7) self.verticalLayout_28.addLayout(self.verticalLayout_23) self.horizontalLayout_7.addLayout(self.verticalLayout_28) - self.verticalLayout_25 = QtGui.QVBoxLayout() + self.verticalLayout_25 = QtWidgets.QVBoxLayout() self.verticalLayout_25.setObjectName(_fromUtf8("verticalLayout_25")) - self.verticalLayout_27 = QtGui.QVBoxLayout() + self.verticalLayout_27 = QtWidgets.QVBoxLayout() self.verticalLayout_27.setObjectName(_fromUtf8("verticalLayout_27")) - self.verticalLayout_20 = QtGui.QVBoxLayout() + self.verticalLayout_20 = QtWidgets.QVBoxLayout() self.verticalLayout_20.setSpacing(6) self.verticalLayout_20.setObjectName(_fromUtf8("verticalLayout_20")) - self.horizontalLayout_5 = QtGui.QHBoxLayout() + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) - self.loading_label = QtGui.QLabel(Dialog) + self.loading_label = QtWidgets.QLabel(Dialog) self.loading_label.setEnabled(True) self.loading_label.setText(_fromUtf8("")) self.loading_label.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/loading.gif"%(os.getcwd())))) self.loading_label.setObjectName(_fromUtf8("loading_label")) self.horizontalLayout_5.addWidget(self.loading_label) - self.verticalLayout_9 = QtGui.QVBoxLayout() + self.verticalLayout_9 = QtWidgets.QVBoxLayout() self.verticalLayout_9.setObjectName(_fromUtf8("verticalLayout_9")) - spacerItem8 = QtGui.QSpacerItem(166, 3, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem8 = QtWidgets.QSpacerItem(166, 3, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_9.addItem(spacerItem8) - self.interface_combo = QtGui.QComboBox(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.interface_combo = QtWidgets.QComboBox(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.interface_combo.sizePolicy().hasHeightForWidth()) @@ -188,14 +188,14 @@ def setupUi(self, Dialog): self.interface_combo.setObjectName(_fromUtf8("interface_combo")) self.verticalLayout_9.addWidget(self.interface_combo) self.horizontalLayout_5.addLayout(self.verticalLayout_9) - spacerItem9 = QtGui.QSpacerItem(13, 20, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem9 = QtWidgets.QSpacerItem(13, 20, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_5.addItem(spacerItem9) - self.verticalLayout_18 = QtGui.QVBoxLayout() + self.verticalLayout_18 = QtWidgets.QVBoxLayout() self.verticalLayout_18.setObjectName(_fromUtf8("verticalLayout_18")) - spacerItem10 = QtGui.QSpacerItem(85, 3, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem10 = QtWidgets.QSpacerItem(85, 3, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_18.addItem(spacerItem10) - self.refresh_intfacebutton = QtGui.QPushButton(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.refresh_intfacebutton = QtWidgets.QPushButton(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.refresh_intfacebutton.sizePolicy().hasHeightForWidth()) @@ -210,13 +210,13 @@ def setupUi(self, Dialog): self.refresh_intfacebutton.setObjectName(_fromUtf8("refresh_intfacebutton")) self.verticalLayout_18.addWidget(self.refresh_intfacebutton) self.horizontalLayout_5.addLayout(self.verticalLayout_18) - spacerItem11 = QtGui.QSpacerItem(18, 20, QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Minimum) + spacerItem11 = QtWidgets.QSpacerItem(18, 20, QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_5.addItem(spacerItem11) - spacerItem12 = QtGui.QSpacerItem(13, 36, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem12 = QtWidgets.QSpacerItem(13, 36, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout_5.addItem(spacerItem12) self.verticalLayout_20.addLayout(self.horizontalLayout_5) - self.mon_label = QtGui.QLabel(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) + self.mon_label = QtWidgets.QLabel(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.mon_label.sizePolicy().hasHeightForWidth()) @@ -227,16 +227,16 @@ def setupUi(self, Dialog): self.mon_label.setObjectName(_fromUtf8("mon_label")) self.verticalLayout_20.addWidget(self.mon_label) self.verticalLayout_27.addLayout(self.verticalLayout_20) - self.verticalLayout_19 = QtGui.QVBoxLayout() + self.verticalLayout_19 = QtWidgets.QVBoxLayout() self.verticalLayout_19.setObjectName(_fromUtf8("verticalLayout_19")) - self.horizontalLayout_4 = QtGui.QHBoxLayout() + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) - self.verticalLayout_8 = QtGui.QVBoxLayout() + self.verticalLayout_8 = QtWidgets.QVBoxLayout() self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8")) - spacerItem13 = QtGui.QSpacerItem(168, 2, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem13 = QtWidgets.QSpacerItem(168, 2, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_8.addItem(spacerItem13) - self.scan_button = QtGui.QPushButton(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + self.scan_button = QtWidgets.QPushButton(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.scan_button.sizePolicy().hasHeightForWidth()) @@ -252,14 +252,14 @@ def setupUi(self, Dialog): self.scan_button.setObjectName(_fromUtf8("scan_button")) self.verticalLayout_8.addWidget(self.scan_button) self.horizontalLayout_4.addLayout(self.verticalLayout_8) - self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - spacerItem14 = QtGui.QSpacerItem(20, 0, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem14 = QtWidgets.QSpacerItem(20, 0, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout.addItem(spacerItem14) - spacerItem15 = QtGui.QSpacerItem(20, 10, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem15 = QtWidgets.QSpacerItem(20, 10, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem15) - self.label_7 = QtGui.QLabel(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Fixed) + self.label_7 = QtWidgets.QLabel(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_7.sizePolicy().hasHeightForWidth()) @@ -269,19 +269,19 @@ def setupUi(self, Dialog): self.label_7.setFont(font) self.label_7.setObjectName(_fromUtf8("label_7")) self.verticalLayout.addWidget(self.label_7) - spacerItem16 = QtGui.QSpacerItem(20, 18, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem16 = QtWidgets.QSpacerItem(20, 18, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout.addItem(spacerItem16) self.horizontalLayout_4.addLayout(self.verticalLayout) self.verticalLayout_19.addLayout(self.horizontalLayout_4) - self.horizontalLayout_8 = QtGui.QHBoxLayout() + self.horizontalLayout_8 = QtWidgets.QHBoxLayout() self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8")) - self.verticalLayout_10 = QtGui.QVBoxLayout() + self.verticalLayout_10 = QtWidgets.QVBoxLayout() self.verticalLayout_10.setObjectName(_fromUtf8("verticalLayout_10")) - spacerItem17 = QtGui.QSpacerItem(168, 2, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem17 = QtWidgets.QSpacerItem(168, 2, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_10.addItem(spacerItem17) - self.wep_button = QtGui.QPushButton(Dialog) + self.wep_button = QtWidgets.QPushButton(Dialog) self.wep_button.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.wep_button.sizePolicy().hasHeightForWidth()) @@ -298,33 +298,33 @@ def setupUi(self, Dialog): self.wep_button.setObjectName(_fromUtf8("wep_button")) self.verticalLayout_10.addWidget(self.wep_button) self.horizontalLayout_8.addLayout(self.verticalLayout_10) - self.verticalLayout_11 = QtGui.QVBoxLayout() + self.verticalLayout_11 = QtWidgets.QVBoxLayout() self.verticalLayout_11.setObjectName(_fromUtf8("verticalLayout_11")) - self.verticalLayout_2 = QtGui.QVBoxLayout() + self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - spacerItem18 = QtGui.QSpacerItem(20, 18, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem18 = QtWidgets.QSpacerItem(20, 18, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem18) - self.wep_clientlabel = QtGui.QLabel(Dialog) + self.wep_clientlabel = QtWidgets.QLabel(Dialog) self.wep_clientlabel.setEnabled(False) font = QtGui.QFont() font.setPointSize(font_setting) self.wep_clientlabel.setFont(font) self.wep_clientlabel.setObjectName(_fromUtf8("wep_clientlabel")) self.verticalLayout_2.addWidget(self.wep_clientlabel) - spacerItem19 = QtGui.QSpacerItem(20, 18, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem19 = QtWidgets.QSpacerItem(20, 18, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem19) self.verticalLayout_11.addLayout(self.verticalLayout_2) self.horizontalLayout_8.addLayout(self.verticalLayout_11) self.verticalLayout_19.addLayout(self.horizontalLayout_8) - self.horizontalLayout_9 = QtGui.QHBoxLayout() + self.horizontalLayout_9 = QtWidgets.QHBoxLayout() self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9")) - self.verticalLayout_12 = QtGui.QVBoxLayout() + self.verticalLayout_12 = QtWidgets.QVBoxLayout() self.verticalLayout_12.setObjectName(_fromUtf8("verticalLayout_12")) - spacerItem20 = QtGui.QSpacerItem(168, 2, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem20 = QtWidgets.QSpacerItem(168, 2, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_12.addItem(spacerItem20) - self.wpa_button = QtGui.QPushButton(Dialog) + self.wpa_button = QtWidgets.QPushButton(Dialog) self.wpa_button.setEnabled(False) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.wpa_button.sizePolicy().hasHeightForWidth()) @@ -341,32 +341,32 @@ def setupUi(self, Dialog): self.wpa_button.setObjectName(_fromUtf8("wpa_button")) self.verticalLayout_12.addWidget(self.wpa_button) self.horizontalLayout_9.addLayout(self.verticalLayout_12) - self.verticalLayout_13 = QtGui.QVBoxLayout() + self.verticalLayout_13 = QtWidgets.QVBoxLayout() self.verticalLayout_13.setObjectName(_fromUtf8("verticalLayout_13")) - self.verticalLayout_3 = QtGui.QVBoxLayout() + self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - spacerItem21 = QtGui.QSpacerItem(20, 18, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem21 = QtWidgets.QSpacerItem(20, 18, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem21) - self.wpa_clientlabel = QtGui.QLabel(Dialog) + self.wpa_clientlabel = QtWidgets.QLabel(Dialog) self.wpa_clientlabel.setEnabled(False) font = QtGui.QFont() font.setPointSize(font_setting) self.wpa_clientlabel.setFont(font) self.wpa_clientlabel.setObjectName(_fromUtf8("wpa_clientlabel")) self.verticalLayout_3.addWidget(self.wpa_clientlabel) - spacerItem22 = QtGui.QSpacerItem(20, 18, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem22 = QtWidgets.QSpacerItem(20, 18, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem22) self.verticalLayout_13.addLayout(self.verticalLayout_3) self.horizontalLayout_9.addLayout(self.verticalLayout_13) self.verticalLayout_19.addLayout(self.horizontalLayout_9) - self.horizontalLayout_10 = QtGui.QHBoxLayout() + self.horizontalLayout_10 = QtWidgets.QHBoxLayout() self.horizontalLayout_10.setObjectName(_fromUtf8("horizontalLayout_10")) - self.verticalLayout_14 = QtGui.QVBoxLayout() + self.verticalLayout_14 = QtWidgets.QVBoxLayout() self.verticalLayout_14.setObjectName(_fromUtf8("verticalLayout_14")) - spacerItem23 = QtGui.QSpacerItem(168, 2, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem23 = QtWidgets.QSpacerItem(168, 2, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_14.addItem(spacerItem23) - self.database_button = QtGui.QPushButton(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + self.database_button = QtWidgets.QPushButton(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.database_button.sizePolicy().hasHeightForWidth()) @@ -383,31 +383,31 @@ def setupUi(self, Dialog): self.database_button.setObjectName(_fromUtf8("database_button")) self.verticalLayout_14.addWidget(self.database_button) self.horizontalLayout_10.addLayout(self.verticalLayout_14) - self.verticalLayout_15 = QtGui.QVBoxLayout() + self.verticalLayout_15 = QtWidgets.QVBoxLayout() self.verticalLayout_15.setObjectName(_fromUtf8("verticalLayout_15")) - self.verticalLayout_4 = QtGui.QVBoxLayout() + self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) - spacerItem24 = QtGui.QSpacerItem(20, 18, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem24 = QtWidgets.QSpacerItem(20, 18, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_4.addItem(spacerItem24) - self.label_16 = QtGui.QLabel(Dialog) + self.label_16 = QtWidgets.QLabel(Dialog) font = QtGui.QFont() font.setPointSize(font_setting) self.label_16.setFont(font) self.label_16.setObjectName(_fromUtf8("label_16")) self.verticalLayout_4.addWidget(self.label_16) - spacerItem25 = QtGui.QSpacerItem(20, 18, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem25 = QtWidgets.QSpacerItem(20, 18, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_4.addItem(spacerItem25) self.verticalLayout_15.addLayout(self.verticalLayout_4) self.horizontalLayout_10.addLayout(self.verticalLayout_15) self.verticalLayout_19.addLayout(self.horizontalLayout_10) - self.horizontalLayout_11 = QtGui.QHBoxLayout() + self.horizontalLayout_11 = QtWidgets.QHBoxLayout() self.horizontalLayout_11.setObjectName(_fromUtf8("horizontalLayout_11")) - self.verticalLayout_16 = QtGui.QVBoxLayout() + self.verticalLayout_16 = QtWidgets.QVBoxLayout() self.verticalLayout_16.setObjectName(_fromUtf8("verticalLayout_16")) - spacerItem26 = QtGui.QSpacerItem(168, 2, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem26 = QtWidgets.QSpacerItem(168, 2, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_16.addItem(spacerItem26) - self.tool_button = QtGui.QPushButton(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + self.tool_button = QtWidgets.QPushButton(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.tool_button.sizePolicy().hasHeightForWidth()) @@ -424,20 +424,20 @@ def setupUi(self, Dialog): self.tool_button.setObjectName(_fromUtf8("tool_button")) self.verticalLayout_16.addWidget(self.tool_button) self.horizontalLayout_11.addLayout(self.verticalLayout_16) - self.verticalLayout_17 = QtGui.QVBoxLayout() + self.verticalLayout_17 = QtWidgets.QVBoxLayout() self.verticalLayout_17.setObjectName(_fromUtf8("verticalLayout_17")) - self.verticalLayout_5 = QtGui.QVBoxLayout() + self.verticalLayout_5 = QtWidgets.QVBoxLayout() self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) - spacerItem27 = QtGui.QSpacerItem(20, 18, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem27 = QtWidgets.QSpacerItem(20, 18, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_5.addItem(spacerItem27) - self.label_13 = QtGui.QLabel(Dialog) + self.label_13 = QtWidgets.QLabel(Dialog) font = QtGui.QFont() font.setPointSize(font_setting) self.label_13.setFont(font) self.label_13.setText(_fromUtf8("")) self.label_13.setObjectName(_fromUtf8("label_13")) self.verticalLayout_5.addWidget(self.label_13) - spacerItem28 = QtGui.QSpacerItem(20, 18, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem28 = QtWidgets.QSpacerItem(20, 18, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_5.addItem(spacerItem28) self.verticalLayout_17.addLayout(self.verticalLayout_5) self.horizontalLayout_11.addLayout(self.verticalLayout_17) @@ -446,8 +446,8 @@ def setupUi(self, Dialog): self.verticalLayout_25.addLayout(self.verticalLayout_27) self.horizontalLayout_7.addLayout(self.verticalLayout_25) self.verticalLayout_29.addLayout(self.horizontalLayout_7) - self.groupBox = QtGui.QGroupBox(Dialog) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + self.groupBox = QtWidgets.QGroupBox(Dialog) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) @@ -456,38 +456,38 @@ def setupUi(self, Dialog): font.setPointSize(font_setting) self.groupBox.setFont(font) self.groupBox.setObjectName(_fromUtf8("groupBox")) - self.verticalLayout_7 = QtGui.QVBoxLayout(self.groupBox) + self.verticalLayout_7 = QtWidgets.QVBoxLayout(self.groupBox) self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7")) - self.horizontalLayout_13 = QtGui.QHBoxLayout() + self.horizontalLayout_13 = QtWidgets.QHBoxLayout() self.horizontalLayout_13.setObjectName(_fromUtf8("horizontalLayout_13")) - self.verticalLayout_6 = QtGui.QVBoxLayout() + self.verticalLayout_6 = QtWidgets.QVBoxLayout() self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6")) - self.label_6 = QtGui.QLabel(self.groupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + self.label_6 = QtWidgets.QLabel(self.groupBox) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_6.sizePolicy().hasHeightForWidth()) self.label_6.setSizePolicy(sizePolicy) self.label_6.setObjectName(_fromUtf8("label_6")) self.verticalLayout_6.addWidget(self.label_6) - self.horizontalLayout_12 = QtGui.QHBoxLayout() + self.horizontalLayout_12 = QtWidgets.QHBoxLayout() self.horizontalLayout_12.setObjectName(_fromUtf8("horizontalLayout_12")) - self.label_90 = QtGui.QLabel(self.groupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Expanding) + self.label_90 = QtWidgets.QLabel(self.groupBox) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Expanding) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.label_90.sizePolicy().hasHeightForWidth()) self.label_90.setSizePolicy(sizePolicy) self.label_90.setObjectName(_fromUtf8("label_90")) self.horizontalLayout_12.addWidget(self.label_90) - spacerItem29 = QtGui.QSpacerItem(0, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem29 = QtWidgets.QSpacerItem(0, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_12.addItem(spacerItem29) - self.label = QtGui.QLabel(self.groupBox) + self.label = QtWidgets.QLabel(self.groupBox) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout_12.addWidget(self.label) self.verticalLayout_6.addLayout(self.horizontalLayout_12) self.horizontalLayout_13.addLayout(self.verticalLayout_6) - spacerItem30 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem30 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_13.addItem(spacerItem30) self.verticalLayout_7.addLayout(self.horizontalLayout_13) self.verticalLayout_29.addWidget(self.groupBox) @@ -499,23 +499,23 @@ def setupUi(self, Dialog): def retranslateUi(self, Dialog): pythonver = str(sys.version) display = str(commands.getstatusoutput('aircrack-ng')) - Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Fern WIFI Cracker", None, QtGui.QApplication.UnicodeUTF8)) - self.update_label.setText(QtGui.QApplication.translate("Dialog", "Latest update is installed: Revision 10", None, QtGui.QApplication.UnicodeUTF8)) - self.py_version_label.setText(QtGui.QApplication.translate("Dialog", "Python Version: %s"%(pythonver[0:14].replace('(',(''))), None, QtGui.QApplication.UnicodeUTF8)) - self.air_version.setText(QtGui.QApplication.translate("Dialog", "Aircrack Version: %s"%(display[11:33]), None, QtGui.QApplication.UnicodeUTF8)) - self.qt_version.setText(QtGui.QApplication.translate("Dialog", "Qt Version: %s"%(QtCore.PYQT_VERSION_STR), None, QtGui.QApplication.UnicodeUTF8)) - self.refresh_intfacebutton.setText(QtGui.QApplication.translate("Dialog", " Refresh", None, QtGui.QApplication.UnicodeUTF8)) - self.mon_label.setText(QtGui.QApplication.translate("Dialog", "Monitor Mode enabled on wlan0", None, QtGui.QApplication.UnicodeUTF8)) - self.label_7.setText(QtGui.QApplication.translate("Dialog", "Scan for Access points", None, QtGui.QApplication.UnicodeUTF8)) - self.wep_button.setText(QtGui.QApplication.translate("Dialog", "WEP", None, QtGui.QApplication.UnicodeUTF8)) - self.wep_clientlabel.setText(QtGui.QApplication.translate("Dialog", "Detection Status", None, QtGui.QApplication.UnicodeUTF8)) - self.wpa_button.setText(QtGui.QApplication.translate("Dialog", "WPA", None, QtGui.QApplication.UnicodeUTF8)) - self.wpa_clientlabel.setText(QtGui.QApplication.translate("Dialog", "Detection Status", None, QtGui.QApplication.UnicodeUTF8)) - self.database_button.setText(QtGui.QApplication.translate("Dialog", "Key Database", None, QtGui.QApplication.UnicodeUTF8)) - self.label_16.setText(QtGui.QApplication.translate("Dialog", "No Key Entries", None, QtGui.QApplication.UnicodeUTF8)) - self.tool_button.setText(QtGui.QApplication.translate("Dialog", "ToolBox", None, QtGui.QApplication.UnicodeUTF8)) - self.label_13.setText(QtGui.QApplication.translate("Dialog", "", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox.setTitle(QtGui.QApplication.translate("Dialog", "About Fern WIFI Cracker", None, QtGui.QApplication.UnicodeUTF8)) - self.label_6.setText(QtGui.QApplication.translate("Dialog", "GUI suite for wireless encryption strength testing of 802.11 wireless encryption standard access points", None, QtGui.QApplication.UnicodeUTF8)) - self.label_90.setText(QtGui.QApplication.translate("Dialog", "Written by Saviour Emmanuel Ekiko", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("Dialog", " Report Bugs at : savioboyz@rocketmail.com", None, QtGui.QApplication.UnicodeUTF8)) + Dialog.setWindowTitle(QtWidgets.QApplication.translate("Dialog", "Fern WIFI Cracker", None, 0)) + self.update_label.setText(QtWidgets.QApplication.translate("Dialog", "Latest update is installed: Revision 10", None, 0)) + self.py_version_label.setText(QtWidgets.QApplication.translate("Dialog", "Python Version: %s"%(pythonver[0:14].replace('(',(''))), None, 0)) + self.air_version.setText(QtWidgets.QApplication.translate("Dialog", "Aircrack Version: %s"%(display[11:33]), None, 0)) + self.qt_version.setText(QtWidgets.QApplication.translate("Dialog", "Qt Version: %s"%(QtCore.PYQT_VERSION_STR), None, 0)) + self.refresh_intfacebutton.setText(QtWidgets.QApplication.translate("Dialog", " Refresh", None, 0)) + self.mon_label.setText(QtWidgets.QApplication.translate("Dialog", "Monitor Mode enabled on wlan0", None, 0)) + self.label_7.setText(QtWidgets.QApplication.translate("Dialog", "Scan for Access points", None, 0)) + self.wep_button.setText(QtWidgets.QApplication.translate("Dialog", "WEP", None, 0)) + self.wep_clientlabel.setText(QtWidgets.QApplication.translate("Dialog", "Detection Status", None, 0)) + self.wpa_button.setText(QtWidgets.QApplication.translate("Dialog", "WPA", None, 0)) + self.wpa_clientlabel.setText(QtWidgets.QApplication.translate("Dialog", "Detection Status", None, 0)) + self.database_button.setText(QtWidgets.QApplication.translate("Dialog", "Key Database", None, 0)) + self.label_16.setText(QtWidgets.QApplication.translate("Dialog", "No Key Entries", None, 0)) + self.tool_button.setText(QtWidgets.QApplication.translate("Dialog", "ToolBox", None, 0)) + self.label_13.setText(QtWidgets.QApplication.translate("Dialog", "", None, 0)) + self.groupBox.setTitle(QtWidgets.QApplication.translate("Dialog", "About Fern WIFI Cracker", None, 0)) + self.label_6.setText(QtWidgets.QApplication.translate("Dialog", "GUI suite for wireless encryption strength testing of 802.11 wireless encryption standard access points", None, 0)) + self.label_90.setText(QtWidgets.QApplication.translate("Dialog", "Written by Saviour Emmanuel Ekiko", None, 0)) + self.label.setText(QtWidgets.QApplication.translate("Dialog", " Report Bugs at : savioboyz@rocketmail.com", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/ray_fusion.py b/Fern-Wifi-Cracker/gui/ray_fusion.py index 84a7861..85f59ca 100644 --- a/Fern-Wifi-Cracker/gui/ray_fusion.py +++ b/Fern-Wifi-Cracker/gui/ray_fusion.py @@ -1,10 +1,9 @@ import os from main_window import font_size -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets, QtGui font_setting = font_size() -from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 @@ -18,34 +17,34 @@ def setupUi(self, ray_fusion): icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/fusion.png" % (os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) ray_fusion.setWindowIcon(icon) - self.verticalLayout_9 = QtGui.QVBoxLayout(ray_fusion) + self.verticalLayout_9 = QtWidgets.QVBoxLayout(ray_fusion) self.verticalLayout_9.setObjectName(_fromUtf8("verticalLayout_9")) - self.horizontalLayout_8 = QtGui.QHBoxLayout() + self.horizontalLayout_8 = QtWidgets.QHBoxLayout() self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8")) self.verticalLayout_9.addLayout(self.horizontalLayout_8) - self.horizontalLayout_4 = QtGui.QHBoxLayout() + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) - spacerItem = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem) - self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - self.label = QtGui.QLabel(ray_fusion) + self.label = QtWidgets.QLabel(ray_fusion) self.label.setText(_fromUtf8("")) self.label.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/Page-World.ico" % (os.getcwd())))) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout.addWidget(self.label) - self.target_edit = QtGui.QLineEdit(ray_fusion) + self.target_edit = QtWidgets.QLineEdit(ray_fusion) self.target_edit.setMinimumSize(QtCore.QSize(281, 0)) self.target_edit.setObjectName(_fromUtf8("target_edit")) self.horizontalLayout.addWidget(self.target_edit) - self.port_edit = QtGui.QLineEdit(ray_fusion) + self.port_edit = QtWidgets.QLineEdit(ray_fusion) self.port_edit.setMaximumSize(QtCore.QSize(51, 20)) self.port_edit.setObjectName(_fromUtf8("port_edit")) self.horizontalLayout.addWidget(self.port_edit) self.horizontalLayout_4.addLayout(self.horizontalLayout) - spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_4.addItem(spacerItem1) - self.help_button = QtGui.QPushButton(ray_fusion) + self.help_button = QtWidgets.QPushButton(ray_fusion) self.help_button.setText(_fromUtf8("")) icon1 = QtGui.QIcon() icon1.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/Help.ico" % (os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) @@ -55,20 +54,20 @@ def setupUi(self, ray_fusion): self.help_button.setObjectName(_fromUtf8("help_button")) self.horizontalLayout_4.addWidget(self.help_button) self.verticalLayout_9.addLayout(self.horizontalLayout_4) - self.horizontalLayout_11 = QtGui.QHBoxLayout() + self.horizontalLayout_11 = QtWidgets.QHBoxLayout() self.horizontalLayout_11.setObjectName(_fromUtf8("horizontalLayout_11")) - self.groupBox = QtGui.QGroupBox(ray_fusion) + self.groupBox = QtWidgets.QGroupBox(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.groupBox.setFont(font) self.groupBox.setObjectName(_fromUtf8("groupBox")) - self.horizontalLayout_3 = QtGui.QHBoxLayout(self.groupBox) + self.horizontalLayout_3 = QtWidgets.QHBoxLayout(self.groupBox) self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) - self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem2) - self.http_https_radio = QtGui.QRadioButton(self.groupBox) + self.http_https_radio = QtWidgets.QRadioButton(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.http_https_radio.setFont(font) @@ -79,9 +78,9 @@ def setupUi(self, ray_fusion): self.http_https_radio.setChecked(True) self.http_https_radio.setObjectName(_fromUtf8("http_https_radio")) self.horizontalLayout_2.addWidget(self.http_https_radio) - spacerItem3 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem3 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem3) - self.telnet_radio = QtGui.QRadioButton(self.groupBox) + self.telnet_radio = QtWidgets.QRadioButton(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.telnet_radio.setFont(font) @@ -90,9 +89,9 @@ def setupUi(self, ray_fusion): self.telnet_radio.setIcon(icon3) self.telnet_radio.setObjectName(_fromUtf8("telnet_radio")) self.horizontalLayout_2.addWidget(self.telnet_radio) - spacerItem4 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem4 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem4) - self.ftp_radio = QtGui.QRadioButton(self.groupBox) + self.ftp_radio = QtWidgets.QRadioButton(self.groupBox) font = QtGui.QFont() font.setPointSize(font_setting) self.ftp_radio.setFont(font) @@ -102,11 +101,11 @@ def setupUi(self, ray_fusion): self.ftp_radio.setIconSize(QtCore.QSize(20, 20)) self.ftp_radio.setObjectName(_fromUtf8("ftp_radio")) self.horizontalLayout_2.addWidget(self.ftp_radio) - spacerItem5 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem5 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem5) self.horizontalLayout_3.addLayout(self.horizontalLayout_2) self.horizontalLayout_11.addWidget(self.groupBox) - self.settings_button = QtGui.QPushButton(ray_fusion) + self.settings_button = QtWidgets.QPushButton(ray_fusion) self.settings_button.setMaximumSize(QtCore.QSize(101, 31)) font = QtGui.QFont() font.setPointSize(font_setting) @@ -117,130 +116,130 @@ def setupUi(self, ray_fusion): self.settings_button.setObjectName(_fromUtf8("settings_button")) self.horizontalLayout_11.addWidget(self.settings_button) self.verticalLayout_9.addLayout(self.horizontalLayout_11) - self.settings_groupbox = QtGui.QGroupBox(ray_fusion) + self.settings_groupbox = QtWidgets.QGroupBox(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.settings_groupbox.setFont(font) self.settings_groupbox.setObjectName(_fromUtf8("settings_groupbox")) - self.verticalLayout_6 = QtGui.QVBoxLayout(self.settings_groupbox) + self.verticalLayout_6 = QtWidgets.QVBoxLayout(self.settings_groupbox) self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6")) - self.horizontalLayout_9 = QtGui.QHBoxLayout() + self.horizontalLayout_9 = QtWidgets.QHBoxLayout() self.horizontalLayout_9.setObjectName(_fromUtf8("horizontalLayout_9")) - self.default_wordlist_radio = QtGui.QRadioButton(self.settings_groupbox) + self.default_wordlist_radio = QtWidgets.QRadioButton(self.settings_groupbox) font = QtGui.QFont() font.setPointSize(font_setting) self.default_wordlist_radio.setFont(font) self.default_wordlist_radio.setChecked(True) self.default_wordlist_radio.setObjectName(_fromUtf8("default_wordlist_radio")) self.horizontalLayout_9.addWidget(self.default_wordlist_radio) - spacerItem6 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem6 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_9.addItem(spacerItem6) - self.custom_wordlist_radio = QtGui.QRadioButton(self.settings_groupbox) + self.custom_wordlist_radio = QtWidgets.QRadioButton(self.settings_groupbox) font = QtGui.QFont() font.setPointSize(font_setting) self.custom_wordlist_radio.setFont(font) self.custom_wordlist_radio.setObjectName(_fromUtf8("custom_wordlist_radio")) self.horizontalLayout_9.addWidget(self.custom_wordlist_radio) - spacerItem7 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem7 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_9.addItem(spacerItem7) - self.blank_username_checkbox = QtGui.QCheckBox(self.settings_groupbox) + self.blank_username_checkbox = QtWidgets.QCheckBox(self.settings_groupbox) font = QtGui.QFont() font.setPointSize(font_setting) self.blank_username_checkbox.setFont(font) self.blank_username_checkbox.setChecked(True) self.blank_username_checkbox.setObjectName(_fromUtf8("blank_username_checkbox")) self.horizontalLayout_9.addWidget(self.blank_username_checkbox) - spacerItem8 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem8 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_9.addItem(spacerItem8) - self.blank_password_checkbox = QtGui.QCheckBox(self.settings_groupbox) + self.blank_password_checkbox = QtWidgets.QCheckBox(self.settings_groupbox) font = QtGui.QFont() font.setPointSize(font_setting) self.blank_password_checkbox.setFont(font) self.blank_password_checkbox.setChecked(True) self.blank_password_checkbox.setObjectName(_fromUtf8("blank_password_checkbox")) self.horizontalLayout_9.addWidget(self.blank_password_checkbox) - spacerItem9 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem9 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_9.addItem(spacerItem9) self.verticalLayout_6.addLayout(self.horizontalLayout_9) - self.horizontalLayout_10 = QtGui.QHBoxLayout() + self.horizontalLayout_10 = QtWidgets.QHBoxLayout() self.horizontalLayout_10.setObjectName(_fromUtf8("horizontalLayout_10")) - self.horizontalLayout_5 = QtGui.QHBoxLayout() + self.horizontalLayout_5 = QtWidgets.QHBoxLayout() self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) - self.label_2 = QtGui.QLabel(self.settings_groupbox) + self.label_2 = QtWidgets.QLabel(self.settings_groupbox) self.label_2.setObjectName(_fromUtf8("label_2")) self.horizontalLayout_5.addWidget(self.label_2) - self.time_interval_spinbox = QtGui.QSpinBox(self.settings_groupbox) + self.time_interval_spinbox = QtWidgets.QSpinBox(self.settings_groupbox) self.time_interval_spinbox.setObjectName(_fromUtf8("time_interval_spinbox")) self.horizontalLayout_5.addWidget(self.time_interval_spinbox) self.horizontalLayout_10.addLayout(self.horizontalLayout_5) - spacerItem10 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem10 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_10.addItem(spacerItem10) self.verticalLayout_6.addLayout(self.horizontalLayout_10) self.verticalLayout_9.addWidget(self.settings_groupbox) - self.custom_wordlist_groupbox = QtGui.QGroupBox(ray_fusion) + self.custom_wordlist_groupbox = QtWidgets.QGroupBox(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.custom_wordlist_groupbox.setFont(font) self.custom_wordlist_groupbox.setTitle(_fromUtf8("")) self.custom_wordlist_groupbox.setObjectName(_fromUtf8("custom_wordlist_groupbox")) - self.horizontalLayout_13 = QtGui.QHBoxLayout(self.custom_wordlist_groupbox) + self.horizontalLayout_13 = QtWidgets.QHBoxLayout(self.custom_wordlist_groupbox) self.horizontalLayout_13.setObjectName(_fromUtf8("horizontalLayout_13")) - self.horizontalLayout_12 = QtGui.QHBoxLayout() + self.horizontalLayout_12 = QtWidgets.QHBoxLayout() self.horizontalLayout_12.setObjectName(_fromUtf8("horizontalLayout_12")) - spacerItem11 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem11 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_12.addItem(spacerItem11) - self.user_wordlist_led = QtGui.QLabel(self.custom_wordlist_groupbox) + self.user_wordlist_led = QtWidgets.QLabel(self.custom_wordlist_groupbox) self.user_wordlist_led.setText(_fromUtf8("")) self.user_wordlist_led.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/red_led.png" % (os.getcwd())))) self.user_wordlist_led.setObjectName(_fromUtf8("user_wordlist_led")) self.horizontalLayout_12.addWidget(self.user_wordlist_led) - self.userlist_button = QtGui.QPushButton(self.custom_wordlist_groupbox) + self.userlist_button = QtWidgets.QPushButton(self.custom_wordlist_groupbox) icon6 = QtGui.QIcon() icon6.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/Page-White-Database.ico" % (os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) self.userlist_button.setIcon(icon6) self.userlist_button.setIconSize(QtCore.QSize(20, 20)) self.userlist_button.setObjectName(_fromUtf8("userlist_button")) self.horizontalLayout_12.addWidget(self.userlist_button) - spacerItem12 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem12 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_12.addItem(spacerItem12) - self.password_wordlist_led = QtGui.QLabel(self.custom_wordlist_groupbox) + self.password_wordlist_led = QtWidgets.QLabel(self.custom_wordlist_groupbox) self.password_wordlist_led.setText(_fromUtf8("")) self.password_wordlist_led.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/red_led.png" % (os.getcwd())))) self.password_wordlist_led.setObjectName(_fromUtf8("password_wordlist_led")) self.horizontalLayout_12.addWidget(self.password_wordlist_led) - self.passwordlist_button = QtGui.QPushButton(self.custom_wordlist_groupbox) + self.passwordlist_button = QtWidgets.QPushButton(self.custom_wordlist_groupbox) self.passwordlist_button.setIcon(icon6) self.passwordlist_button.setIconSize(QtCore.QSize(20, 20)) self.passwordlist_button.setObjectName(_fromUtf8("passwordlist_button")) self.horizontalLayout_12.addWidget(self.passwordlist_button) - spacerItem13 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem13 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_12.addItem(spacerItem13) self.horizontalLayout_13.addLayout(self.horizontalLayout_12) self.verticalLayout_9.addWidget(self.custom_wordlist_groupbox) - self.verticalLayout_8 = QtGui.QVBoxLayout() + self.verticalLayout_8 = QtWidgets.QVBoxLayout() self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8")) - self.label_8 = QtGui.QLabel(ray_fusion) + self.label_8 = QtWidgets.QLabel(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.label_8.setFont(font) self.label_8.setObjectName(_fromUtf8("label_8")) self.verticalLayout_8.addWidget(self.label_8) - self.horizontalLayout_7 = QtGui.QHBoxLayout() + self.horizontalLayout_7 = QtWidgets.QHBoxLayout() self.horizontalLayout_7.setObjectName(_fromUtf8("horizontalLayout_7")) - self.verticalLayout_7 = QtGui.QVBoxLayout() + self.verticalLayout_7 = QtWidgets.QVBoxLayout() self.verticalLayout_7.setObjectName(_fromUtf8("verticalLayout_7")) - self.credential_table = QtGui.QTableWidget(ray_fusion) - self.credential_table.setFrameShape(QtGui.QFrame.VLine) - self.credential_table.setFrameShadow(QtGui.QFrame.Plain) - self.credential_table.setSelectionMode(QtGui.QAbstractItemView.SingleSelection) - self.credential_table.setSelectionBehavior(QtGui.QAbstractItemView.SelectItems) + self.credential_table = QtWidgets.QTableWidget(ray_fusion) + self.credential_table.setFrameShape(QtWidgets.QFrame.VLine) + self.credential_table.setFrameShadow(QtWidgets.QFrame.Plain) + self.credential_table.setSelectionMode(QtWidgets.QAbstractItemView.SingleSelection) + self.credential_table.setSelectionBehavior(QtWidgets.QAbstractItemView.SelectItems) self.credential_table.setTextElideMode(QtCore.Qt.ElideRight) - self.credential_table.setHorizontalScrollMode(QtGui.QAbstractItemView.ScrollPerItem) + self.credential_table.setHorizontalScrollMode(QtWidgets.QAbstractItemView.ScrollPerItem) self.credential_table.setObjectName(_fromUtf8("credential_table")) self.verticalLayout_7.addWidget(self.credential_table) - spacerItem14 = QtGui.QSpacerItem(20, 13, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem14 = QtWidgets.QSpacerItem(20, 13, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.verticalLayout_7.addItem(spacerItem14) - self.launch_bruteforce = QtGui.QPushButton(ray_fusion) + self.launch_bruteforce = QtWidgets.QPushButton(ray_fusion) self.launch_bruteforce.setMinimumSize(QtCore.QSize(0, 31)) font = QtGui.QFont() font.setPointSize(font_setting) @@ -248,49 +247,49 @@ def setupUi(self, ray_fusion): self.launch_bruteforce.setObjectName(_fromUtf8("launch_bruteforce")) self.verticalLayout_7.addWidget(self.launch_bruteforce) self.horizontalLayout_7.addLayout(self.verticalLayout_7) - self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.verticalLayout_5 = QtGui.QVBoxLayout() + self.verticalLayout_5 = QtWidgets.QVBoxLayout() self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) - self.verticalLayout_3 = QtGui.QVBoxLayout() + self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - self.verticalLayout_4 = QtGui.QVBoxLayout() + self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) - self.horizontalLayout_6 = QtGui.QHBoxLayout() + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) - self.label_3 = QtGui.QLabel(ray_fusion) + self.label_3 = QtWidgets.QLabel(ray_fusion) self.label_3.setMaximumSize(QtCore.QSize(52, 32)) self.label_3.setText(_fromUtf8("")) self.label_3.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/Statistics.ico" % (os.getcwd())))) self.label_3.setObjectName(_fromUtf8("label_3")) self.horizontalLayout_6.addWidget(self.label_3) - self.label_4 = QtGui.QLabel(ray_fusion) + self.label_4 = QtWidgets.QLabel(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.label_4.setFont(font) self.label_4.setObjectName(_fromUtf8("label_4")) self.horizontalLayout_6.addWidget(self.label_4) self.verticalLayout_4.addLayout(self.horizontalLayout_6) - self.verticalLayout_2 = QtGui.QVBoxLayout() + self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.line_2 = QtGui.QFrame(ray_fusion) - self.line_2.setFrameShape(QtGui.QFrame.HLine) - self.line_2.setFrameShadow(QtGui.QFrame.Sunken) + self.line_2 = QtWidgets.QFrame(ray_fusion) + self.line_2.setFrameShape(QtWidgets.QFrame.HLine) + self.line_2.setFrameShadow(QtWidgets.QFrame.Sunken) self.line_2.setObjectName(_fromUtf8("line_2")) self.verticalLayout_2.addWidget(self.line_2) - self.statistics_username = QtGui.QLabel(ray_fusion) + self.statistics_username = QtWidgets.QLabel(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.statistics_username.setFont(font) self.statistics_username.setObjectName(_fromUtf8("statistics_username")) self.verticalLayout_2.addWidget(self.statistics_username) - self.statistics_password = QtGui.QLabel(ray_fusion) + self.statistics_password = QtWidgets.QLabel(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.statistics_password.setFont(font) self.statistics_password.setObjectName(_fromUtf8("statistics_password")) self.verticalLayout_2.addWidget(self.statistics_password) - self.statistics_percentage = QtGui.QLabel(ray_fusion) + self.statistics_percentage = QtWidgets.QLabel(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.statistics_percentage.setFont(font) @@ -298,14 +297,14 @@ def setupUi(self, ray_fusion): self.verticalLayout_2.addWidget(self.statistics_percentage) self.verticalLayout_4.addLayout(self.verticalLayout_2) self.verticalLayout_3.addLayout(self.verticalLayout_4) - self.line = QtGui.QFrame(ray_fusion) - self.line.setFrameShape(QtGui.QFrame.HLine) - self.line.setFrameShadow(QtGui.QFrame.Sunken) + self.line = QtWidgets.QFrame(ray_fusion) + self.line.setFrameShape(QtWidgets.QFrame.HLine) + self.line.setFrameShadow(QtWidgets.QFrame.Sunken) self.line.setObjectName(_fromUtf8("line")) self.verticalLayout_3.addWidget(self.line) - spacerItem15 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem15 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem15) - self.save_credentials = QtGui.QPushButton(ray_fusion) + self.save_credentials = QtWidgets.QPushButton(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.save_credentials.setFont(font) @@ -315,9 +314,9 @@ def setupUi(self, ray_fusion): self.save_credentials.setIconSize(QtCore.QSize(20, 20)) self.save_credentials.setObjectName(_fromUtf8("save_credentials")) self.verticalLayout_3.addWidget(self.save_credentials) - spacerItem16 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem16 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem16) - self.clear_credentials = QtGui.QPushButton(ray_fusion) + self.clear_credentials = QtWidgets.QPushButton(ray_fusion) font = QtGui.QFont() font.setPointSize(font_setting) self.clear_credentials.setFont(font) @@ -327,13 +326,13 @@ def setupUi(self, ray_fusion): self.clear_credentials.setIconSize(QtCore.QSize(20, 20)) self.clear_credentials.setObjectName(_fromUtf8("clear_credentials")) self.verticalLayout_3.addWidget(self.clear_credentials) - spacerItem17 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem17 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem17) self.verticalLayout_5.addLayout(self.verticalLayout_3) - spacerItem18 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem18 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_5.addItem(spacerItem18) self.verticalLayout.addLayout(self.verticalLayout_5) - spacerItem19 = QtGui.QSpacerItem(108, 20, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Minimum) + spacerItem19 = QtWidgets.QSpacerItem(108, 20, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Minimum) self.verticalLayout.addItem(spacerItem19) self.horizontalLayout_7.addLayout(self.verticalLayout) self.verticalLayout_8.addLayout(self.horizontalLayout_7) @@ -359,45 +358,45 @@ def setupUi(self, ray_fusion): ray_fusion.setTabOrder(self.userlist_button, self.passwordlist_button) def retranslateUi(self, ray_fusion): - ray_fusion.setWindowTitle(QtGui.QApplication.translate("ray_fusion", "Fern - Ray Fusion", None, QtGui.QApplication.UnicodeUTF8)) - self.target_edit.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Insert target address here

", None, QtGui.QApplication.UnicodeUTF8)) - self.port_edit.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Insert service port number

", None, QtGui.QApplication.UnicodeUTF8)) - self.port_edit.setText(QtGui.QApplication.translate("ray_fusion", "80", None, QtGui.QApplication.UnicodeUTF8)) - self.help_button.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Help

", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox.setTitle(QtGui.QApplication.translate("ray_fusion", "Service ", None, QtGui.QApplication.UnicodeUTF8)) - self.http_https_radio.setToolTip(QtGui.QApplication.translate("ray_fusion", "

HTTP or HTTPS Service (Supports only Basic Authentication)

", None, QtGui.QApplication.UnicodeUTF8)) - self.http_https_radio.setText(QtGui.QApplication.translate("ray_fusion", "HTTP / HTTPS (Basic)", None, QtGui.QApplication.UnicodeUTF8)) - self.telnet_radio.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Telnet service

", None, QtGui.QApplication.UnicodeUTF8)) - self.telnet_radio.setText(QtGui.QApplication.translate("ray_fusion", "TELNET", None, QtGui.QApplication.UnicodeUTF8)) - self.ftp_radio.setToolTip(QtGui.QApplication.translate("ray_fusion", "

FTP Service

", None, QtGui.QApplication.UnicodeUTF8)) - self.ftp_radio.setText(QtGui.QApplication.translate("ray_fusion", "FTP", None, QtGui.QApplication.UnicodeUTF8)) - self.settings_button.setToolTip(QtGui.QApplication.translate("ray_fusion", "

click to hide or show settings

", None, QtGui.QApplication.UnicodeUTF8)) - self.settings_button.setText(QtGui.QApplication.translate("ray_fusion", "Hide Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.settings_groupbox.setTitle(QtGui.QApplication.translate("ray_fusion", "Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.default_wordlist_radio.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Select to use internal wordlists

", None, QtGui.QApplication.UnicodeUTF8)) - self.default_wordlist_radio.setText(QtGui.QApplication.translate("ray_fusion", "Default Wordlists", None, QtGui.QApplication.UnicodeUTF8)) - self.custom_wordlist_radio.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Select to use your custom wordlists

", None, QtGui.QApplication.UnicodeUTF8)) - self.custom_wordlist_radio.setText(QtGui.QApplication.translate("ray_fusion", "Custom Wordlists", None, QtGui.QApplication.UnicodeUTF8)) - self.blank_username_checkbox.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Attempt blank password when bruteforcing

", None, QtGui.QApplication.UnicodeUTF8)) - self.blank_username_checkbox.setText(QtGui.QApplication.translate("ray_fusion", "Attempt Blank Username", None, QtGui.QApplication.UnicodeUTF8)) - self.blank_password_checkbox.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Attempt blank password when bruteforcing

", None, QtGui.QApplication.UnicodeUTF8)) - self.blank_password_checkbox.setText(QtGui.QApplication.translate("ray_fusion", "Attempt Blank Password", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Time interval between each try

", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("ray_fusion", "Time Interval:", None, QtGui.QApplication.UnicodeUTF8)) - self.time_interval_spinbox.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Time interval between each try

", None, QtGui.QApplication.UnicodeUTF8)) - self.userlist_button.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Select wordlist with usernames

", None, QtGui.QApplication.UnicodeUTF8)) - self.userlist_button.setText(QtGui.QApplication.translate("ray_fusion", "Import User Wordlist", None, QtGui.QApplication.UnicodeUTF8)) - self.passwordlist_button.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Select wordlist with passwords

", None, QtGui.QApplication.UnicodeUTF8)) - self.passwordlist_button.setText(QtGui.QApplication.translate("ray_fusion", "Import Password Wordlist", None, QtGui.QApplication.UnicodeUTF8)) - self.label_8.setText(QtGui.QApplication.translate("ray_fusion", "Successful Login Credentials", None, QtGui.QApplication.UnicodeUTF8)) - self.launch_bruteforce.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Start or Stop Bruteforce Attack

", None, QtGui.QApplication.UnicodeUTF8)) - self.launch_bruteforce.setText(QtGui.QApplication.translate("ray_fusion", "Start", None, QtGui.QApplication.UnicodeUTF8)) - self.label_4.setText(QtGui.QApplication.translate("ray_fusion", "Statistics", None, QtGui.QApplication.UnicodeUTF8)) - self.statistics_username.setText(QtGui.QApplication.translate("ray_fusion", "Username:", None, QtGui.QApplication.UnicodeUTF8)) - self.statistics_password.setText(QtGui.QApplication.translate("ray_fusion", "Password:", None, QtGui.QApplication.UnicodeUTF8)) - self.statistics_percentage.setText(QtGui.QApplication.translate("ray_fusion", "0% Complete", None, QtGui.QApplication.UnicodeUTF8)) - self.save_credentials.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Save credentials to disk

", None, QtGui.QApplication.UnicodeUTF8)) - self.save_credentials.setText(QtGui.QApplication.translate("ray_fusion", "Save Credentials", None, QtGui.QApplication.UnicodeUTF8)) - self.clear_credentials.setToolTip(QtGui.QApplication.translate("ray_fusion", "

Clear all bruteforced credentials

", None, QtGui.QApplication.UnicodeUTF8)) - self.clear_credentials.setText(QtGui.QApplication.translate("ray_fusion", "Clear Credentials", None, QtGui.QApplication.UnicodeUTF8)) + ray_fusion.setWindowTitle(QtWidgets.QApplication.translate("ray_fusion", "Fern - Ray Fusion", None, 0)) + self.target_edit.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Insert target address here

", None, 0)) + self.port_edit.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Insert service port number

", None, 0)) + self.port_edit.setText(QtWidgets.QApplication.translate("ray_fusion", "80", None, 0)) + self.help_button.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Help

", None, 0)) + self.groupBox.setTitle(QtWidgets.QApplication.translate("ray_fusion", "Service ", None, 0)) + self.http_https_radio.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

HTTP or HTTPS Service (Supports only Basic Authentication)

", None, 0)) + self.http_https_radio.setText(QtWidgets.QApplication.translate("ray_fusion", "HTTP / HTTPS (Basic)", None, 0)) + self.telnet_radio.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Telnet service

", None, 0)) + self.telnet_radio.setText(QtWidgets.QApplication.translate("ray_fusion", "TELNET", None, 0)) + self.ftp_radio.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

FTP Service

", None, 0)) + self.ftp_radio.setText(QtWidgets.QApplication.translate("ray_fusion", "FTP", None, 0)) + self.settings_button.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

click to hide or show settings

", None, 0)) + self.settings_button.setText(QtWidgets.QApplication.translate("ray_fusion", "Hide Settings", None, 0)) + self.settings_groupbox.setTitle(QtWidgets.QApplication.translate("ray_fusion", "Settings", None, 0)) + self.default_wordlist_radio.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Select to use internal wordlists

", None, 0)) + self.default_wordlist_radio.setText(QtWidgets.QApplication.translate("ray_fusion", "Default Wordlists", None, 0)) + self.custom_wordlist_radio.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Select to use your custom wordlists

", None, 0)) + self.custom_wordlist_radio.setText(QtWidgets.QApplication.translate("ray_fusion", "Custom Wordlists", None, 0)) + self.blank_username_checkbox.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Attempt blank password when bruteforcing

", None, 0)) + self.blank_username_checkbox.setText(QtWidgets.QApplication.translate("ray_fusion", "Attempt Blank Username", None, 0)) + self.blank_password_checkbox.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Attempt blank password when bruteforcing

", None, 0)) + self.blank_password_checkbox.setText(QtWidgets.QApplication.translate("ray_fusion", "Attempt Blank Password", None, 0)) + self.label_2.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Time interval between each try

", None, 0)) + self.label_2.setText(QtWidgets.QApplication.translate("ray_fusion", "Time Interval:", None, 0)) + self.time_interval_spinbox.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Time interval between each try

", None, 0)) + self.userlist_button.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Select wordlist with usernames

", None, 0)) + self.userlist_button.setText(QtWidgets.QApplication.translate("ray_fusion", "Import User Wordlist", None, 0)) + self.passwordlist_button.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Select wordlist with passwords

", None, 0)) + self.passwordlist_button.setText(QtWidgets.QApplication.translate("ray_fusion", "Import Password Wordlist", None, 0)) + self.label_8.setText(QtWidgets.QApplication.translate("ray_fusion", "Successful Login Credentials", None, 0)) + self.launch_bruteforce.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Start or Stop Bruteforce Attack

", None, 0)) + self.launch_bruteforce.setText(QtWidgets.QApplication.translate("ray_fusion", "Start", None, 0)) + self.label_4.setText(QtWidgets.QApplication.translate("ray_fusion", "Statistics", None, 0)) + self.statistics_username.setText(QtWidgets.QApplication.translate("ray_fusion", "Username:", None, 0)) + self.statistics_password.setText(QtWidgets.QApplication.translate("ray_fusion", "Password:", None, 0)) + self.statistics_percentage.setText(QtWidgets.QApplication.translate("ray_fusion", "0% Complete", None, 0)) + self.save_credentials.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Save credentials to disk

", None, 0)) + self.save_credentials.setText(QtWidgets.QApplication.translate("ray_fusion", "Save Credentials", None, 0)) + self.clear_credentials.setToolTip(QtWidgets.QApplication.translate("ray_fusion", "

Clear all bruteforced credentials

", None, 0)) + self.clear_credentials.setText(QtWidgets.QApplication.translate("ray_fusion", "Clear Credentials", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/settings.py b/Fern-Wifi-Cracker/gui/settings.py index 3af4fb4..c531624 100644 --- a/Fern-Wifi-Cracker/gui/settings.py +++ b/Fern-Wifi-Cracker/gui/settings.py @@ -3,62 +3,58 @@ # Form implementation generated from reading ui file 'untitled.ui' # # Created: Thu Oct 14 08:16:19 2010 -# by: PyQt4 UI code generator 4.7.7 +# by: PyQt5 UI code generator 4.7.7 # # WARNING! All changes made in this file will be lost! -import os -from main_window import font_size -from PyQt4 import QtCore, QtGui +import os +from PyQt5.QtWidgets import * +from main_window import font_size +from PyQt5 import QtCore, QtWidgets, QtGui font_setting = font_size() -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - _fromUtf8 = lambda s: s - class settings(object): def setupUi(self, Dialog): - Dialog.setObjectName(_fromUtf8("Dialog")) + Dialog.setObjectName("Dialog") Dialog.resize(427, 133) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/wifi_5.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap("%s/resources/wifi_5.png"%(os.getcwd())), QtGui.QIcon.Normal, QtGui.QIcon.Off) Dialog.setWindowIcon(icon) - self.buttonBox = QtGui.QDialogButtonBox(Dialog) + self.buttonBox = QtWidgets.QDialogButtonBox(Dialog) self.buttonBox.setGeometry(QtCore.QRect(-20, 90, 341, 32)) self.buttonBox.setOrientation(QtCore.Qt.Horizontal) - self.buttonBox.setStandardButtons(QtGui.QDialogButtonBox.Cancel|QtGui.QDialogButtonBox.Ok) - self.buttonBox.setObjectName(_fromUtf8("buttonBox")) + self.buttonBox.setStandardButtons(QtWidgets.QDialogButtonBox.Cancel|QtWidgets.QDialogButtonBox.Ok) + self.buttonBox.setObjectName("buttonBox") font = QtGui.QFont() font.setPointSize(font_setting) self.buttonBox.setFont(font) - self.channel_combobox = QtGui.QComboBox(Dialog) + self.channel_combobox = QtWidgets.QComboBox(Dialog) self.channel_combobox.setGeometry(QtCore.QRect(170, 20, 121, 21)) - self.channel_combobox.setObjectName(_fromUtf8("channel_combobox")) + self.channel_combobox.setObjectName("channel_combobox") font = QtGui.QFont() font.setPointSize(font_setting) self.channel_combobox.setFont(font) - self.label = QtGui.QLabel(Dialog) + self.label = QtWidgets.QLabel(Dialog) self.label.setGeometry(QtCore.QRect(110, 20, 61, 16)) - self.label.setObjectName(_fromUtf8("label")) + self.label.setObjectName("label") font = QtGui.QFont() font.setPointSize(font_setting) self.label.setFont(font) - self.label_2 = QtGui.QLabel(Dialog) + self.label_2 = QtWidgets.QLabel(Dialog) self.label_2.setGeometry(QtCore.QRect(10, -10, 91, 111)) - self.label_2.setText(_fromUtf8("")) - self.label_2.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/radio-wireless-signal-icone-5919-96.png"%(os.getcwd())))) - self.label_2.setObjectName(_fromUtf8("label_2")) + self.label_2.setText("") + self.label_2.setPixmap(QtGui.QPixmap("%s/resources/radio-wireless-signal-icone-5919-96.png"%(os.getcwd()))) + self.label_2.setObjectName("label_2") font = QtGui.QFont() font.setPointSize(font_setting) self.label_2.setFont(font) - self.xterm_checkbox = QtGui.QCheckBox(Dialog) + self.xterm_checkbox = QtWidgets.QCheckBox(Dialog) self.xterm_checkbox.setGeometry(QtCore.QRect(300, 20, 171, 17)) - self.xterm_checkbox.setObjectName(_fromUtf8("xterm_checkbox")) + self.xterm_checkbox.setObjectName("xterm_checkbox") font = QtGui.QFont() font.setPointSize(font_setting) self.xterm_checkbox.setFont(font) - self.label_3 = QtGui.QLabel(Dialog) + self.label_3 = QtWidgets.QLabel(Dialog) self.label_3.setGeometry(QtCore.QRect(110, 50, 311, 16)) font = QtGui.QFont() font.setWeight(50) @@ -67,14 +63,14 @@ def setupUi(self, Dialog): font = QtGui.QFont() font.setPointSize(font_setting) self.label_3.setFont(font) - self.label_3.setObjectName(_fromUtf8("label_3")) - self.label_4 = QtGui.QLabel(Dialog) + self.label_3.setObjectName("label_3") + self.label_4 = QtWidgets.QLabel(Dialog) self.label_4.setGeometry(QtCore.QRect(10, 90, 101, 16)) - self.label_4.setObjectName(_fromUtf8("label_4")) + self.label_4.setObjectName("label_4") font = QtGui.QFont() font.setPointSize(font_setting) self.label_4.setFont(font) - self.label_5 = QtGui.QLabel(Dialog) + self.label_5 = QtWidgets.QLabel(Dialog) self.label_5.setGeometry(QtCore.QRect(100, 90, 46, 13)) font = QtGui.QFont() font.setPointSize(font_setting) @@ -83,19 +79,19 @@ def setupUi(self, Dialog): font.setWeight(75) font.setBold(False) self.label_5.setFont(font) - self.label_5.setObjectName(_fromUtf8("label_5")) + self.label_5.setObjectName("label_5") self.retranslateUi(Dialog) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("accepted()")), Dialog.accept) - QtCore.QObject.connect(self.buttonBox, QtCore.SIGNAL(_fromUtf8("rejected()")), Dialog.reject) + self.buttonBox.accepted.connect(Dialog.accept) + self.buttonBox.rejected.connect(Dialog.reject) QtCore.QMetaObject.connectSlotsByName(Dialog) def retranslateUi(self, Dialog): - Dialog.setWindowTitle(QtGui.QApplication.translate("Dialog", "Access Point Scan Preferences", None, QtGui.QApplication.UnicodeUTF8)) - self.label.setText(QtGui.QApplication.translate("Dialog", "Channel:", None, QtGui.QApplication.UnicodeUTF8)) - self.xterm_checkbox.setText(QtGui.QApplication.translate("Dialog", "Enable XTerms", None, QtGui.QApplication.UnicodeUTF8)) - self.label_3.setText(QtGui.QApplication.translate("Dialog", "Automatic scan to all channels is Default without XTerm", None, QtGui.QApplication.UnicodeUTF8)) - self.label_4.setText(QtGui.QApplication.translate("Dialog", "\t Activated", None, QtGui.QApplication.UnicodeUTF8)) - self.label_5.setText(QtGui.QApplication.translate("Dialog", "", None, QtGui.QApplication.UnicodeUTF8)) + Dialog.setWindowTitle(QtCore.QCoreApplication.translate("Dialog", "Access Point Scan Preferences", None, 0)) + self.label.setText(QtCore.QCoreApplication.translate("Dialog", "Channel:", None, 0)) + self.xterm_checkbox.setText(QtCore.QCoreApplication.translate("Dialog", "Enable XTerms", None, 0)) + self.label_3.setText(QtCore.QCoreApplication.translate("Dialog", "Automatic scan to all channels is Default without XTerm", None, 0)) + self.label_4.setText(QtCore.QCoreApplication.translate("Dialog", "\t Activated", None, 0)) + self.label_5.setText(QtCore.QCoreApplication.translate("Dialog", "", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/tips.py b/Fern-Wifi-Cracker/gui/tips.py index 3966ede..ae2f839 100644 --- a/Fern-Wifi-Cracker/gui/tips.py +++ b/Fern-Wifi-Cracker/gui/tips.py @@ -1,7 +1,7 @@ import os from main_window import font_size -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets, QtGui font_setting = font_size() @@ -17,38 +17,38 @@ def setupUi(self, tips_dialog): icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/1286998882_ktip.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) tips_dialog.setWindowIcon(icon) - self.verticalLayout_4 = QtGui.QVBoxLayout(tips_dialog) + self.verticalLayout_4 = QtWidgets.QVBoxLayout(tips_dialog) self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) - self.verticalLayout_3 = QtGui.QVBoxLayout() + self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - self.label = QtGui.QLabel(tips_dialog) + self.label = QtWidgets.QLabel(tips_dialog) self.label.setText(_fromUtf8("")) self.label.setPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/1286998882_ktip.png"%(os.getcwd())))) self.label.setObjectName(_fromUtf8("label")) self.horizontalLayout.addWidget(self.label) - self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - self.label_2 = QtGui.QLabel(tips_dialog) + self.label_2 = QtWidgets.QLabel(tips_dialog) font = QtGui.QFont() font.setPointSize(font_setting) self.label_2.setFont(font) self.label_2.setObjectName(_fromUtf8("label_2")) self.verticalLayout.addWidget(self.label_2) - self.label_3 = QtGui.QLabel(tips_dialog) + self.label_3 = QtWidgets.QLabel(tips_dialog) font = QtGui.QFont() font.setPointSize(font_setting) self.label_3.setFont(font) self.label_3.setObjectName(_fromUtf8("label_3")) self.verticalLayout.addWidget(self.label_3) - self.label_4 = QtGui.QLabel(tips_dialog) + self.label_4 = QtWidgets.QLabel(tips_dialog) font = QtGui.QFont() font.setPointSize(font_setting) self.label_4.setFont(font) self.label_4.setObjectName(_fromUtf8("label_4")) self.verticalLayout.addWidget(self.label_4) - self.label_5 = QtGui.QLabel(tips_dialog) + self.label_5 = QtWidgets.QLabel(tips_dialog) font = QtGui.QFont() font.setPointSize(font_setting) self.label_5.setFont(font) @@ -56,27 +56,27 @@ def setupUi(self, tips_dialog): self.verticalLayout.addWidget(self.label_5) self.horizontalLayout.addLayout(self.verticalLayout) self.verticalLayout_3.addLayout(self.horizontalLayout) - spacerItem = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_3.addItem(spacerItem) - self.verticalLayout_2 = QtGui.QVBoxLayout() + self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.checkBox = QtGui.QCheckBox(tips_dialog) + self.checkBox = QtWidgets.QCheckBox(tips_dialog) font = QtGui.QFont() font.setPointSize(font_setting) self.checkBox.setFont(font) self.checkBox.setObjectName(_fromUtf8("checkBox")) self.verticalLayout_2.addWidget(self.checkBox) - self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - spacerItem1 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem1 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem1) - self.pushButton = QtGui.QPushButton(tips_dialog) + self.pushButton = QtWidgets.QPushButton(tips_dialog) font = QtGui.QFont() font.setPointSize(font_setting) self.pushButton.setFont(font) self.pushButton.setObjectName(_fromUtf8("pushButton")) self.horizontalLayout_2.addWidget(self.pushButton) - spacerItem2 = QtGui.QSpacerItem(40, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem2 = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem2) self.verticalLayout_2.addLayout(self.horizontalLayout_2) self.verticalLayout_3.addLayout(self.verticalLayout_2) @@ -86,11 +86,11 @@ def setupUi(self, tips_dialog): QtCore.QMetaObject.connectSlotsByName(tips_dialog) def retranslateUi(self, tips_dialog): - tips_dialog.setWindowTitle(QtGui.QApplication.translate("tips_dialog", "Tips - Scan settings", None, QtGui.QApplication.UnicodeUTF8)) - self.label_2.setText(QtGui.QApplication.translate("tips_dialog", "To Access the \"Settings\" for the network scan preferences \"Double click\"", None, QtGui.QApplication.UnicodeUTF8)) - self.label_3.setText(QtGui.QApplication.translate("tips_dialog", "on any area of the main window, \"Scan for network button\" is used to", None, QtGui.QApplication.UnicodeUTF8)) - self.label_4.setText(QtGui.QApplication.translate("tips_dialog", "scan for network based on the settings options of the settings dialog", None, QtGui.QApplication.UnicodeUTF8)) - self.label_5.setText(QtGui.QApplication.translate("tips_dialog", "Default is automated scan, Fake Mac-Address is always used", None, QtGui.QApplication.UnicodeUTF8)) - self.checkBox.setText(QtGui.QApplication.translate("tips_dialog", "Don\'t show this message again", None, QtGui.QApplication.UnicodeUTF8)) - self.pushButton.setText(QtGui.QApplication.translate("tips_dialog", "Ok", None, QtGui.QApplication.UnicodeUTF8)) + tips_dialog.setWindowTitle(QtWidgets.QApplication.translate("tips_dialog", "Tips - Scan settings", None, 0)) + self.label_2.setText(QtWidgets.QApplication.translate("tips_dialog", "To Access the \"Settings\" for the network scan preferences \"Double click\"", None, 0)) + self.label_3.setText(QtWidgets.QApplication.translate("tips_dialog", "on any area of the main window, \"Scan for network button\" is used to", None, 0)) + self.label_4.setText(QtWidgets.QApplication.translate("tips_dialog", "scan for network based on the settings options of the settings dialog", None, 0)) + self.label_5.setText(QtWidgets.QApplication.translate("tips_dialog", "Default is automated scan, Fake Mac-Address is always used", None, 0)) + self.checkBox.setText(QtWidgets.QApplication.translate("tips_dialog", "Don\'t show this message again", None, 0)) + self.pushButton.setText(QtWidgets.QApplication.translate("tips_dialog", "Ok", None, 0)) diff --git a/Fern-Wifi-Cracker/gui/toolbox.py b/Fern-Wifi-Cracker/gui/toolbox.py index 8c3ade6..09e0808 100644 --- a/Fern-Wifi-Cracker/gui/toolbox.py +++ b/Fern-Wifi-Cracker/gui/toolbox.py @@ -1,10 +1,9 @@ import os from main_window import font_size -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtWidgets, QtGui font_setting = font_size() -from PyQt4 import QtCore, QtGui try: _fromUtf8 = QtCore.QString.fromUtf8 @@ -18,29 +17,29 @@ def setupUi(self, toolbox_win): icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8("%s/resources/1295905972_tool_kit.png"%(os.getcwd()))), QtGui.QIcon.Normal, QtGui.QIcon.Off) toolbox_win.setWindowIcon(icon) - self.verticalLayout_5 = QtGui.QVBoxLayout(toolbox_win) + self.verticalLayout_5 = QtWidgets.QVBoxLayout(toolbox_win) self.verticalLayout_5.setObjectName(_fromUtf8("verticalLayout_5")) - self.groupBox_2 = QtGui.QGroupBox(toolbox_win) + self.groupBox_2 = QtWidgets.QGroupBox(toolbox_win) font = QtGui.QFont() font.setPointSize(font_setting) self.groupBox_2.setFont(font) self.groupBox_2.setObjectName(_fromUtf8("groupBox_2")) - self.verticalLayout_9 = QtGui.QVBoxLayout(self.groupBox_2) + self.verticalLayout_9 = QtWidgets.QVBoxLayout(self.groupBox_2) self.verticalLayout_9.setObjectName(_fromUtf8("verticalLayout_9")) - self.verticalLayout_2 = QtGui.QVBoxLayout() + self.verticalLayout_2 = QtWidgets.QVBoxLayout() self.verticalLayout_2.setObjectName(_fromUtf8("verticalLayout_2")) - self.horizontalLayout_2 = QtGui.QHBoxLayout() + self.horizontalLayout_2 = QtWidgets.QHBoxLayout() self.horizontalLayout_2.setObjectName(_fromUtf8("horizontalLayout_2")) - self.horizontalLayout = QtGui.QHBoxLayout() + self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName(_fromUtf8("horizontalLayout")) - spacerItem = QtGui.QSpacerItem(11, 92, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem = QtWidgets.QSpacerItem(11, 92, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout.addItem(spacerItem) - self.verticalLayout = QtGui.QVBoxLayout() + self.verticalLayout = QtWidgets.QVBoxLayout() self.verticalLayout.setObjectName(_fromUtf8("verticalLayout")) - spacerItem1 = QtGui.QSpacerItem(190, 10, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem1 = QtWidgets.QSpacerItem(190, 10, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout.addItem(spacerItem1) - self.geotrack_button = QtGui.QPushButton(self.groupBox_2) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.geotrack_button = QtWidgets.QPushButton(self.groupBox_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.geotrack_button.sizePolicy().hasHeightForWidth()) @@ -56,18 +55,18 @@ def setupUi(self, toolbox_win): self.verticalLayout.addWidget(self.geotrack_button) self.horizontalLayout.addLayout(self.verticalLayout) self.horizontalLayout_2.addLayout(self.horizontalLayout) - spacerItem2 = QtGui.QSpacerItem(78, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem2 = QtWidgets.QSpacerItem(78, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem2) - self.horizontalLayout_6 = QtGui.QHBoxLayout() + self.horizontalLayout_6 = QtWidgets.QHBoxLayout() self.horizontalLayout_6.setObjectName(_fromUtf8("horizontalLayout_6")) - spacerItem3 = QtGui.QSpacerItem(11, 92, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem3 = QtWidgets.QSpacerItem(11, 92, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout_6.addItem(spacerItem3) - self.verticalLayout_6 = QtGui.QVBoxLayout() + self.verticalLayout_6 = QtWidgets.QVBoxLayout() self.verticalLayout_6.setObjectName(_fromUtf8("verticalLayout_6")) - spacerItem4 = QtGui.QSpacerItem(190, 10, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem4 = QtWidgets.QSpacerItem(190, 10, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_6.addItem(spacerItem4) - self.cookie_hijack_button = QtGui.QPushButton(self.groupBox_2) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.cookie_hijack_button = QtWidgets.QPushButton(self.groupBox_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.cookie_hijack_button.sizePolicy().hasHeightForWidth()) @@ -83,18 +82,18 @@ def setupUi(self, toolbox_win): self.verticalLayout_6.addWidget(self.cookie_hijack_button) self.horizontalLayout_6.addLayout(self.verticalLayout_6) self.horizontalLayout_2.addLayout(self.horizontalLayout_6) - spacerItem5 = QtGui.QSpacerItem(78, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem5 = QtWidgets.QSpacerItem(78, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_2.addItem(spacerItem5) - self.horizontalLayout_8 = QtGui.QHBoxLayout() + self.horizontalLayout_8 = QtWidgets.QHBoxLayout() self.horizontalLayout_8.setObjectName(_fromUtf8("horizontalLayout_8")) - spacerItem6 = QtGui.QSpacerItem(11, 92, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem6 = QtWidgets.QSpacerItem(11, 92, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout_8.addItem(spacerItem6) - self.verticalLayout_8 = QtGui.QVBoxLayout() + self.verticalLayout_8 = QtWidgets.QVBoxLayout() self.verticalLayout_8.setObjectName(_fromUtf8("verticalLayout_8")) - spacerItem7 = QtGui.QSpacerItem(190, 10, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem7 = QtWidgets.QSpacerItem(190, 10, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_8.addItem(spacerItem7) - self.ray_fusion_button = QtGui.QPushButton(self.groupBox_2) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.ray_fusion_button = QtWidgets.QPushButton(self.groupBox_2) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.ray_fusion_button.sizePolicy().hasHeightForWidth()) @@ -111,12 +110,12 @@ def setupUi(self, toolbox_win): self.horizontalLayout_8.addLayout(self.verticalLayout_8) self.horizontalLayout_2.addLayout(self.horizontalLayout_8) self.verticalLayout_2.addLayout(self.horizontalLayout_2) - spacerItem8 = QtGui.QSpacerItem(20, 28, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem8 = QtWidgets.QSpacerItem(20, 28, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_2.addItem(spacerItem8) self.verticalLayout_9.addLayout(self.verticalLayout_2) self.verticalLayout_5.addWidget(self.groupBox_2) - self.groupBox = QtGui.QGroupBox(toolbox_win) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Preferred) + self.groupBox = QtWidgets.QGroupBox(toolbox_win) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Preferred) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.groupBox.sizePolicy().hasHeightForWidth()) @@ -125,18 +124,18 @@ def setupUi(self, toolbox_win): font.setPointSize(font_setting) self.groupBox.setFont(font) self.groupBox.setObjectName(_fromUtf8("groupBox")) - self.horizontalLayout_5 = QtGui.QHBoxLayout(self.groupBox) + self.horizontalLayout_5 = QtWidgets.QHBoxLayout(self.groupBox) self.horizontalLayout_5.setObjectName(_fromUtf8("horizontalLayout_5")) - self.horizontalLayout_3 = QtGui.QHBoxLayout() + self.horizontalLayout_3 = QtWidgets.QHBoxLayout() self.horizontalLayout_3.setObjectName(_fromUtf8("horizontalLayout_3")) - spacerItem9 = QtGui.QSpacerItem(20, 80, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem9 = QtWidgets.QSpacerItem(20, 80, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout_3.addItem(spacerItem9) - self.verticalLayout_3 = QtGui.QVBoxLayout() + self.verticalLayout_3 = QtWidgets.QVBoxLayout() self.verticalLayout_3.setObjectName(_fromUtf8("verticalLayout_3")) - spacerItem10 = QtGui.QSpacerItem(158, 10, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem10 = QtWidgets.QSpacerItem(158, 10, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_3.addItem(spacerItem10) - self.pushButton = QtGui.QPushButton(self.groupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.pushButton = QtWidgets.QPushButton(self.groupBox) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.pushButton.sizePolicy().hasHeightForWidth()) @@ -152,18 +151,18 @@ def setupUi(self, toolbox_win): self.verticalLayout_3.addWidget(self.pushButton) self.horizontalLayout_3.addLayout(self.verticalLayout_3) self.horizontalLayout_5.addLayout(self.horizontalLayout_3) - spacerItem11 = QtGui.QSpacerItem(63, 20, QtGui.QSizePolicy.Expanding, QtGui.QSizePolicy.Minimum) + spacerItem11 = QtWidgets.QSpacerItem(63, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout_5.addItem(spacerItem11) - self.horizontalLayout_4 = QtGui.QHBoxLayout() + self.horizontalLayout_4 = QtWidgets.QHBoxLayout() self.horizontalLayout_4.setObjectName(_fromUtf8("horizontalLayout_4")) - spacerItem12 = QtGui.QSpacerItem(20, 80, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Fixed) + spacerItem12 = QtWidgets.QSpacerItem(20, 80, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Fixed) self.horizontalLayout_4.addItem(spacerItem12) - self.verticalLayout_4 = QtGui.QVBoxLayout() + self.verticalLayout_4 = QtWidgets.QVBoxLayout() self.verticalLayout_4.setObjectName(_fromUtf8("verticalLayout_4")) - spacerItem13 = QtGui.QSpacerItem(158, 10, QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Minimum) + spacerItem13 = QtWidgets.QSpacerItem(158, 10, QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Minimum) self.verticalLayout_4.addItem(spacerItem13) - self.attack_options_button = QtGui.QPushButton(self.groupBox) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Ignored, QtGui.QSizePolicy.Ignored) + self.attack_options_button = QtWidgets.QPushButton(self.groupBox) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Ignored, QtWidgets.QSizePolicy.Ignored) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(self.attack_options_button.sizePolicy().hasHeightForWidth()) @@ -179,22 +178,22 @@ def setupUi(self, toolbox_win): self.verticalLayout_4.addWidget(self.attack_options_button) self.horizontalLayout_4.addLayout(self.verticalLayout_4) self.horizontalLayout_5.addLayout(self.horizontalLayout_4) - spacerItem14 = QtGui.QSpacerItem(20, 28, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem14 = QtWidgets.QSpacerItem(20, 28, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.horizontalLayout_5.addItem(spacerItem14) self.verticalLayout_5.addWidget(self.groupBox) - spacerItem15 = QtGui.QSpacerItem(20, 40, QtGui.QSizePolicy.Minimum, QtGui.QSizePolicy.Expanding) + spacerItem15 = QtWidgets.QSpacerItem(20, 40, QtWidgets.QSizePolicy.Minimum, QtWidgets.QSizePolicy.Expanding) self.verticalLayout_5.addItem(spacerItem15) self.retranslateUi(toolbox_win) QtCore.QMetaObject.connectSlotsByName(toolbox_win) def retranslateUi(self, toolbox_win): - toolbox_win.setWindowTitle(QtGui.QApplication.translate("toolbox_win", "Fern - ToolBox", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox_2.setTitle(QtGui.QApplication.translate("toolbox_win", "Features", None, QtGui.QApplication.UnicodeUTF8)) - self.geotrack_button.setText(QtGui.QApplication.translate("toolbox_win", "Geolocatory Tracker", None, QtGui.QApplication.UnicodeUTF8)) - self.cookie_hijack_button.setText(QtGui.QApplication.translate("toolbox_win", "Cookie Hijacker", None, QtGui.QApplication.UnicodeUTF8)) - self.ray_fusion_button.setText(QtGui.QApplication.translate("toolbox_win", "Ray Fusion", None, QtGui.QApplication.UnicodeUTF8)) - self.groupBox.setTitle(QtGui.QApplication.translate("toolbox_win", "General Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.pushButton.setText(QtGui.QApplication.translate("toolbox_win", "Font Settings", None, QtGui.QApplication.UnicodeUTF8)) - self.attack_options_button.setText(QtGui.QApplication.translate("toolbox_win", "WIFI Attack Options", None, QtGui.QApplication.UnicodeUTF8)) + toolbox_win.setWindowTitle(QtWidgets.QApplication.translate("toolbox_win", "Fern - ToolBox", None, 0)) + self.groupBox_2.setTitle(QtWidgets.QApplication.translate("toolbox_win", "Features", None, 0)) + self.geotrack_button.setText(QtWidgets.QApplication.translate("toolbox_win", "Geolocatory Tracker", None, 0)) + self.cookie_hijack_button.setText(QtWidgets.QApplication.translate("toolbox_win", "Cookie Hijacker", None, 0)) + self.ray_fusion_button.setText(QtWidgets.QApplication.translate("toolbox_win", "Ray Fusion", None, 0)) + self.groupBox.setTitle(QtWidgets.QApplication.translate("toolbox_win", "General Settings", None, 0)) + self.pushButton.setText(QtWidgets.QApplication.translate("toolbox_win", "Font Settings", None, 0)) + self.attack_options_button.setText(QtWidgets.QApplication.translate("toolbox_win", "WIFI Attack Options", None, 0)) diff --git a/Fern-Wifi-Cracker/resources/splash.png b/Fern-Wifi-Cracker/resources/splash.png index 565193f7f2352df64b80d5fb2ea2684c5728bab3..d105d2d1ed7bfc340c93301e0c45b8ce52ab75b6 100644 GIT binary patch literal 66594 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 M07*qoM6N<$f_L*phX4Qo literal 56801 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 E0InUj2mk;8 diff --git a/Fern-Wifi-Cracker/version b/Fern-Wifi-Cracker/version index 7b25e79..2add790 100644 --- a/Fern-Wifi-Cracker/version +++ b/Fern-Wifi-Cracker/version @@ -1,2 +1,2 @@ -version = 2.6 +version = 2.7 total_files = 81