wifi_marauder_script.c 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290
  1. #include "../wifi_marauder_app_i.h"
  2. #include "wifi_marauder_script.h"
  3. #define WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN 15
  4. #define WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH 30
  5. #define WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON 60
  6. WifiMarauderScript *wifi_marauder_script_alloc() {
  7. WifiMarauderScript *script = (WifiMarauderScript *) malloc(sizeof(WifiMarauderScript));
  8. if (script == NULL) {
  9. return NULL;
  10. }
  11. script->description = NULL;
  12. script->first_stage = NULL;
  13. script->repeat = 1;
  14. return script;
  15. }
  16. void _wifi_marauder_script_load_meta(WifiMarauderScript *script, cJSON *meta_section) {
  17. if (meta_section != NULL) {
  18. // Script description
  19. cJSON* description = cJSON_GetObjectItem(meta_section, "description");
  20. if (description != NULL) {
  21. script->description = strdup(description->valuestring);
  22. }
  23. // Times the script will be repeated
  24. cJSON* repeat = cJSON_GetObjectItem(meta_section, "repeat");
  25. if (repeat != NULL) {
  26. script->repeat = repeat->valueint;
  27. }
  28. }
  29. if (script->description == NULL) {
  30. script->description = "My script";
  31. }
  32. }
  33. WifiMarauderScriptStageScan* _wifi_marauder_script_get_stage_scan(cJSON *stages) {
  34. cJSON* stage_scan = cJSON_GetObjectItem(stages, "scan");
  35. if (stage_scan == NULL) {
  36. return NULL;
  37. }
  38. cJSON* type = cJSON_GetObjectItem(stage_scan, "type");
  39. if (type == NULL) {
  40. return NULL;
  41. }
  42. WifiMarauderScriptScanType scan_type;
  43. if (strcmp(type->valuestring, "ap") == 0) {
  44. scan_type = WifiMarauderScriptScanTypeAp;
  45. } else if (strcmp(type->valuestring, "station") == 0) {
  46. scan_type = WifiMarauderScriptScanTypeStation;
  47. } else {
  48. return NULL;
  49. }
  50. cJSON* channel = cJSON_GetObjectItem(stage_scan, "channel");
  51. int scan_channel = channel != NULL ? (int)cJSON_GetNumberValue(channel) : 0;
  52. cJSON* timeout = cJSON_GetObjectItem(stage_scan, "timeout");
  53. int scan_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN;
  54. WifiMarauderScriptStageScan *scan_stage = (WifiMarauderScriptStageScan*) malloc(sizeof(WifiMarauderScriptStageScan));
  55. scan_stage->type = scan_type;
  56. scan_stage->channel = scan_channel;
  57. scan_stage->timeout = scan_timeout;
  58. return scan_stage;
  59. }
  60. WifiMarauderScriptStageSelect* _wifi_marauder_script_get_stage_select(cJSON *stages) {
  61. cJSON *select_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "select");
  62. if (select_stage_json == NULL) {
  63. return NULL;
  64. }
  65. cJSON *type_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "type");
  66. cJSON *filter_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "filter");
  67. cJSON *allow_repeat_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "allow_repeat");
  68. if (!cJSON_IsString(type_json) || !cJSON_IsString(filter_json)) {
  69. return NULL;
  70. }
  71. WifiMarauderScriptSelectType select_type;
  72. if (strcmp(type_json->valuestring, "ap") == 0) {
  73. select_type = WifiMarauderScriptSelectTypeAp;
  74. } else if (strcmp(type_json->valuestring, "station") == 0) {
  75. select_type = WifiMarauderScriptSelectTypeStation;
  76. } else if (strcmp(type_json->valuestring, "ssid") == 0) {
  77. select_type = WifiMarauderScriptSelectTypeSsid;
  78. } else {
  79. return NULL;
  80. }
  81. char *filter_str = strdup(filter_json->valuestring);
  82. WifiMarauderScriptStageSelect *stage_select = (WifiMarauderScriptStageSelect*) malloc(sizeof(WifiMarauderScriptStageSelect));
  83. stage_select->type = select_type;
  84. stage_select->filter = filter_str;
  85. stage_select->allow_repeat = cJSON_IsBool(allow_repeat_json) ? allow_repeat_json->valueint : true;
  86. return stage_select;
  87. }
  88. WifiMarauderScriptStageDeauth* _wifi_marauder_script_get_stage_deauth(cJSON *stages) {
  89. cJSON *deauth_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "deauth");
  90. if (deauth_stage_json == NULL) {
  91. return NULL;
  92. }
  93. cJSON* timeout = cJSON_GetObjectItem(deauth_stage_json, "timeout");
  94. int deauth_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH;
  95. WifiMarauderScriptStageDeauth *deauth_stage = (WifiMarauderScriptStageDeauth*) malloc(sizeof(WifiMarauderScriptStageDeauth));
  96. deauth_stage->timeout = deauth_timeout;
  97. return deauth_stage;
  98. }
  99. WifiMarauderScriptStageBeaconList* _wifi_marauder_script_get_stage_beacon_list(cJSON *stages) {
  100. cJSON* stage_beaconlist = cJSON_GetObjectItem(stages, "beaconlist");
  101. if (stage_beaconlist == NULL) {
  102. return NULL;
  103. }
  104. WifiMarauderScriptStageBeaconList *beaconlist_stage = (WifiMarauderScriptStageBeaconList*) malloc(sizeof(WifiMarauderScriptStageBeaconList));
  105. if (beaconlist_stage == NULL) {
  106. return NULL;
  107. }
  108. cJSON* ssids = cJSON_GetObjectItem(stage_beaconlist, "ssids");
  109. if (ssids == NULL) {
  110. return NULL;
  111. }
  112. // SSID count
  113. int ssid_count = cJSON_GetArraySize(ssids);
  114. if (ssid_count == 0) {
  115. return NULL;
  116. }
  117. beaconlist_stage->ssid_count = ssid_count;
  118. // SSIDs
  119. beaconlist_stage->ssids = (char**) malloc(sizeof(char*) * ssid_count);
  120. if (beaconlist_stage->ssids == NULL) {
  121. return NULL;
  122. }
  123. for (int i = 0; i < ssid_count; i++) {
  124. cJSON* ssid = cJSON_GetArrayItem(ssids, i);
  125. if (ssid == NULL) {
  126. continue;
  127. }
  128. char* ssid_string = cJSON_GetStringValue(ssid);
  129. if (ssid_string == NULL) {
  130. continue;
  131. }
  132. beaconlist_stage->ssids[i] = (char*) malloc(sizeof(char) * (strlen(ssid_string) + 1));
  133. strcpy(beaconlist_stage->ssids[i], ssid_string);
  134. }
  135. // Timeout
  136. cJSON* timeout = cJSON_GetObjectItem(stage_beaconlist, "timeout");
  137. beaconlist_stage->timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON;
  138. return beaconlist_stage;
  139. }
  140. WifiMarauderScriptStage* _wifi_marauder_script_create_stage(WifiMarauderScriptStageType type, void* stage_data) {
  141. WifiMarauderScriptStage* stage = (WifiMarauderScriptStage*) malloc(sizeof(WifiMarauderScriptStage));
  142. stage->type = type;
  143. stage->stage = stage_data;
  144. stage->next_stage = NULL;
  145. return stage;
  146. }
  147. void _wifi_marauder_script_add_stage(WifiMarauderScript *script, WifiMarauderScriptStage *stage, WifiMarauderScriptStage **prev_stage) {
  148. if (*prev_stage != NULL) {
  149. (*prev_stage)->next_stage = stage;
  150. } else {
  151. script->first_stage = stage;
  152. }
  153. *prev_stage = stage;
  154. }
  155. void _wifi_marauder_script_load_stages(WifiMarauderScript *script, cJSON *stages) {
  156. WifiMarauderScriptStage *prev_stage = NULL;
  157. // Scan stage
  158. WifiMarauderScriptStageScan *stage_scan = _wifi_marauder_script_get_stage_scan(stages);
  159. if (stage_scan != NULL) {
  160. _wifi_marauder_script_add_stage(
  161. script,
  162. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeScan, stage_scan),
  163. &prev_stage
  164. );
  165. }
  166. // Select stage
  167. WifiMarauderScriptStageSelect *stage_select = _wifi_marauder_script_get_stage_select(stages);
  168. if (stage_select != NULL) {
  169. _wifi_marauder_script_add_stage(
  170. script,
  171. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSelect, stage_select),
  172. &prev_stage
  173. );
  174. }
  175. // Deauth stage
  176. WifiMarauderScriptStageDeauth *stage_deauth = _wifi_marauder_script_get_stage_deauth(stages);
  177. if (stage_deauth != NULL) {
  178. _wifi_marauder_script_add_stage(
  179. script,
  180. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeDeauth, stage_deauth),
  181. &prev_stage
  182. );
  183. }
  184. // Beacon List stage
  185. WifiMarauderScriptStageBeaconList *stage_beacon_list = _wifi_marauder_script_get_stage_beacon_list(stages);
  186. if (stage_beacon_list != NULL) {
  187. _wifi_marauder_script_add_stage(
  188. script,
  189. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeBeaconList, stage_beacon_list),
  190. &prev_stage
  191. );
  192. }
  193. }
  194. WifiMarauderScript *wifi_marauder_script_parse_raw(const char* json_raw) {
  195. WifiMarauderScript *script = wifi_marauder_script_alloc();
  196. if (script == NULL) {
  197. return NULL;
  198. }
  199. cJSON* json = cJSON_Parse(json_raw);
  200. if (json == NULL) {
  201. return NULL;
  202. }
  203. cJSON* meta = cJSON_GetObjectItem(json, "meta");
  204. _wifi_marauder_script_load_meta(script, meta);
  205. cJSON* stages = cJSON_GetObjectItem(json, "stages");
  206. _wifi_marauder_script_load_stages(script, stages);
  207. return script;
  208. }
  209. WifiMarauderScript *wifi_marauder_script_parse_file(const char* file_path, Storage* storage) {
  210. WifiMarauderScript *script = NULL;
  211. File* script_file = storage_file_alloc(storage);
  212. if (storage_file_open(script_file, file_path, FSAM_READ, FSOM_OPEN_EXISTING)) {
  213. uint32_t file_size = storage_file_size(script_file);
  214. char* json_buffer = (char*)malloc(file_size + 1);
  215. uint16_t bytes_read = storage_file_read(script_file, json_buffer, file_size);
  216. json_buffer[bytes_read] = '\0';
  217. script = wifi_marauder_script_parse_raw(json_buffer);
  218. storage_file_close(script_file);
  219. }
  220. storage_file_free(script_file);
  221. return script;
  222. }
  223. void wifi_marauder_script_free(WifiMarauderScript *script) {
  224. if (script == NULL) {
  225. return;
  226. }
  227. WifiMarauderScriptStage *current_stage = script->first_stage;
  228. while (current_stage != NULL) {
  229. WifiMarauderScriptStage *next_stage = current_stage->next_stage;
  230. switch (current_stage->type) {
  231. case WifiMarauderScriptStageTypeScan:
  232. free(current_stage->stage);
  233. break;
  234. case WifiMarauderScriptStageTypeSelect:
  235. free(((WifiMarauderScriptStageSelect *) current_stage->stage)->filter);
  236. free(current_stage->stage);
  237. break;
  238. case WifiMarauderScriptStageTypeDeauth:
  239. free(current_stage->stage);
  240. break;
  241. case WifiMarauderScriptStageTypeSniffPmkid:
  242. free(current_stage->stage);
  243. break;
  244. case WifiMarauderScriptStageTypeBeaconList:
  245. for (int i = 0; i < ((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssid_count; i++) {
  246. free(((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssids[i]);
  247. }
  248. free(((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssids);
  249. free(current_stage->stage);
  250. break;
  251. }
  252. free(current_stage);
  253. current_stage = next_stage;
  254. }
  255. free(script->description);
  256. free(script);
  257. }