1+ /*
2+ Copyright (c) 2020 Stefan Kremser (@Spacehuhn)
3+ This software is licensed under the MIT License. See the license file for details.
4+ Source: github.com/spacehuhn/esp8266_deauther
5+ */
6+
7+ #include " settings.h"
8+
9+ #include " A_config.h" // Default Settings
10+ #include " language.h" // prnt and prntln
11+ #include " EEPROMHelper.h" // To load and save settings_t
12+ #include " debug.h"
13+
14+ #define MAGIC_NUM 3416245
15+
16+ extern bool writeFile (String path, String& buf);
17+ extern void getRandomMac (uint8_t * mac);
18+ extern bool macValid (uint8_t * mac);
19+
20+ #define JSON_FLAG (_NAME,_VALUE )\
21+ str += String(' "' ) + String(FPSTR(_NAME)) + String(F(" \" :" )) + String(_VALUE?" true" :" false" ) + String(' ,' );
22+
23+ #define JSON_VALUE (_NAME,_VALUE )\
24+ str += String(' "' ) + String(FPSTR(_NAME)) + String(F(" \" :\" " )) + String(_VALUE) + String(F(" \" ," ));
25+
26+ #define JSON_INT (_NAME,_VALUE )\
27+ str += String(' "' ) + String(FPSTR(_NAME)) + String(F(" \" :" )) + String(_VALUE) + String(' ,' );
28+
29+ #define JSON_HEX (_NAME,_BYTES,_LEN )\
30+ str += String(' "' ) + String(FPSTR(_NAME)) + String(F(" \" :\" " ));\
31+ for (int i = 0 ; i<_LEN; i++) {\
32+ if (i > 0 ) str += ' :' ;\
33+ if (_BYTES[i] < 0x10 ) str += ' 0' ;\
34+ str += String (_BYTES[i], HEX);\
35+ }\
36+ str += String(F(" \" ," ));
37+
38+ #define JSON_DEC (_NAME,_BYTES,_LEN )\
39+ str += String(F(" \" " )) + String(FPSTR(_NAME)) + String(F(" \" :\" " ));\
40+ for (int i = 0 ; i<_LEN; i++) {\
41+ if (i > 0 ) str += ' .' ;\
42+ str += String (_BYTES[i]);\
43+ }\
44+ str += String(F(" \" ," ));
45+
46+
47+ namespace settings {
48+ // ========== PRIVATE ========== //
49+ const char * SETTINGS_PATH = " /settings.json" ;
50+
51+ settings_t data;
52+ bool changed = false ;
53+
54+ void get_json (String& str) {
55+ str = String ();
56+ str.reserve (600 );
57+
58+ str += ' {' ;
59+
60+ // Version
61+ JSON_VALUE (S_JSON_VERSION, DEAUTHER_VERSION);
62+
63+ // Autosave
64+ JSON_FLAG (S_JSON_AUTOSAVE, data.autosave .enabled );
65+ JSON_INT (S_JSON_AUTOSAVETIME, data.autosave .time );
66+
67+ // Attack
68+ JSON_FLAG (S_JSON_BEACONCHANNEL, data.attack .attack_all_ch );
69+ JSON_FLAG (S_JSON_RANDOMTX, data.attack .random_tx );
70+ JSON_INT (S_JSON_ATTACKTIMEOUT, data.attack .timeout );
71+ JSON_INT (S_JSON_DEAUTHSPERTARGET, data.attack .deauths_per_target );
72+ JSON_INT (S_JSON_DEAUTHREASON, data.attack .deauth_reason );
73+ JSON_FLAG (S_JSON_BEACONINTERVAL, data.attack .beacon_interval == INTERVAL_1S);
74+ JSON_INT (S_JSON_PROBESPERSSID, data.attack .probe_frames_per_ssid );
75+
76+ // WiFi
77+ JSON_INT (S_JSON_CHANNEL, data.wifi .channel );
78+ JSON_HEX (S_JSON_MACST, data.wifi .mac_st , 6 );
79+ JSON_HEX (S_JSON_MACAP, data.wifi .mac_ap , 6 );
80+
81+ // Sniffer
82+ JSON_INT (S_JSON_CHTIME, data.sniffer .channel_time );
83+ JSON_INT (S_JSON_MIN_DEAUTHS, data.sniffer .min_deauth_frames );
84+
85+ // Access Point
86+ JSON_VALUE (S_JSON_SSID, data.ap .ssid );
87+ JSON_VALUE (S_JSON_PASSWORD, data.ap .password );
88+ JSON_FLAG (S_JSON_HIDDEN, data.ap .hidden );
89+ JSON_DEC (S_JSON_IP, data.ap .ip , 4 );
90+
91+ // Web Interface
92+ JSON_FLAG (S_JSON_WEBINTERFACE, data.web .enabled );
93+ JSON_FLAG (S_JSON_CAPTIVEPORTAL, data.web .captive_portal );
94+ JSON_FLAG (S_JSON_WEB_SPIFFS, data.web .use_spiffs );
95+ JSON_VALUE (S_JSON_LANG, data.web .lang );
96+
97+ // CLI
98+ JSON_FLAG (S_JSON_SERIALINTERFACE, data.cli .enabled );
99+ JSON_FLAG (S_JSON_SERIAL_ECHO, data.cli .serial_echo );
100+
101+ // LED
102+ JSON_FLAG (S_JSON_LEDENABLED, data.led .enabled );
103+
104+ // Display
105+ JSON_FLAG (S_JSON_DISPLAYINTERFACE, data.display .enabled );
106+ JSON_INT (S_JSON_DISPLAY_TIMEOUT, data.display .timeout );
107+
108+ str.setCharAt (str.length ()-1 , ' }' );
109+ }
110+
111+ // ========== PUBLIC ========== //
112+ void load () {
113+ debugF (" Loading settings..." );
114+
115+ // read data from eeproms
116+ settings_t newData;
117+ EEPROMHelper::getObject (SETTINGS_ADDR, newData);
118+
119+ // calc and check hash
120+ if (newData.magic_num == MAGIC_NUM) {
121+ data = newData;
122+ data.version .major = DEAUTHER_VERSION_MAJOR;
123+ data.version .minor = DEAUTHER_VERSION_MINOR;
124+ data.version .revision = DEAUTHER_VERSION_REVISION;
125+ debuglnF (" OK" );
126+ save ();
127+ } else {
128+ debuglnF (" Invalid Hash" );
129+ /* debug(data.magic_num);
130+ debugF(" != ");
131+ debugln(MAGIC_NUM);*/
132+
133+ reset ();
134+ save ();
135+ }
136+
137+ // check and fix mac
138+ if (!macValid (data.wifi .mac_st )) getRandomMac (data.wifi .mac_st );
139+ if (!macValid (data.wifi .mac_ap )) getRandomMac (data.wifi .mac_ap );
140+
141+ changed = true ;
142+ }
143+
144+ void reset () {
145+ data.magic_num = MAGIC_NUM;
146+
147+ data.version .major = DEAUTHER_VERSION_MAJOR;
148+ data.version .minor = DEAUTHER_VERSION_MINOR;
149+ data.version .revision = DEAUTHER_VERSION_REVISION;
150+
151+ data.attack .attack_all_ch = ATTACK_ALL_CH;
152+ data.attack .random_tx = RANDOM_TX;
153+ data.attack .timeout = ATTACK_TIMEOUT;
154+ data.attack .deauths_per_target = DEAUTHS_PER_TARGET;
155+ data.attack .deauth_reason = DEAUTH_REASON;
156+ data.attack .beacon_interval = beacon_interval_t ::INTERVAL_100MS;
157+ data.attack .probe_frames_per_ssid = PROBE_FRAMES_PER_SSID;
158+
159+ data.wifi .channel = 1 ;
160+ getRandomMac (data.wifi .mac_st );
161+ getRandomMac (data.wifi .mac_ap );
162+
163+ data.sniffer .channel_time = CH_TIME;
164+ data.sniffer .min_deauth_frames = MIN_DEAUTH_FRAMES;
165+
166+ strncpy (data.ap .ssid , AP_SSID, 32 );
167+ strncpy (data.ap .password , AP_PASSWD, 64 );
168+ data.ap .hidden = AP_HIDDEN;
169+ uint8_t ip[4 ] = AP_IP_ADDR;
170+ memcpy (data.ap .ip , ip, 4 );
171+
172+ data.web .enabled = WEB_ENABLED;
173+ data.web .captive_portal = WEB_CAPTIVE_PORTAL;
174+ data.web .use_spiffs = WEB_USE_SPIFFS;
175+ memcpy (data.web .lang , DEFAULT_LANG, 3 );
176+
177+ data.cli .enabled = CLI_ENABLED;
178+ data.cli .serial_echo = CLI_ECHO;
179+
180+ data.led .enabled = USE_LED;
181+
182+ data.display .enabled = USE_DISPLAY;
183+ data.display .timeout = DISPLAY_TIMEOUT;
184+
185+ changed = true ;
186+
187+ debuglnF (" Settings reset to default" );
188+ }
189+
190+ void save (bool force) {
191+ if (force || changed) {
192+ EEPROMHelper::saveObject (SETTINGS_ADDR, data);
193+
194+ changed = false ;
195+
196+ String json_buffer;
197+ get_json (json_buffer);
198+
199+ if (writeFile (SETTINGS_PATH, json_buffer)) {
200+ debugF (" Settings saved in " );
201+ } else {
202+ debugF (" ERROR: saving " );
203+ }
204+
205+ debugln (SETTINGS_PATH);
206+ }
207+ }
208+
209+ void print () {
210+ String json_buffer;
211+ get_json (json_buffer);
212+
213+ json_buffer.replace (" \" :" , " : " );
214+ json_buffer.replace (" : 0\r\n " , " : false\r\n " );
215+ json_buffer.replace (" : 1\r\n " , " : true\r\n " );
216+ json_buffer.replace (" \" " , " " );
217+ json_buffer.replace (" {" , " " );
218+ json_buffer.replace (" }" , " " );
219+ json_buffer.replace (" ," , " \r\n " );
220+
221+ debuglnF (" [========== Settings ==========]" );
222+ debugln (json_buffer);
223+ }
224+
225+ // ===== GETTERS ===== //
226+
227+ const settings_t & getAllSettings () {
228+ return data;
229+ }
230+
231+ const version_t & getVersion () {
232+ return data.version ;
233+ }
234+
235+ const autosave_settings_t & getAutosaveSettings () {
236+ return data.autosave ;
237+ }
238+
239+ const attack_settings_t & getAttackSettings () {
240+ return data.attack ;
241+ }
242+
243+ const wifi_settings_t & getWifiSettings () {
244+ return data.wifi ;
245+ }
246+
247+ const sniffer_settings_t & getSnifferSettings () {
248+ return data.sniffer ;
249+ }
250+
251+ const access_point_settings_t & getAccessPointSettings () {
252+ return data.ap ;
253+ }
254+
255+ const web_settings_t & getWebSettings () {
256+ return data.web ;
257+ }
258+
259+ const cli_settings_t & getCLISettings () {
260+ return data.cli ;
261+ }
262+
263+ const led_settings_t & getLEDSettings () {
264+ return data.led ;
265+ }
266+
267+ const display_settings_t & getDisplaySettings () {
268+ return data.display ;
269+ }
270+
271+ // ===== SETTERS ===== //
272+
273+ void setAllSettings (settings_t & newSettings) {
274+ newSettings.version = data.version ;
275+ data = newSettings;
276+ changed = true ;
277+ }
278+
279+ void setAutosaveSettings (const autosave_settings_t & autosave) {
280+ data.autosave = autosave;
281+ changed = true ;
282+ }
283+
284+ void setAttackSettings (const attack_settings_t & attack) {
285+ data.attack = attack;
286+ changed = true ;
287+ }
288+
289+ void setWifiSettings (const wifi_settings_t & wifi) {
290+ data.wifi = wifi;
291+ changed = true ;
292+ }
293+
294+ void setSnifferSettings (const sniffer_settings_t & sniffer) {
295+ data.sniffer = sniffer;
296+ changed = true ;
297+ }
298+
299+ void setAccessPointSettings (const access_point_settings_t & ap) {
300+ data.ap = ap;
301+ changed = true ;
302+ }
303+
304+ void setWebSettings (const web_settings_t & web) {
305+ data.web = web;
306+ changed = true ;
307+ }
308+
309+ void setCLISettings (const cli_settings_t & cli) {
310+ data.cli = cli;
311+ changed = true ;
312+ }
313+
314+ void setLEDSettings (const led_settings_t & led) {
315+ data.led = led;
316+ changed = true ;
317+ }
318+
319+ void setDisplaySettings (const display_settings_t & display) {
320+ data.display = display;
321+ changed = true ;
322+ }
323+ }
0 commit comments