Improved the way stations save their AP

There was the problem that when the AP list get's sorted (when starting an attack for example), the pointers to the stations would become messed up.
This commit is contained in:
Stefan Kremser
2018-04-09 12:24:36 +02:00
parent ef21d3201e
commit 396d8e69fe
11 changed files with 48 additions and 50 deletions

View File

@@ -141,13 +141,7 @@ uint8_t* Accesspoints::getMac(int num) {
String Accesspoints::getMacStr(int num) {
if (!check(num)) return String();
uint8_t* mac = getMac(num);
String value;
for (int i = 0; i < 6; i++) {
if (mac[i] < 0x10) value += ZERO;
value += String(mac[i], HEX);
if (i < 5) value += DOUBLEPOINT;
}
return value;
return bytesToStr(mac, 6);
}
String Accesspoints::getVendorStr(int num) {
@@ -165,7 +159,7 @@ bool Accesspoints::getSelected(int num) {
return list->get(num).selected;
}
int Accesspoints::getID(int num){
uint8_t Accesspoints::getID(int num){
if (!check(num)) return -1;
return list->get(num).id;
}
@@ -224,6 +218,15 @@ void Accesspoints::removeAll() {
changed = true;
}
int Accesspoints::find(uint8_t id){
int s = list->size();
for(int i=0;i<s;i++){
if(list->get(i).id == id)
return i;
}
return -1;
}
int Accesspoints::count() {
return list->size();
}

View File

@@ -14,7 +14,8 @@ extern Names names;
extern String searchVendor(uint8_t* mac);
extern String buildString(String left, String right, int maxLen);
String fixUtf8(String str);
extern String fixUtf8(String str);
extern String bytesToStr(uint8_t* b, uint32_t size);
struct AP{
uint8_t id;
@@ -49,12 +50,14 @@ class Accesspoints {
String getSelectedStr(int num);
uint8_t getCh(int num);
uint8_t getEnc(int num);
int getID(int num);
uint8_t getID(int num);
int getRSSI(int num);
uint8_t* getMac(int num);
bool getHidden(int num);
bool getSelected(int num);
int find(uint8_t id);
int count();
int selected();

View File

@@ -241,7 +241,7 @@ void Attack:: beaconUpdate() {
}
bool Attack::deauthStation(int num) {
return deauthDevice(accesspoints.getMac(stations.getAP(num)), stations.getMac(num), settings.getDeauthReason(), accesspoints.getCh(stations.getAP(num)));
return deauthDevice(stations.getAPMac(num), stations.getMac(num), settings.getDeauthReason(), stations.getCh(num));
}
bool Attack::deauthAP(int num) {

View File

@@ -340,16 +340,9 @@ uint8_t* Names::getBssid(int num) {
}
String Names::getMacStr(int num) {
String value;
if (check(num)) {
if (!check(num)) return String();
uint8_t* mac = getMac(num);
for (int i = 0; i < 6; i++) {
if (mac[i] < 0x10) value += ZERO;
value += String(mac[i], HEX);
if (i < 5) value += DOUBLEPOINT;
}
}
return value;
return bytesToStr(mac, 6);
}
String Names::getVendorStr(int num) {

View File

@@ -23,6 +23,7 @@ extern String searchVendor(uint8_t* mac);
extern String fixUtf8(String str);
extern String buildString(String left, String right, int maxLen);
extern String escape(String str);
extern String bytesToStr(uint8_t* b, uint32_t size);
class Names {
public:

View File

@@ -27,13 +27,13 @@ void Scan::sniffer(uint8_t* buf, uint16_t len) {
if (macBroadcast(macTo) || macBroadcast(macFrom) || !macValid(macTo) || !macValid(macFrom) || macMulticast(macTo) || macMulticast(macFrom)) return;
int16_t accesspointNum = findAccesspoint(macFrom);
int accesspointNum = findAccesspoint(macFrom);
if (accesspointNum >= 0) {
stations.add(macTo, accesspointNum);
stations.add(macTo, accesspoints.getID(accesspointNum));
} else {
accesspointNum = findAccesspoint(macTo);
if (accesspointNum >= 0) {
stations.add(macFrom, accesspointNum);
stations.add(macFrom, accesspoints.getID(accesspointNum));
}
}
}

View File

@@ -423,7 +423,7 @@ void SerialInterface::runCommand(String input) {
else if (eqlsCMD(i, CLI_AP)) mac = accesspoints.getMacStr(list->get(i + 1).toInt());
else if (eqlsCMD(i, CLI_STATION)) {
mac = stations.getMacStr(list->get(i + 1).toInt());
bssid = accesspoints.getMacStr(stations.getAP(list->get(i + 1).toInt()));
bssid = stations.getAPMacStr(list->get(i + 1).toInt());
}
else if (eqlsCMD(i, CLI_CHANNEL)) channel = (uint8_t)list->get(i + 1).toInt();
else if (eqlsCMD(i, CLI_BSSID)) bssid = list->get(i + 1);

View File

@@ -121,9 +121,20 @@ String Stations::getAPStr(int num) {
return accesspoints.getSSID(getAP(num));
}
uint8_t* Stations::getAPMac(int num){
if (!check(num)) return 0;
return WiFi.BSSID(list->get(num).ap);
}
String Stations::getAPMacStr(int num){
if (!check(num)) return String();
uint8_t* mac = getAPMac(num);
return bytesToStr(mac, 6);
}
uint8_t Stations::getAP(int num) {
if (!check(num)) return 0;
return list->get(num).ap;
return accesspoints.find(list->get(num).ap);
}
String Stations::getNameStr(int num) {
@@ -142,16 +153,9 @@ uint8_t* Stations::getMac(int num) {
}
String Stations::getMacStr(int num) {
String value = "";
if (check(num)) {
if (!check(num)) return String();
uint8_t* mac = getMac(num);
for (int i = 0; i < 6; i++) {
if (mac[i] < 0x10) value += "0";
value += String(mac[i], HEX);
if (i < 5) value += ":";
}
}
return value;
return bytesToStr(mac, 6);
}
String Stations::getMacVendorStr(int num) {

View File

@@ -20,6 +20,7 @@ extern String searchVendor(uint8_t* mac);
extern bool macMulticast(uint8_t* mac);
extern bool macValid(uint8_t* mac);
extern bool macBroadcast(uint8_t* mac);
extern String bytesToStr(uint8_t* b, uint32_t size);
class Stations {
public:
@@ -45,6 +46,8 @@ class Stations {
String getVendorStr(int num);
String getTimeStr(int num);
String getSelectedStr(int num);
uint8_t* getAPMac(int num);
String getAPMacStr(int num);
uint8_t* getMac(int num);
uint32_t* getPkts(int num);
uint32_t* getTime(int num);

View File

@@ -689,18 +689,6 @@ String formatBytes(size_t bytes) {
else return String(bytes / 1024.0 / 1024.0 / 1024.0) + "GB";
}
/*
void parseBytes(const char* str, char sep, byte* bytes, int maxBytes, int base) {
for (int i = 0; i < maxBytes; i++) {
bytes[i] = strtoul(str, NULL, base); // Convert byte
str = strchr(str, sep); // Find next separator
if (str == NULL || *str == '\0') {
break; // No more separators, exit
}
str++; // Point to next character after separator
}
}
*/
#endif

View File

@@ -68,6 +68,9 @@ function drawScan(){
for(var i=0;i<scanJson.stations.length;i++){
selected = scanJson.stations[i][scanJson.stations[i].length-1];
ap = "";
if(scanJson.stations[i][5] >= 0)
ap = esc(scanJson.aps[scanJson.stations[i][5]][0]);
html += (selected ? "<tr class='selected'>" : "<tr>")
+ "<td class='id'>"+i+"</td>" // ID
@@ -76,7 +79,7 @@ function drawScan(){
+ "<td class='ch'>"+esc(scanJson.stations[i][1])+"</td>" // Ch
+ "<td class='name'>"+(scanJson.stations[i][2].length > 0 ? esc(scanJson.stations[i][2]) : "<button onclick='add(1,"+i+")'>"+lang("add")+"</button>")+"</td>" // Name
+ "<td class='pkts'>"+esc(scanJson.stations[i][4])+"</td>" // Pkts
+ "<td class='ap'>"+esc(scanJson.aps[scanJson.stations[i][5]][0])+"</td>" // AP
+ "<td class='ap'>"+ap+"</td>" // AP
+ "<td class='lastseen'>"+esc(scanJson.stations[i][6])+"</td>" // Last seen
// Select
+ "<td class='selectColumn'><label class='checkBoxContainer'><input type='checkbox' "+(selected ? "checked" : "")+" onclick='selectRow(1,"+i+","+(selected ? "false" : "true")+")'><span class='checkmark'></span></label></td>"