unleashed-firmware/applications/external/wifi_marauder_companion/script/wifi_marauder_script.c

947 lines
37 KiB
C
Raw Normal View History

#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;
WifiMarauderScriptStageSniffPmkid* sniff_pmkid_stage =
(WifiMarauderScriptStageSniffPmkid*)malloc(sizeof(WifiMarauderScriptStageSniffPmkid));
sniff_pmkid_stage->channel = channel;
sniff_pmkid_stage->timeout = timeout;
sniff_pmkid_stage->force_deauth = force_deauth;
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);
}
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);
}