wifi_marauder_script.c 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528
  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_PROBE 60
  6. #define WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF 60
  7. #define WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON 60
  8. #define WIFI_MARAUDER_DEFAULT_ENABLE_LED true
  9. #define WIFI_MARAUDER_DEFAULT_SAVE_PCAP true
  10. WifiMarauderScript *wifi_marauder_script_alloc() {
  11. WifiMarauderScript *script = (WifiMarauderScript *) malloc(sizeof(WifiMarauderScript));
  12. if (script == NULL) {
  13. return NULL;
  14. }
  15. script->name = NULL;
  16. script->description = NULL;
  17. script->first_stage = NULL;
  18. script->enable_led = WIFI_MARAUDER_DEFAULT_ENABLE_LED;
  19. script->save_pcap = WIFI_MARAUDER_DEFAULT_SAVE_PCAP;
  20. script->repeat = 1;
  21. return script;
  22. }
  23. void _wifi_marauder_script_load_meta(WifiMarauderScript *script, cJSON *meta_section) {
  24. if (meta_section != NULL) {
  25. // Script description
  26. cJSON* description = cJSON_GetObjectItem(meta_section, "description");
  27. if (description != NULL) {
  28. script->description = strdup(description->valuestring);
  29. }
  30. // Enable LED
  31. cJSON* enable_led_json = cJSON_GetObjectItemCaseSensitive(meta_section, "enableLed");
  32. if (cJSON_IsBool(enable_led_json)) {
  33. script->enable_led = enable_led_json->valueint;
  34. }
  35. // Save PCAP
  36. cJSON* save_pcap_json = cJSON_GetObjectItemCaseSensitive(meta_section, "savePcap");
  37. if (cJSON_IsBool(save_pcap_json)) {
  38. script->save_pcap = save_pcap_json->valueint;
  39. }
  40. // Times the script will be repeated
  41. cJSON* repeat = cJSON_GetObjectItem(meta_section, "repeat");
  42. if (repeat != NULL) {
  43. script->repeat = repeat->valueint;
  44. }
  45. }
  46. if (script->description == NULL) {
  47. script->description = "My script";
  48. }
  49. }
  50. WifiMarauderScriptStageScan* _wifi_marauder_script_get_stage_scan(cJSON *stages) {
  51. cJSON* stage_scan = cJSON_GetObjectItem(stages, "scan");
  52. if (stage_scan == NULL) {
  53. return NULL;
  54. }
  55. cJSON* type = cJSON_GetObjectItem(stage_scan, "type");
  56. if (type == NULL) {
  57. return NULL;
  58. }
  59. WifiMarauderScriptScanType scan_type;
  60. if (strcmp(type->valuestring, "ap") == 0) {
  61. scan_type = WifiMarauderScriptScanTypeAp;
  62. } else if (strcmp(type->valuestring, "station") == 0) {
  63. scan_type = WifiMarauderScriptScanTypeStation;
  64. } else {
  65. return NULL;
  66. }
  67. cJSON* channel = cJSON_GetObjectItem(stage_scan, "channel");
  68. int scan_channel = channel != NULL ? (int)cJSON_GetNumberValue(channel) : 0;
  69. cJSON* timeout = cJSON_GetObjectItem(stage_scan, "timeout");
  70. int scan_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN;
  71. WifiMarauderScriptStageScan *scan_stage = (WifiMarauderScriptStageScan*) malloc(sizeof(WifiMarauderScriptStageScan));
  72. scan_stage->type = scan_type;
  73. scan_stage->channel = scan_channel;
  74. scan_stage->timeout = scan_timeout;
  75. return scan_stage;
  76. }
  77. WifiMarauderScriptStageSelect* _wifi_marauder_script_get_stage_select(cJSON *stages) {
  78. cJSON *select_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "select");
  79. if (select_stage_json == NULL) {
  80. return NULL;
  81. }
  82. cJSON *type_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "type");
  83. cJSON *filter_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "filter");
  84. cJSON *allow_repeat_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "allow_repeat");
  85. if (!cJSON_IsString(type_json) || !cJSON_IsString(filter_json)) {
  86. return NULL;
  87. }
  88. WifiMarauderScriptSelectType select_type;
  89. if (strcmp(type_json->valuestring, "ap") == 0) {
  90. select_type = WifiMarauderScriptSelectTypeAp;
  91. } else if (strcmp(type_json->valuestring, "station") == 0) {
  92. select_type = WifiMarauderScriptSelectTypeStation;
  93. } else if (strcmp(type_json->valuestring, "ssid") == 0) {
  94. select_type = WifiMarauderScriptSelectTypeSsid;
  95. } else {
  96. return NULL;
  97. }
  98. char *filter_str = strdup(filter_json->valuestring);
  99. WifiMarauderScriptStageSelect *stage_select = (WifiMarauderScriptStageSelect*) malloc(sizeof(WifiMarauderScriptStageSelect));
  100. stage_select->type = select_type;
  101. stage_select->filter = filter_str;
  102. stage_select->allow_repeat = cJSON_IsBool(allow_repeat_json) ? allow_repeat_json->valueint : true;
  103. return stage_select;
  104. }
  105. WifiMarauderScriptStageDeauth* _wifi_marauder_script_get_stage_deauth(cJSON *stages) {
  106. cJSON *deauth_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "deauth");
  107. if (deauth_stage_json == NULL) {
  108. return NULL;
  109. }
  110. cJSON* timeout = cJSON_GetObjectItem(deauth_stage_json, "timeout");
  111. int deauth_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH;
  112. WifiMarauderScriptStageDeauth *deauth_stage = (WifiMarauderScriptStageDeauth*) malloc(sizeof(WifiMarauderScriptStageDeauth));
  113. deauth_stage->timeout = deauth_timeout;
  114. return deauth_stage;
  115. }
  116. WifiMarauderScriptStageProbe* _wifi_marauder_script_get_stage_probe(cJSON *stages) {
  117. cJSON *probe_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "probe");
  118. if (probe_stage_json == NULL) {
  119. return NULL;
  120. }
  121. cJSON* timeout = cJSON_GetObjectItem(probe_stage_json, "timeout");
  122. int probe_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_PROBE;
  123. WifiMarauderScriptStageProbe *probe_stage = (WifiMarauderScriptStageProbe*) malloc(sizeof(WifiMarauderScriptStageProbe));
  124. probe_stage->timeout = probe_timeout;
  125. return probe_stage;
  126. }
  127. WifiMarauderScriptStageSniffRaw* _wifi_marauder_script_get_stage_sniff_raw(cJSON *stages) {
  128. cJSON* sniffraw_stage_json = cJSON_GetObjectItem(stages, "sniffraw");
  129. if (sniffraw_stage_json == NULL) {
  130. return NULL;
  131. }
  132. cJSON* timeout_json = cJSON_GetObjectItem(sniffraw_stage_json, "timeout");
  133. int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
  134. WifiMarauderScriptStageSniffRaw *sniff_raw_stage = (WifiMarauderScriptStageSniffRaw*) malloc(sizeof(WifiMarauderScriptStageSniffRaw));
  135. sniff_raw_stage->timeout = timeout;
  136. return sniff_raw_stage;
  137. }
  138. WifiMarauderScriptStageSniffBeacon* _wifi_marauder_script_get_stage_sniff_beacon(cJSON *stages) {
  139. cJSON* sniffbeacon_stage_json = cJSON_GetObjectItem(stages, "sniffbeacon");
  140. if (sniffbeacon_stage_json == NULL) {
  141. return NULL;
  142. }
  143. cJSON* timeout_json = cJSON_GetObjectItem(sniffbeacon_stage_json, "timeout");
  144. int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
  145. WifiMarauderScriptStageSniffBeacon *sniff_beacon_stage = (WifiMarauderScriptStageSniffBeacon*) malloc(sizeof(WifiMarauderScriptStageSniffBeacon));
  146. sniff_beacon_stage->timeout = timeout;
  147. return sniff_beacon_stage;
  148. }
  149. WifiMarauderScriptStageSniffDeauth* _wifi_marauder_script_get_stage_sniff_deauth(cJSON *stages) {
  150. cJSON* sniffdeauth_stage_json = cJSON_GetObjectItem(stages, "sniffdeauth");
  151. if (sniffdeauth_stage_json == NULL) {
  152. return NULL;
  153. }
  154. cJSON* timeout_json = cJSON_GetObjectItem(sniffdeauth_stage_json, "timeout");
  155. int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
  156. WifiMarauderScriptStageSniffDeauth *sniff_deauth_stage = (WifiMarauderScriptStageSniffDeauth*) malloc(sizeof(WifiMarauderScriptStageSniffDeauth));
  157. sniff_deauth_stage->timeout = timeout;
  158. return sniff_deauth_stage;
  159. }
  160. WifiMarauderScriptStageSniffEsp* _wifi_marauder_script_get_stage_sniff_esp(cJSON *stages) {
  161. cJSON* sniffesp_stage_json = cJSON_GetObjectItem(stages, "sniffesp");
  162. if (sniffesp_stage_json == NULL) {
  163. return NULL;
  164. }
  165. cJSON* timeout_json = cJSON_GetObjectItem(sniffesp_stage_json, "timeout");
  166. int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
  167. WifiMarauderScriptStageSniffEsp *sniff_esp_stage = (WifiMarauderScriptStageSniffEsp*) malloc(sizeof(WifiMarauderScriptStageSniffEsp));
  168. sniff_esp_stage->timeout = timeout;
  169. return sniff_esp_stage;
  170. }
  171. WifiMarauderScriptStageSniffPmkid* _wifi_marauder_script_get_stage_sniff_pmkid(cJSON *stages) {
  172. cJSON* sniffpmkid_stage_json = cJSON_GetObjectItem(stages, "sniffpmkid");
  173. if (sniffpmkid_stage_json == NULL) {
  174. return NULL;
  175. }
  176. cJSON* channel_json = cJSON_GetObjectItem(sniffpmkid_stage_json, "channel");
  177. int channel = channel_json != NULL ? (int)cJSON_GetNumberValue(channel_json) : 0;
  178. cJSON* timeout_json = cJSON_GetObjectItem(sniffpmkid_stage_json, "timeout");
  179. int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
  180. cJSON* force_deauth_json = cJSON_GetObjectItemCaseSensitive(sniffpmkid_stage_json, "forceDeauth");
  181. bool force_deauth = cJSON_IsBool(force_deauth_json) ? force_deauth_json->valueint : true;
  182. WifiMarauderScriptStageSniffPmkid *sniff_pmkid_stage = (WifiMarauderScriptStageSniffPmkid*) malloc(sizeof(WifiMarauderScriptStageSniffPmkid));
  183. sniff_pmkid_stage->channel = channel;
  184. sniff_pmkid_stage->timeout = timeout;
  185. sniff_pmkid_stage->force_deauth = force_deauth;
  186. return sniff_pmkid_stage;
  187. }
  188. WifiMarauderScriptStageSniffPwn* _wifi_marauder_script_get_stage_sniff_pwn(cJSON *stages) {
  189. cJSON* sniffpwn_stage_json = cJSON_GetObjectItem(stages, "sniffpwn");
  190. if (sniffpwn_stage_json == NULL) {
  191. return NULL;
  192. }
  193. cJSON* timeout_json = cJSON_GetObjectItem(sniffpwn_stage_json, "timeout");
  194. int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
  195. WifiMarauderScriptStageSniffPwn *sniff_pwn_stage = (WifiMarauderScriptStageSniffPwn*) malloc(sizeof(WifiMarauderScriptStageSniffPwn));
  196. sniff_pwn_stage->timeout = timeout;
  197. return sniff_pwn_stage;
  198. }
  199. WifiMarauderScriptStageBeaconList* _wifi_marauder_script_get_stage_beacon_list(cJSON *stages) {
  200. cJSON* stage_beaconlist = cJSON_GetObjectItem(stages, "beaconlist");
  201. if (stage_beaconlist == NULL) {
  202. return NULL;
  203. }
  204. WifiMarauderScriptStageBeaconList *beaconlist_stage = (WifiMarauderScriptStageBeaconList*) malloc(sizeof(WifiMarauderScriptStageBeaconList));
  205. if (beaconlist_stage == NULL) {
  206. return NULL;
  207. }
  208. cJSON* ssids = cJSON_GetObjectItem(stage_beaconlist, "ssids");
  209. if (ssids == NULL) {
  210. return NULL;
  211. }
  212. // SSID count
  213. int ssid_count = cJSON_GetArraySize(ssids);
  214. if (ssid_count == 0) {
  215. return NULL;
  216. }
  217. beaconlist_stage->ssid_count = ssid_count;
  218. // SSIDs
  219. beaconlist_stage->ssids = (char**) malloc(sizeof(char*) * ssid_count);
  220. if (beaconlist_stage->ssids == NULL) {
  221. return NULL;
  222. }
  223. for (int i = 0; i < ssid_count; i++) {
  224. cJSON* ssid = cJSON_GetArrayItem(ssids, i);
  225. if (ssid == NULL) {
  226. continue;
  227. }
  228. char* ssid_string = cJSON_GetStringValue(ssid);
  229. if (ssid_string == NULL) {
  230. continue;
  231. }
  232. beaconlist_stage->ssids[i] = (char*) malloc(sizeof(char) * (strlen(ssid_string) + 1));
  233. strcpy(beaconlist_stage->ssids[i], ssid_string);
  234. }
  235. // Timeout
  236. cJSON* timeout = cJSON_GetObjectItem(stage_beaconlist, "timeout");
  237. beaconlist_stage->timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) : WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON;
  238. return beaconlist_stage;
  239. }
  240. WifiMarauderScriptStage* _wifi_marauder_script_create_stage(WifiMarauderScriptStageType type, void* stage_data) {
  241. WifiMarauderScriptStage* stage = (WifiMarauderScriptStage*) malloc(sizeof(WifiMarauderScriptStage));
  242. stage->type = type;
  243. stage->stage = stage_data;
  244. stage->next_stage = NULL;
  245. return stage;
  246. }
  247. void _wifi_marauder_script_add_stage(WifiMarauderScript *script, WifiMarauderScriptStage *stage, WifiMarauderScriptStage **prev_stage) {
  248. if (*prev_stage != NULL) {
  249. (*prev_stage)->next_stage = stage;
  250. } else {
  251. script->first_stage = stage;
  252. }
  253. *prev_stage = stage;
  254. }
  255. void _wifi_marauder_script_load_stages(WifiMarauderScript *script, cJSON *stages) {
  256. WifiMarauderScriptStage *prev_stage = NULL;
  257. // Scan stage
  258. WifiMarauderScriptStageScan *stage_scan = _wifi_marauder_script_get_stage_scan(stages);
  259. if (stage_scan != NULL) {
  260. _wifi_marauder_script_add_stage(
  261. script,
  262. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeScan, stage_scan),
  263. &prev_stage
  264. );
  265. }
  266. // Select stage
  267. WifiMarauderScriptStageSelect *stage_select = _wifi_marauder_script_get_stage_select(stages);
  268. if (stage_select != NULL) {
  269. _wifi_marauder_script_add_stage(
  270. script,
  271. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSelect, stage_select),
  272. &prev_stage
  273. );
  274. }
  275. // Deauth stage
  276. WifiMarauderScriptStageDeauth *stage_deauth = _wifi_marauder_script_get_stage_deauth(stages);
  277. if (stage_deauth != NULL) {
  278. _wifi_marauder_script_add_stage(
  279. script,
  280. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeDeauth, stage_deauth),
  281. &prev_stage
  282. );
  283. }
  284. // Probe stage
  285. WifiMarauderScriptStageProbe *stage_probe = _wifi_marauder_script_get_stage_probe(stages);
  286. if (stage_probe != NULL) {
  287. _wifi_marauder_script_add_stage(
  288. script,
  289. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeProbe, stage_probe),
  290. &prev_stage
  291. );
  292. }
  293. // Sniff raw stage
  294. WifiMarauderScriptStageSniffRaw *sniff_raw = _wifi_marauder_script_get_stage_sniff_raw(stages);
  295. if (sniff_raw != NULL) {
  296. _wifi_marauder_script_add_stage(
  297. script,
  298. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSniffRaw, sniff_raw),
  299. &prev_stage
  300. );
  301. }
  302. // Sniff beacon stage
  303. WifiMarauderScriptStageSniffBeacon *sniff_beacon = _wifi_marauder_script_get_stage_sniff_beacon(stages);
  304. if (sniff_beacon != NULL) {
  305. _wifi_marauder_script_add_stage(
  306. script,
  307. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSniffBeacon, sniff_beacon),
  308. &prev_stage
  309. );
  310. }
  311. // Sniff deauth stage
  312. WifiMarauderScriptStageSniffDeauth *sniff_deauth = _wifi_marauder_script_get_stage_sniff_deauth(stages);
  313. if (sniff_deauth != NULL) {
  314. _wifi_marauder_script_add_stage(
  315. script,
  316. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSniffDeauth, sniff_deauth),
  317. &prev_stage
  318. );
  319. }
  320. // Sniff esp stage
  321. WifiMarauderScriptStageSniffEsp *sniff_esp = _wifi_marauder_script_get_stage_sniff_esp(stages);
  322. if (sniff_esp != NULL) {
  323. _wifi_marauder_script_add_stage(
  324. script,
  325. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSniffEsp, sniff_esp),
  326. &prev_stage
  327. );
  328. }
  329. // Sniff PMKID stage
  330. WifiMarauderScriptStageSniffPmkid *sniff_pmkid = _wifi_marauder_script_get_stage_sniff_pmkid(stages);
  331. if (sniff_pmkid != NULL) {
  332. _wifi_marauder_script_add_stage(
  333. script,
  334. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSniffPmkid, sniff_pmkid),
  335. &prev_stage
  336. );
  337. }
  338. // Sniff pwn stage
  339. WifiMarauderScriptStageSniffPwn *sniff_pwn = _wifi_marauder_script_get_stage_sniff_pwn(stages);
  340. if (sniff_pwn != NULL) {
  341. _wifi_marauder_script_add_stage(
  342. script,
  343. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeSniffPwn, sniff_pwn),
  344. &prev_stage
  345. );
  346. }
  347. // Beacon List stage
  348. WifiMarauderScriptStageBeaconList *stage_beacon_list = _wifi_marauder_script_get_stage_beacon_list(stages);
  349. if (stage_beacon_list != NULL) {
  350. _wifi_marauder_script_add_stage(
  351. script,
  352. _wifi_marauder_script_create_stage(WifiMarauderScriptStageTypeBeaconList, stage_beacon_list),
  353. &prev_stage
  354. );
  355. }
  356. }
  357. WifiMarauderScript *wifi_marauder_script_parse_raw(const char* json_raw) {
  358. WifiMarauderScript *script = wifi_marauder_script_alloc();
  359. if (script == NULL) {
  360. return NULL;
  361. }
  362. cJSON* json = cJSON_Parse(json_raw);
  363. if (json == NULL) {
  364. return NULL;
  365. }
  366. cJSON* meta = cJSON_GetObjectItem(json, "meta");
  367. _wifi_marauder_script_load_meta(script, meta);
  368. cJSON* stages = cJSON_GetObjectItem(json, "stages");
  369. _wifi_marauder_script_load_stages(script, stages);
  370. return script;
  371. }
  372. WifiMarauderScript *wifi_marauder_script_parse_file(const char* file_path, Storage* storage) {
  373. WifiMarauderScript *script = NULL;
  374. File* script_file = storage_file_alloc(storage);
  375. if (storage_file_open(script_file, file_path, FSAM_READ, FSOM_OPEN_EXISTING)) {
  376. uint32_t file_size = storage_file_size(script_file);
  377. char* json_buffer = (char*)malloc(file_size + 1);
  378. uint16_t bytes_read = storage_file_read(script_file, json_buffer, file_size);
  379. json_buffer[bytes_read] = '\0';
  380. script = wifi_marauder_script_parse_raw(json_buffer);
  381. if (script != NULL) {
  382. // Set script name
  383. FuriString* script_name = furi_string_alloc();
  384. path_extract_filename_no_ext(file_path, script_name);
  385. script->name = strdup(furi_string_get_cstr(script_name));
  386. furi_string_free(script_name);
  387. }
  388. storage_file_close(script_file);
  389. }
  390. storage_file_free(script_file);
  391. return script;
  392. }
  393. WifiMarauderScriptStage* wifi_marauder_script_get_stage(WifiMarauderScript* script, WifiMarauderScriptStageType stage_type) {
  394. if (script == NULL) {
  395. return NULL;
  396. }
  397. WifiMarauderScriptStage* current_stage = script->first_stage;
  398. while (current_stage != NULL) {
  399. if (current_stage->type == stage_type) {
  400. return current_stage;
  401. }
  402. current_stage = current_stage->next_stage;
  403. }
  404. return NULL;
  405. }
  406. void wifi_marauder_script_free(WifiMarauderScript *script) {
  407. if (script == NULL) {
  408. return;
  409. }
  410. WifiMarauderScriptStage *current_stage = script->first_stage;
  411. while (current_stage != NULL) {
  412. WifiMarauderScriptStage *next_stage = current_stage->next_stage;
  413. switch (current_stage->type) {
  414. case WifiMarauderScriptStageTypeScan:
  415. free(current_stage->stage);
  416. break;
  417. case WifiMarauderScriptStageTypeSelect:
  418. free(((WifiMarauderScriptStageSelect *) current_stage->stage)->filter);
  419. free(current_stage->stage);
  420. break;
  421. case WifiMarauderScriptStageTypeDeauth:
  422. free(current_stage->stage);
  423. break;
  424. case WifiMarauderScriptStageTypeProbe:
  425. free(current_stage->stage);
  426. break;
  427. case WifiMarauderScriptStageTypeSniffRaw:
  428. free(current_stage->stage);
  429. break;
  430. case WifiMarauderScriptStageTypeSniffBeacon:
  431. free(current_stage->stage);
  432. break;
  433. case WifiMarauderScriptStageTypeSniffDeauth:
  434. free(current_stage->stage);
  435. break;
  436. case WifiMarauderScriptStageTypeSniffEsp:
  437. free(current_stage->stage);
  438. break;
  439. case WifiMarauderScriptStageTypeSniffPmkid:
  440. free(current_stage->stage);
  441. break;
  442. case WifiMarauderScriptStageTypeSniffPwn:
  443. free(current_stage->stage);
  444. break;
  445. case WifiMarauderScriptStageTypeBeaconList:
  446. for (int i = 0; i < ((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssid_count; i++) {
  447. free(((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssids[i]);
  448. }
  449. free(((WifiMarauderScriptStageBeaconList *) current_stage->stage)->ssids);
  450. free(current_stage->stage);
  451. break;
  452. }
  453. free(current_stage);
  454. current_stage = next_stage;
  455. }
  456. free(script->name);
  457. free(script->description);
  458. free(script);
  459. }