| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963 |
- #include "../wifi_marauder_app_i.h"
- #include "wifi_marauder_script.h"
- WifiMarauderScript* wifi_marauder_script_alloc() {
- WifiMarauderScript* script = (WifiMarauderScript*)malloc(sizeof(WifiMarauderScript));
- if(script == NULL) {
- return NULL;
- }
- script->name = NULL;
- script->description = NULL;
- script->first_stage = NULL;
- script->last_stage = NULL;
- script->enable_led = WifiMarauderScriptBooleanUndefined;
- script->save_pcap = WifiMarauderScriptBooleanUndefined;
- script->repeat = 1;
- return script;
- }
- WifiMarauderScript* wifi_marauder_script_create(const char* script_name) {
- WifiMarauderScript* script = wifi_marauder_script_alloc();
- script->name = strdup(script_name);
- return script;
- }
- void _wifi_marauder_script_load_meta(WifiMarauderScript* script, cJSON* meta_section) {
- if(meta_section != NULL) {
- // Script description
- cJSON* description = cJSON_GetObjectItem(meta_section, "description");
- if(description != NULL) {
- script->description = strdup(description->valuestring);
- }
- // Enable LED
- cJSON* enable_led_json = cJSON_GetObjectItem(meta_section, "enableLed");
- if(cJSON_IsBool(enable_led_json)) {
- script->enable_led = enable_led_json->valueint;
- }
- // Save PCAP
- cJSON* save_pcap_json = cJSON_GetObjectItem(meta_section, "savePcap");
- if(cJSON_IsBool(save_pcap_json)) {
- script->save_pcap = save_pcap_json->valueint;
- }
- // Times the script will be repeated
- cJSON* repeat = cJSON_GetObjectItem(meta_section, "repeat");
- if(repeat != NULL) {
- script->repeat = repeat->valueint;
- }
- }
- if(script->description == NULL) {
- script->description = strdup("My script");
- }
- }
- WifiMarauderScriptStageScan* _wifi_marauder_script_get_stage_scan(cJSON* stages) {
- cJSON* stage_scan = cJSON_GetObjectItem(stages, "scan");
- if(stage_scan == NULL) {
- return NULL;
- }
- cJSON* type = cJSON_GetObjectItem(stage_scan, "type");
- if(type == NULL) {
- return NULL;
- }
- WifiMarauderScriptScanType scan_type;
- if(strcmp(type->valuestring, "ap") == 0) {
- scan_type = WifiMarauderScriptScanTypeAp;
- } else if(strcmp(type->valuestring, "station") == 0) {
- scan_type = WifiMarauderScriptScanTypeStation;
- } else {
- return NULL;
- }
- cJSON* channel = cJSON_GetObjectItem(stage_scan, "channel");
- int scan_channel = channel != NULL ? (int)cJSON_GetNumberValue(channel) : 0;
- cJSON* timeout = cJSON_GetObjectItem(stage_scan, "timeout");
- int scan_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_SCAN;
- WifiMarauderScriptStageScan* scan_stage =
- (WifiMarauderScriptStageScan*)malloc(sizeof(WifiMarauderScriptStageScan));
- scan_stage->type = scan_type;
- scan_stage->channel = scan_channel;
- scan_stage->timeout = scan_timeout;
- return scan_stage;
- }
- WifiMarauderScriptStageSelect* _wifi_marauder_script_get_stage_select(cJSON* stages) {
- cJSON* select_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "select");
- if(select_stage_json == NULL) {
- return NULL;
- }
- cJSON* type_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "type");
- cJSON* filter_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "filter");
- cJSON* indexes_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "indexes");
- cJSON* allow_repeat_json = cJSON_GetObjectItemCaseSensitive(select_stage_json, "allow_repeat");
- if(!cJSON_IsString(type_json)) {
- return NULL;
- }
- WifiMarauderScriptSelectType select_type;
- if(strcmp(type_json->valuestring, "ap") == 0) {
- select_type = WifiMarauderScriptSelectTypeAp;
- } else if(strcmp(type_json->valuestring, "station") == 0) {
- select_type = WifiMarauderScriptSelectTypeStation;
- } else if(strcmp(type_json->valuestring, "ssid") == 0) {
- select_type = WifiMarauderScriptSelectTypeSsid;
- } else {
- return NULL;
- }
- char* filter_str = cJSON_IsString(filter_json) ? strdup(filter_json->valuestring) : NULL;
- WifiMarauderScriptStageSelect* stage_select =
- (WifiMarauderScriptStageSelect*)malloc(sizeof(WifiMarauderScriptStageSelect));
- stage_select->type = select_type;
- stage_select->allow_repeat = cJSON_IsBool(allow_repeat_json) ? allow_repeat_json->valueint :
- true;
- stage_select->filter = filter_str;
- if(cJSON_IsArray(indexes_json)) {
- int indexes_size = cJSON_GetArraySize(indexes_json);
- int* indexes = (int*)malloc(indexes_size * sizeof(int));
- for(int i = 0; i < indexes_size; i++) {
- cJSON* index_item = cJSON_GetArrayItem(indexes_json, i);
- if(cJSON_IsNumber(index_item)) {
- indexes[i] = index_item->valueint;
- }
- }
- stage_select->indexes = indexes;
- stage_select->index_count = indexes_size;
- } else {
- stage_select->indexes = NULL;
- stage_select->index_count = 0;
- }
- return stage_select;
- }
- WifiMarauderScriptStageDeauth* _wifi_marauder_script_get_stage_deauth(cJSON* stages) {
- cJSON* deauth_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "deauth");
- if(deauth_stage_json == NULL) {
- return NULL;
- }
- cJSON* timeout = cJSON_GetObjectItem(deauth_stage_json, "timeout");
- int deauth_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_DEAUTH;
- WifiMarauderScriptStageDeauth* deauth_stage =
- (WifiMarauderScriptStageDeauth*)malloc(sizeof(WifiMarauderScriptStageDeauth));
- deauth_stage->timeout = deauth_timeout;
- return deauth_stage;
- }
- WifiMarauderScriptStageProbe* _wifi_marauder_script_get_stage_probe(cJSON* stages) {
- cJSON* probe_stage_json = cJSON_GetObjectItemCaseSensitive(stages, "probe");
- if(probe_stage_json == NULL) {
- return NULL;
- }
- cJSON* timeout = cJSON_GetObjectItem(probe_stage_json, "timeout");
- int probe_timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_PROBE;
- WifiMarauderScriptStageProbe* probe_stage =
- (WifiMarauderScriptStageProbe*)malloc(sizeof(WifiMarauderScriptStageProbe));
- probe_stage->timeout = probe_timeout;
- return probe_stage;
- }
- WifiMarauderScriptStageSniffRaw* _wifi_marauder_script_get_stage_sniff_raw(cJSON* stages) {
- cJSON* sniffraw_stage_json = cJSON_GetObjectItem(stages, "sniffraw");
- if(sniffraw_stage_json == NULL) {
- return NULL;
- }
- cJSON* timeout_json = cJSON_GetObjectItem(sniffraw_stage_json, "timeout");
- int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
- WifiMarauderScriptStageSniffRaw* sniff_raw_stage =
- (WifiMarauderScriptStageSniffRaw*)malloc(sizeof(WifiMarauderScriptStageSniffRaw));
- sniff_raw_stage->timeout = timeout;
- return sniff_raw_stage;
- }
- WifiMarauderScriptStageSniffBeacon* _wifi_marauder_script_get_stage_sniff_beacon(cJSON* stages) {
- cJSON* sniffbeacon_stage_json = cJSON_GetObjectItem(stages, "sniffbeacon");
- if(sniffbeacon_stage_json == NULL) {
- return NULL;
- }
- cJSON* timeout_json = cJSON_GetObjectItem(sniffbeacon_stage_json, "timeout");
- int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
- WifiMarauderScriptStageSniffBeacon* sniff_beacon_stage =
- (WifiMarauderScriptStageSniffBeacon*)malloc(sizeof(WifiMarauderScriptStageSniffBeacon));
- sniff_beacon_stage->timeout = timeout;
- return sniff_beacon_stage;
- }
- WifiMarauderScriptStageSniffDeauth* _wifi_marauder_script_get_stage_sniff_deauth(cJSON* stages) {
- cJSON* sniffdeauth_stage_json = cJSON_GetObjectItem(stages, "sniffdeauth");
- if(sniffdeauth_stage_json == NULL) {
- return NULL;
- }
- cJSON* timeout_json = cJSON_GetObjectItem(sniffdeauth_stage_json, "timeout");
- int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
- WifiMarauderScriptStageSniffDeauth* sniff_deauth_stage =
- (WifiMarauderScriptStageSniffDeauth*)malloc(sizeof(WifiMarauderScriptStageSniffDeauth));
- sniff_deauth_stage->timeout = timeout;
- return sniff_deauth_stage;
- }
- WifiMarauderScriptStageSniffEsp* _wifi_marauder_script_get_stage_sniff_esp(cJSON* stages) {
- cJSON* sniffesp_stage_json = cJSON_GetObjectItem(stages, "sniffesp");
- if(sniffesp_stage_json == NULL) {
- return NULL;
- }
- cJSON* timeout_json = cJSON_GetObjectItem(sniffesp_stage_json, "timeout");
- int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
- WifiMarauderScriptStageSniffEsp* sniff_esp_stage =
- (WifiMarauderScriptStageSniffEsp*)malloc(sizeof(WifiMarauderScriptStageSniffEsp));
- sniff_esp_stage->timeout = timeout;
- return sniff_esp_stage;
- }
- WifiMarauderScriptStageSniffPmkid* _wifi_marauder_script_get_stage_sniff_pmkid(cJSON* stages) {
- cJSON* sniffpmkid_stage_json = cJSON_GetObjectItem(stages, "sniffpmkid");
- if(sniffpmkid_stage_json == NULL) {
- return NULL;
- }
- cJSON* channel_json = cJSON_GetObjectItem(sniffpmkid_stage_json, "channel");
- int channel = channel_json != NULL ? (int)cJSON_GetNumberValue(channel_json) : 0;
- cJSON* timeout_json = cJSON_GetObjectItem(sniffpmkid_stage_json, "timeout");
- int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
- cJSON* force_deauth_json =
- cJSON_GetObjectItemCaseSensitive(sniffpmkid_stage_json, "forceDeauth");
- bool force_deauth = cJSON_IsBool(force_deauth_json) ? force_deauth_json->valueint : true;
- cJSON* hop_channels_json =
- cJSON_GetObjectItemCaseSensitive(sniffpmkid_stage_json, "hopChannels");
- bool hop_channels = cJSON_IsBool(hop_channels_json) ? hop_channels_json->valueint : false;
- WifiMarauderScriptStageSniffPmkid* sniff_pmkid_stage =
- (WifiMarauderScriptStageSniffPmkid*)malloc(sizeof(WifiMarauderScriptStageSniffPmkid));
- if (sniff_pmkid_stage == NULL) {
- // Handle memory allocation error
- return NULL;
- }
- sniff_pmkid_stage->channel = channel;
- sniff_pmkid_stage->timeout = timeout;
- sniff_pmkid_stage->force_deauth = force_deauth;
- sniff_pmkid_stage->hop_channels = hop_channels;
- return sniff_pmkid_stage;
- }
- WifiMarauderScriptStageSniffPwn* _wifi_marauder_script_get_stage_sniff_pwn(cJSON* stages) {
- cJSON* sniffpwn_stage_json = cJSON_GetObjectItem(stages, "sniffpwn");
- if(sniffpwn_stage_json == NULL) {
- return NULL;
- }
- cJSON* timeout_json = cJSON_GetObjectItem(sniffpwn_stage_json, "timeout");
- int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_SNIFF;
- WifiMarauderScriptStageSniffPwn* sniff_pwn_stage =
- (WifiMarauderScriptStageSniffPwn*)malloc(sizeof(WifiMarauderScriptStageSniffPwn));
- sniff_pwn_stage->timeout = timeout;
- return sniff_pwn_stage;
- }
- WifiMarauderScriptStageBeaconList* _wifi_marauder_script_get_stage_beacon_list(cJSON* stages) {
- cJSON* stage_beaconlist = cJSON_GetObjectItem(stages, "beaconList");
- if(stage_beaconlist == NULL) {
- return NULL;
- }
- WifiMarauderScriptStageBeaconList* beaconlist_stage =
- (WifiMarauderScriptStageBeaconList*)malloc(sizeof(WifiMarauderScriptStageBeaconList));
- if(beaconlist_stage == NULL) {
- return NULL;
- }
- cJSON* ssids = cJSON_GetObjectItem(stage_beaconlist, "ssids");
- if(ssids == NULL) {
- return NULL;
- }
- // SSID count
- int ssid_count = cJSON_GetArraySize(ssids);
- if(ssid_count == 0) {
- return NULL;
- }
- beaconlist_stage->ssid_count = ssid_count;
- // SSIDs
- beaconlist_stage->ssids = (char**)malloc(sizeof(char*) * ssid_count);
- if(beaconlist_stage->ssids == NULL) {
- return NULL;
- }
- for(int i = 0; i < ssid_count; i++) {
- cJSON* ssid = cJSON_GetArrayItem(ssids, i);
- if(ssid == NULL) {
- continue;
- }
- char* ssid_string = cJSON_GetStringValue(ssid);
- if(ssid_string == NULL) {
- continue;
- }
- beaconlist_stage->ssids[i] = (char*)malloc(sizeof(char) * (strlen(ssid_string) + 1));
- strcpy(beaconlist_stage->ssids[i], ssid_string);
- }
- // Timeout
- cJSON* timeout = cJSON_GetObjectItem(stage_beaconlist, "timeout");
- beaconlist_stage->timeout = timeout != NULL ? (int)cJSON_GetNumberValue(timeout) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON;
- // Random SSIDs
- cJSON* random_ssids = cJSON_GetObjectItem(stage_beaconlist, "generate");
- beaconlist_stage->random_ssids =
- random_ssids != NULL ? (int)cJSON_GetNumberValue(random_ssids) : 0;
- return beaconlist_stage;
- }
- WifiMarauderScriptStageBeaconAp* _wifi_marauder_script_get_stage_beacon_ap(cJSON* stages) {
- cJSON* beaconap_stage_json = cJSON_GetObjectItem(stages, "beaconAp");
- if(beaconap_stage_json == NULL) {
- return NULL;
- }
- cJSON* timeout_json = cJSON_GetObjectItem(beaconap_stage_json, "timeout");
- int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) :
- WIFI_MARAUDER_DEFAULT_TIMEOUT_BEACON;
- WifiMarauderScriptStageBeaconAp* beacon_ap_stage =
- (WifiMarauderScriptStageBeaconAp*)malloc(sizeof(WifiMarauderScriptStageBeaconAp));
- beacon_ap_stage->timeout = timeout;
- return beacon_ap_stage;
- }
- WifiMarauderScriptStageExec* _wifi_marauder_script_get_stage_exec(cJSON* stages) {
- cJSON* exec_stage_json = cJSON_GetObjectItem(stages, "exec");
- if(exec_stage_json == NULL) {
- return NULL;
- }
- cJSON* command_json = cJSON_GetObjectItemCaseSensitive(exec_stage_json, "command");
- char* command_str = cJSON_IsString(command_json) ? strdup(command_json->valuestring) : NULL;
- WifiMarauderScriptStageExec* exec_stage =
- (WifiMarauderScriptStageExec*)malloc(sizeof(WifiMarauderScriptStageExec));
- exec_stage->command = command_str;
- return exec_stage;
- }
- WifiMarauderScriptStageDelay* _wifi_marauder_script_get_stage_delay(cJSON* stages) {
- cJSON* delay_stage_json = cJSON_GetObjectItem(stages, "delay");
- if(delay_stage_json == NULL) {
- return NULL;
- }
- cJSON* timeout_json = cJSON_GetObjectItem(delay_stage_json, "timeout");
- int timeout = timeout_json != NULL ? (int)cJSON_GetNumberValue(timeout_json) : 0;
- WifiMarauderScriptStageDelay* delay_stage =
- (WifiMarauderScriptStageDelay*)malloc(sizeof(WifiMarauderScriptStageDelay));
- delay_stage->timeout = timeout;
- return delay_stage;
- }
- WifiMarauderScriptStage*
- _wifi_marauder_script_create_stage(WifiMarauderScriptStageType type, void* stage_data) {
- WifiMarauderScriptStage* stage =
- (WifiMarauderScriptStage*)malloc(sizeof(WifiMarauderScriptStage));
- stage->type = type;
- stage->stage = stage_data;
- stage->next_stage = NULL;
- return stage;
- }
- void wifi_marauder_script_add_stage(
- WifiMarauderScript* script,
- WifiMarauderScriptStageType stage_type,
- void* stage_data) {
- if(script == NULL || stage_data == NULL) {
- return;
- }
- WifiMarauderScriptStage* stage = _wifi_marauder_script_create_stage(stage_type, stage_data);
- if(script->last_stage != NULL) {
- script->last_stage->next_stage = stage;
- } else {
- script->first_stage = stage;
- }
- script->last_stage = stage;
- }
- void _wifi_marauder_script_load_stages(WifiMarauderScript* script, cJSON* stages) {
- // Scan stage
- wifi_marauder_script_add_stage(
- script, WifiMarauderScriptStageTypeScan, _wifi_marauder_script_get_stage_scan(stages));
- // Select stage
- wifi_marauder_script_add_stage(
- script, WifiMarauderScriptStageTypeSelect, _wifi_marauder_script_get_stage_select(stages));
- // Deauth stage
- wifi_marauder_script_add_stage(
- script, WifiMarauderScriptStageTypeDeauth, _wifi_marauder_script_get_stage_deauth(stages));
- // Probe stage
- wifi_marauder_script_add_stage(
- script, WifiMarauderScriptStageTypeProbe, _wifi_marauder_script_get_stage_probe(stages));
- // Sniff raw stage
- wifi_marauder_script_add_stage(
- script,
- WifiMarauderScriptStageTypeSniffRaw,
- _wifi_marauder_script_get_stage_sniff_raw(stages));
- // Sniff beacon stage
- wifi_marauder_script_add_stage(
- script,
- WifiMarauderScriptStageTypeSniffBeacon,
- _wifi_marauder_script_get_stage_sniff_beacon(stages));
- // Sniff deauth stage
- wifi_marauder_script_add_stage(
- script,
- WifiMarauderScriptStageTypeSniffDeauth,
- _wifi_marauder_script_get_stage_sniff_deauth(stages));
- // Sniff esp stage
- wifi_marauder_script_add_stage(
- script,
- WifiMarauderScriptStageTypeSniffEsp,
- _wifi_marauder_script_get_stage_sniff_esp(stages));
- // Sniff PMKID stage
- wifi_marauder_script_add_stage(
- script,
- WifiMarauderScriptStageTypeSniffPmkid,
- _wifi_marauder_script_get_stage_sniff_pmkid(stages));
- // Sniff pwn stage
- wifi_marauder_script_add_stage(
- script,
- WifiMarauderScriptStageTypeSniffPwn,
- _wifi_marauder_script_get_stage_sniff_pwn(stages));
- // Beacon List stage
- wifi_marauder_script_add_stage(
- script,
- WifiMarauderScriptStageTypeBeaconList,
- _wifi_marauder_script_get_stage_beacon_list(stages));
- // Beacon Ap stage
- wifi_marauder_script_add_stage(
- script,
- WifiMarauderScriptStageTypeBeaconAp,
- _wifi_marauder_script_get_stage_beacon_ap(stages));
- // Exec stage
- wifi_marauder_script_add_stage(
- script, WifiMarauderScriptStageTypeExec, _wifi_marauder_script_get_stage_exec(stages));
- // Delay stage
- wifi_marauder_script_add_stage(
- script, WifiMarauderScriptStageTypeDelay, _wifi_marauder_script_get_stage_delay(stages));
- }
- WifiMarauderScript* wifi_marauder_script_parse_raw(const char* json_raw) {
- WifiMarauderScript* script = wifi_marauder_script_alloc();
- if(script == NULL) {
- return NULL;
- }
- cJSON* json = cJSON_Parse(json_raw);
- if(json == NULL) {
- return NULL;
- }
- cJSON* meta = cJSON_GetObjectItem(json, "meta");
- _wifi_marauder_script_load_meta(script, meta);
- cJSON* stages = cJSON_GetObjectItem(json, "stages");
- if(cJSON_IsArray(stages)) {
- cJSON* stage_item = NULL;
- cJSON_ArrayForEach(stage_item, stages) {
- _wifi_marauder_script_load_stages(script, stage_item);
- }
- } else {
- _wifi_marauder_script_load_stages(script, stages);
- }
- return script;
- }
- WifiMarauderScript* wifi_marauder_script_parse_json(Storage* storage, const char* file_path) {
- WifiMarauderScript* script = NULL;
- File* script_file = storage_file_alloc(storage);
- FuriString* script_name = furi_string_alloc();
- path_extract_filename_no_ext(file_path, script_name);
- if(storage_file_open(script_file, file_path, FSAM_READ, FSOM_OPEN_EXISTING)) {
- uint32_t file_size = storage_file_size(script_file);
- char* json_buffer = (char*)malloc(file_size + 1);
- uint16_t bytes_read = storage_file_read(script_file, json_buffer, file_size);
- json_buffer[bytes_read] = '\0';
- script = wifi_marauder_script_parse_raw(json_buffer);
- }
- if(script == NULL) {
- script = wifi_marauder_script_create(furi_string_get_cstr(script_name));
- }
- script->name = strdup(furi_string_get_cstr(script_name));
- furi_string_free(script_name);
- storage_file_close(script_file);
- storage_file_free(script_file);
- return script;
- }
- cJSON* _wifi_marauder_script_create_json_meta(WifiMarauderScript* script) {
- cJSON* meta_json = cJSON_CreateObject();
- if(script->description != NULL) {
- cJSON_AddStringToObject(meta_json, "description", script->description);
- } else {
- cJSON_AddStringToObject(meta_json, "description", "My Script");
- }
- if(script->enable_led != WifiMarauderScriptBooleanUndefined) {
- cJSON_AddBoolToObject(
- meta_json, "enableLed", (script->enable_led == WifiMarauderScriptBooleanTrue));
- }
- if(script->save_pcap != WifiMarauderScriptBooleanUndefined) {
- cJSON_AddBoolToObject(
- meta_json, "savePcap", (script->save_pcap == WifiMarauderScriptBooleanTrue));
- }
- cJSON_AddNumberToObject(meta_json, "repeat", script->repeat);
- return meta_json;
- }
- cJSON* _wifi_marauder_script_create_json_scan(WifiMarauderScriptStageScan* scan_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "scan", cJSON_CreateObject());
- cJSON* scan_json = cJSON_GetObjectItem(stage_json, "scan");
- // Scan type
- cJSON_AddStringToObject(
- scan_json, "type", scan_stage->type == WifiMarauderScriptScanTypeAp ? "ap" : "station");
- // Channel
- if(scan_stage->channel > 0) {
- cJSON_AddNumberToObject(scan_json, "channel", scan_stage->channel);
- }
- // Timeout
- if(scan_stage->timeout > 0) {
- cJSON_AddNumberToObject(scan_json, "timeout", scan_stage->timeout);
- }
- return stage_json;
- }
- cJSON* _wifi_marauder_script_create_json_select(WifiMarauderScriptStageSelect* select_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "select", cJSON_CreateObject());
- cJSON* select_json = cJSON_GetObjectItem(stage_json, "select");
- // Select type
- cJSON_AddStringToObject(
- select_json,
- "type",
- select_stage->type == WifiMarauderScriptSelectTypeAp ? "ap" :
- select_stage->type == WifiMarauderScriptSelectTypeStation ? "station" :
- "ssid");
- if(select_stage->filter != NULL) {
- cJSON_AddStringToObject(select_json, "filter", select_stage->filter);
- }
- // Indexes
- if(select_stage->indexes != NULL && select_stage->index_count > 0) {
- cJSON* indexes_json = cJSON_CreateArray();
- for(int i = 0; i < select_stage->index_count; i++) {
- cJSON_AddItemToArray(indexes_json, cJSON_CreateNumber(select_stage->indexes[i]));
- }
- cJSON_AddItemToObject(select_json, "indexes", indexes_json);
- }
- return stage_json;
- }
- cJSON* _wifi_marauder_script_create_json_deauth(WifiMarauderScriptStageDeauth* deauth_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "deauth", cJSON_CreateObject());
- cJSON* deauth_json = cJSON_GetObjectItem(stage_json, "deauth");
- // Timeout
- if(deauth_stage->timeout > 0) {
- cJSON_AddNumberToObject(deauth_json, "timeout", deauth_stage->timeout);
- }
- return stage_json;
- }
- cJSON* _wifi_marauder_script_create_json_probe(WifiMarauderScriptStageProbe* probe_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "probe", cJSON_CreateObject());
- cJSON* probe_json = cJSON_GetObjectItem(stage_json, "probe");
- // Timeout
- if(probe_stage->timeout > 0) {
- cJSON_AddNumberToObject(probe_json, "timeout", probe_stage->timeout);
- }
- return stage_json;
- }
- cJSON*
- _wifi_marauder_script_create_json_sniffraw(WifiMarauderScriptStageSniffRaw* sniffraw_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "sniffRaw", cJSON_CreateObject());
- cJSON* sniffraw_json = cJSON_GetObjectItem(stage_json, "sniffRaw");
- // Timeout
- if(sniffraw_stage->timeout > 0) {
- cJSON_AddNumberToObject(sniffraw_json, "timeout", sniffraw_stage->timeout);
- }
- return stage_json;
- }
- cJSON* _wifi_marauder_script_create_json_sniffbeacon(
- WifiMarauderScriptStageSniffBeacon* sniffbeacon_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "sniffBeacon", cJSON_CreateObject());
- cJSON* sniffbeacon_json = cJSON_GetObjectItem(stage_json, "sniffBeacon");
- // Timeout
- if(sniffbeacon_stage->timeout > 0) {
- cJSON_AddNumberToObject(sniffbeacon_json, "timeout", sniffbeacon_stage->timeout);
- }
- return stage_json;
- }
- cJSON* _wifi_marauder_script_create_json_sniffdeauth(
- WifiMarauderScriptStageSniffDeauth* sniffdeauth_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "sniffDeauth", cJSON_CreateObject());
- cJSON* sniffdeauth_json = cJSON_GetObjectItem(stage_json, "sniffDeauth");
- // Timeout
- if(sniffdeauth_stage->timeout > 0) {
- cJSON_AddNumberToObject(sniffdeauth_json, "timeout", sniffdeauth_stage->timeout);
- }
- return stage_json;
- }
- cJSON*
- _wifi_marauder_script_create_json_sniffesp(WifiMarauderScriptStageSniffEsp* sniffesp_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "sniffEsp", cJSON_CreateObject());
- cJSON* sniffesp_json = cJSON_GetObjectItem(stage_json, "sniffEsp");
- // Timeout
- if(sniffesp_stage->timeout > 0) {
- cJSON_AddNumberToObject(sniffesp_json, "timeout", sniffesp_stage->timeout);
- }
- return stage_json;
- }
- cJSON* _wifi_marauder_script_create_json_sniffpmkid(
- WifiMarauderScriptStageSniffPmkid* sniffpmkid_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "sniffPmkid", cJSON_CreateObject());
- cJSON* sniffpmkid_json = cJSON_GetObjectItem(stage_json, "sniffPmkid");
- // Force deauth
- cJSON_AddBoolToObject(sniffpmkid_json, "forceDeauth", sniffpmkid_stage->force_deauth);
- // Channel
- if(sniffpmkid_stage->channel > 0) {
- cJSON_AddNumberToObject(sniffpmkid_json, "channel", sniffpmkid_stage->channel);
- }
- // Timeout
- if(sniffpmkid_stage->timeout > 0) {
- cJSON_AddNumberToObject(sniffpmkid_json, "timeout", sniffpmkid_stage->timeout);
- }
- // Hop channels
- cJSON_AddBoolToObject(sniffpmkid_json, "hopChannels", sniffpmkid_stage->hop_channels);
- return stage_json;
- }
- cJSON*
- _wifi_marauder_script_create_json_sniffpwn(WifiMarauderScriptStageSniffPwn* sniffpwn_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "sniffPwn", cJSON_CreateObject());
- cJSON* sniffpwn_json = cJSON_GetObjectItem(stage_json, "sniffPwn");
- // Timeout
- if(sniffpwn_stage->timeout > 0) {
- cJSON_AddNumberToObject(sniffpwn_json, "timeout", sniffpwn_stage->timeout);
- }
- return stage_json;
- }
- cJSON* _wifi_marauder_script_create_json_beaconlist(
- WifiMarauderScriptStageBeaconList* beaconlist_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "beaconList", cJSON_CreateObject());
- cJSON* beaconlist_json = cJSON_GetObjectItem(stage_json, "beaconList");
- // SSIDs
- if(beaconlist_stage->ssids != NULL) {
- cJSON* ssids_json = cJSON_CreateStringArray(
- (const char**)beaconlist_stage->ssids, beaconlist_stage->ssid_count);
- cJSON_AddItemToObject(beaconlist_json, "ssids", ssids_json);
- }
- // Random SSIDs
- if(beaconlist_stage->random_ssids > 0) {
- cJSON_AddNumberToObject(beaconlist_json, "generate", beaconlist_stage->random_ssids);
- }
- // Timeout
- if(beaconlist_stage->timeout > 0) {
- cJSON_AddNumberToObject(beaconlist_json, "timeout", beaconlist_stage->timeout);
- }
- return stage_json;
- }
- cJSON*
- _wifi_marauder_script_create_json_beaconap(WifiMarauderScriptStageBeaconAp* beaconap_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "beaconAp", cJSON_CreateObject());
- cJSON* beaconap_json = cJSON_GetObjectItem(stage_json, "beaconAp");
- // Timeout
- if(beaconap_stage->timeout > 0) {
- cJSON_AddNumberToObject(beaconap_json, "timeout", beaconap_stage->timeout);
- }
- return stage_json;
- }
- cJSON* _wifi_marauder_script_create_json_exec(WifiMarauderScriptStageExec* exec_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "exec", cJSON_CreateObject());
- cJSON* exec_json = cJSON_GetObjectItem(stage_json, "exec");
- // Command
- cJSON_AddStringToObject(
- exec_json, "command", exec_stage->command != NULL ? exec_stage->command : "");
- return stage_json;
- }
- cJSON* _wifi_marauder_script_create_json_delay(WifiMarauderScriptStageDelay* delay_stage) {
- cJSON* stage_json = cJSON_CreateObject();
- cJSON_AddItemToObject(stage_json, "delay", cJSON_CreateObject());
- cJSON* delay_json = cJSON_GetObjectItem(stage_json, "delay");
- // Timeout
- if(delay_stage->timeout > 0) {
- cJSON_AddNumberToObject(delay_json, "timeout", delay_stage->timeout);
- }
- return stage_json;
- }
- void wifi_marauder_script_save_json(
- Storage* storage,
- const char* file_path,
- WifiMarauderScript* script) {
- File* script_file = storage_file_alloc(storage);
- if(storage_file_open(script_file, file_path, FSAM_WRITE, FSOM_CREATE_ALWAYS)) {
- cJSON* root_json = cJSON_CreateObject();
- // Meta info
- cJSON* meta_json = _wifi_marauder_script_create_json_meta(script);
- cJSON_AddItemToObject(root_json, "meta", meta_json);
- // Create array for stages
- cJSON* stages_array = cJSON_CreateArray();
- cJSON_AddItemToObject(root_json, "stages", stages_array);
- // Iterate over each stage and create the corresponding JSON object
- WifiMarauderScriptStage* stage = script->first_stage;
- while(stage != NULL) {
- cJSON* stage_json = NULL;
- switch(stage->type) {
- case WifiMarauderScriptStageTypeScan: {
- WifiMarauderScriptStageScan* scan_stage =
- (WifiMarauderScriptStageScan*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_scan(scan_stage);
- break;
- }
- case WifiMarauderScriptStageTypeSelect: {
- WifiMarauderScriptStageSelect* select_stage =
- (WifiMarauderScriptStageSelect*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_select(select_stage);
- break;
- }
- case WifiMarauderScriptStageTypeDeauth: {
- WifiMarauderScriptStageDeauth* deauth_stage =
- (WifiMarauderScriptStageDeauth*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_deauth(deauth_stage);
- break;
- }
- case WifiMarauderScriptStageTypeProbe: {
- WifiMarauderScriptStageProbe* probe_stage =
- (WifiMarauderScriptStageProbe*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_probe(probe_stage);
- break;
- }
- case WifiMarauderScriptStageTypeSniffRaw: {
- WifiMarauderScriptStageSniffRaw* sniffraw_stage =
- (WifiMarauderScriptStageSniffRaw*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_sniffraw(sniffraw_stage);
- break;
- }
- case WifiMarauderScriptStageTypeSniffBeacon: {
- WifiMarauderScriptStageSniffBeacon* sniffbeacon_stage =
- (WifiMarauderScriptStageSniffBeacon*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_sniffbeacon(sniffbeacon_stage);
- break;
- }
- case WifiMarauderScriptStageTypeSniffDeauth: {
- WifiMarauderScriptStageSniffDeauth* sniffdeauth_stage =
- (WifiMarauderScriptStageSniffDeauth*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_sniffdeauth(sniffdeauth_stage);
- break;
- }
- case WifiMarauderScriptStageTypeSniffEsp: {
- WifiMarauderScriptStageSniffEsp* sniffesp_stage =
- (WifiMarauderScriptStageSniffEsp*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_sniffesp(sniffesp_stage);
- break;
- }
- case WifiMarauderScriptStageTypeSniffPmkid: {
- WifiMarauderScriptStageSniffPmkid* sniffpmkid_stage =
- (WifiMarauderScriptStageSniffPmkid*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_sniffpmkid(sniffpmkid_stage);
- break;
- }
- case WifiMarauderScriptStageTypeSniffPwn: {
- WifiMarauderScriptStageSniffPwn* sniffpwn_stage =
- (WifiMarauderScriptStageSniffPwn*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_sniffpwn(sniffpwn_stage);
- break;
- }
- case WifiMarauderScriptStageTypeBeaconList: {
- WifiMarauderScriptStageBeaconList* beaconlist_stage =
- (WifiMarauderScriptStageBeaconList*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_beaconlist(beaconlist_stage);
- break;
- }
- case WifiMarauderScriptStageTypeBeaconAp: {
- WifiMarauderScriptStageBeaconAp* beaconap_stage =
- (WifiMarauderScriptStageBeaconAp*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_beaconap(beaconap_stage);
- break;
- }
- case WifiMarauderScriptStageTypeExec: {
- WifiMarauderScriptStageExec* exec_stage =
- (WifiMarauderScriptStageExec*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_exec(exec_stage);
- break;
- }
- case WifiMarauderScriptStageTypeDelay: {
- WifiMarauderScriptStageDelay* delay_stage =
- (WifiMarauderScriptStageDelay*)stage->stage;
- stage_json = _wifi_marauder_script_create_json_delay(delay_stage);
- break;
- }
- }
- // Add the stage JSON object to the "stages" array
- if(stage_json != NULL) {
- cJSON_AddItemToArray(stages_array, stage_json);
- }
- stage = stage->next_stage;
- }
- // Write JSON to file
- char* json_str = cJSON_Print(root_json);
- storage_file_write(script_file, json_str, strlen(json_str));
- //free(json_str);
- storage_file_close(script_file);
- }
- storage_file_free(script_file);
- }
- bool wifi_marauder_script_has_stage(
- WifiMarauderScript* script,
- WifiMarauderScriptStageType stage_type) {
- if(script == NULL) {
- return false;
- }
- WifiMarauderScriptStage* current_stage = script->first_stage;
- while(current_stage != NULL) {
- if(current_stage->type == stage_type) {
- return true;
- }
- current_stage = current_stage->next_stage;
- }
- return false;
- }
- void wifi_marauder_script_free(WifiMarauderScript* script) {
- if(script == NULL) {
- return;
- }
- WifiMarauderScriptStage* current_stage = script->first_stage;
- while(current_stage != NULL) {
- WifiMarauderScriptStage* next_stage = current_stage->next_stage;
- switch(current_stage->type) {
- case WifiMarauderScriptStageTypeScan:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeSelect:
- if(((WifiMarauderScriptStageSelect*)current_stage->stage)->filter != NULL) {
- free(((WifiMarauderScriptStageSelect*)current_stage->stage)->filter);
- }
- if(((WifiMarauderScriptStageSelect*)current_stage->stage)->indexes != NULL) {
- free(((WifiMarauderScriptStageSelect*)current_stage->stage)->indexes);
- }
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeDeauth:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeProbe:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeSniffRaw:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeSniffBeacon:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeSniffDeauth:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeSniffEsp:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeSniffPmkid:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeSniffPwn:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeBeaconList:
- for(int i = 0;
- i < ((WifiMarauderScriptStageBeaconList*)current_stage->stage)->ssid_count;
- i++) {
- free(((WifiMarauderScriptStageBeaconList*)current_stage->stage)->ssids[i]);
- }
- free(((WifiMarauderScriptStageBeaconList*)current_stage->stage)->ssids);
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeBeaconAp:
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeExec:
- if(((WifiMarauderScriptStageExec*)current_stage->stage)->command != NULL) {
- free(((WifiMarauderScriptStageExec*)current_stage->stage)->command);
- }
- free(current_stage->stage);
- break;
- case WifiMarauderScriptStageTypeDelay:
- free(current_stage->stage);
- break;
- }
- free(current_stage);
- current_stage = next_stage;
- }
- free(script->name);
- free(script->description);
- free(script);
- }
|