nameflood.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include "nameflood.h"
  5. #include "_protocols.h"
  6. #include <storage/storage.h>
  7. // Hacked together by @Willy-JL
  8. static const char* get_name(const Payload* payload) {
  9. UNUSED(payload);
  10. return "NameFlood";
  11. }
  12. static const char* make_name(const Payload* payload) {
  13. UNUSED(payload);
  14. static const char* names[256];
  15. static uint8_t names_count = 0;
  16. if(names_count == 0) {
  17. Storage* storage = furi_record_open(RECORD_STORAGE);
  18. if(storage) {
  19. File* file = storage_file_alloc(storage);
  20. if(storage_file_open(
  21. file,
  22. "/ext/apps_assets/ble_spam/floodlist.txt",
  23. FSAM_READ,
  24. FSOM_OPEN_EXISTING)) {
  25. char line[256];
  26. uint64_t bytes_read = storage_file_read(file, line, sizeof(line));
  27. if(bytes_read > 0) {
  28. line[bytes_read] = '\0';
  29. char* name = strtok(line, ",");
  30. while(name && names_count < 255) {
  31. names[names_count++] = strdup(name);
  32. name = strtok(NULL, ",");
  33. }
  34. }
  35. storage_file_close(file);
  36. }
  37. storage_file_free(file);
  38. furi_record_close(RECORD_STORAGE);
  39. }
  40. }
  41. if(names_count == 0) {
  42. return "NameFlood";
  43. } else {
  44. return names[rand() % names_count];
  45. }
  46. }
  47. static void make_packet(uint8_t* _size, uint8_t** _packet, Payload* payload) {
  48. NamefloodCfg* cfg = payload ? &payload->cfg.nameflood : NULL;
  49. const char* name;
  50. switch(cfg ? payload->mode : PayloadModeRandom) {
  51. case PayloadModeRandom:
  52. default:
  53. name = make_name(payload);
  54. break;
  55. case PayloadModeValue:
  56. name = cfg->name;
  57. break;
  58. }
  59. uint8_t name_len = strlen(name);
  60. uint8_t size = 12 + name_len;
  61. uint8_t* packet = malloc(size);
  62. uint8_t i = 0;
  63. packet[i++] = 2; // Size
  64. packet[i++] = 0x01; // AD Type (Flags)
  65. packet[i++] = 0x06; // Flags
  66. packet[i++] = name_len + 1; // Size
  67. packet[i++] = 0x09; // AD Type (Complete Local Name)
  68. memcpy(&packet[i], name, name_len); // Device Name
  69. i += name_len;
  70. packet[i++] = 3; // Size
  71. packet[i++] = 0x02; // AD Type (Incomplete Service UUID List)
  72. packet[i++] = 0x12; // Service UUID (Human Interface Device)
  73. packet[i++] = 0x18; // ...
  74. packet[i++] = 2; // Size
  75. packet[i++] = 0x0A; // AD Type (Tx Power Level)
  76. packet[i++] = 0x00; // 0dBm
  77. *_size = size;
  78. *_packet = packet;
  79. }
  80. enum {
  81. _ConfigExtraStart = ConfigExtraStart,
  82. ConfigName,
  83. ConfigInfoSettings,
  84. ConfigCOUNT,
  85. };
  86. static void config_callback(void* _ctx, uint32_t index) {
  87. Ctx* ctx = _ctx;
  88. scene_manager_set_scene_state(ctx->scene_manager, SceneConfig, index);
  89. switch(index) {
  90. case ConfigName:
  91. scene_manager_next_scene(ctx->scene_manager, SceneNamefloodName);
  92. break;
  93. case ConfigInfoSettings:
  94. break;
  95. default:
  96. ctx->fallback_config_enter(ctx, index);
  97. break;
  98. }
  99. }
  100. static void extra_config(Ctx* ctx) {
  101. Payload* payload = &ctx->attack->payload;
  102. NamefloodCfg* cfg = &payload->cfg.nameflood;
  103. VariableItemList* list = ctx->variable_item_list;
  104. VariableItem* item;
  105. item = variable_item_list_add(list, "Display Name", 0, NULL, NULL);
  106. variable_item_set_current_value_text(
  107. item, payload->mode == PayloadModeRandom ? "Random" : cfg->name);
  108. variable_item_list_add(list, "See in phone BT settings", 0, NULL, NULL);
  109. variable_item_list_set_enter_callback(list, config_callback, ctx);
  110. }
  111. static uint8_t config_count(const Payload* payload) {
  112. UNUSED(payload);
  113. return ConfigCOUNT - ConfigExtraStart - 1;
  114. }
  115. const Protocol protocol_nameflood = {
  116. .icon = &I_ble_spam,
  117. .get_name = get_name,
  118. .make_packet = make_packet,
  119. .extra_config = extra_config,
  120. .config_count = config_count,
  121. };
  122. static void name_callback(void* _ctx) {
  123. Ctx* ctx = _ctx;
  124. Payload* payload = &ctx->attack->payload;
  125. payload->mode = PayloadModeValue;
  126. scene_manager_previous_scene(ctx->scene_manager);
  127. }
  128. void scene_nameflood_name_on_enter(void* _ctx) {
  129. Ctx* ctx = _ctx;
  130. Payload* payload = &ctx->attack->payload;
  131. NamefloodCfg* cfg = &payload->cfg.nameflood;
  132. TextInput* text_input = ctx->text_input;
  133. text_input_set_header_text(text_input, "Press back for random");
  134. text_input_set_result_callback(
  135. text_input, name_callback, ctx, cfg->name, sizeof(cfg->name), true);
  136. text_input_set_minimum_length(text_input, 0);
  137. view_dispatcher_switch_to_view(ctx->view_dispatcher, ViewTextInput);
  138. }
  139. bool scene_nameflood_name_on_event(void* _ctx, SceneManagerEvent event) {
  140. Ctx* ctx = _ctx;
  141. Payload* payload = &ctx->attack->payload;
  142. if(event.type == SceneManagerEventTypeBack) {
  143. payload->mode = PayloadModeRandom;
  144. }
  145. return false;
  146. }
  147. void scene_nameflood_name_on_exit(void* _ctx) {
  148. Ctx* ctx = _ctx;
  149. text_input_reset(ctx->text_input);
  150. }