wifi_marauder_script.c 23 KB

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