nameflood.c 5.0 KB

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