Compare commits
	
		
			19 Commits
		
	
	
		
			f1e8069afd
			...
			4f1cb82f46
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 4f1cb82f46 | |||
| b7b7f6edbb | |||
| 8d67321d4b | |||
| 61f3c432c9 | |||
| 52119fe3cd | |||
| f938f8dd53 | |||
| 5b8a330e69 | |||
| 35e71ef44e | |||
| 8ef6318a56 | |||
| 9301c4e0fd | |||
| 4d8597b1d6 | |||
| 3c379a1a80 | |||
| 6710442067 | |||
| e191085cbd | |||
| f834ec7134 | |||
| 035491668a | |||
| 16028daf10 | |||
| 1ed9c84802 | |||
| a0ae919614 | 
| @ -4,8 +4,15 @@ | |||||||
| #include "./packet.hpp" | #include "./packet.hpp" | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
| class BeaconPacket : Packet{ | class BeaconPacket : public Packet{ | ||||||
|     std::string SSID; | public: | ||||||
|  |     BeaconPacket() | ||||||
|  |     {} | ||||||
|  |     BeaconPacket(const Packet &packet) | ||||||
|  |         : Packet(packet) | ||||||
|  |     {} | ||||||
|  | 
 | ||||||
|  |     std::string ssid; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif /* FDDB997A_BCD3_4056_BFEA_9FF6A548DACF */ | #endif /* FDDB997A_BCD3_4056_BFEA_9FF6A548DACF */ | ||||||
|  | |||||||
| @ -15,6 +15,18 @@ enum PacketType { | |||||||
|     NoData, |     NoData, | ||||||
|     Unknown |     Unknown | ||||||
| }; | }; | ||||||
|  | const std::array<const char*, 10> PACKET_TYPE_NAMES({{ | ||||||
|  |     "Beacon", | ||||||
|  |     "Probe Request", | ||||||
|  |     "Probe Response", | ||||||
|  |     "Data", | ||||||
|  |     "Request to send", | ||||||
|  |     "Clear to send", | ||||||
|  |     "Acknowledgment", | ||||||
|  |     "BlockAcknowledgment", | ||||||
|  |     "NoData", | ||||||
|  |     "Unknown" | ||||||
|  | }}); | ||||||
| 
 | 
 | ||||||
| struct Packet { | struct Packet { | ||||||
|     uint64_t timestampMicros; |     uint64_t timestampMicros; | ||||||
|  | |||||||
| @ -4,8 +4,15 @@ | |||||||
| #include "./packet.hpp" | #include "./packet.hpp" | ||||||
| #include <string> | #include <string> | ||||||
| 
 | 
 | ||||||
| class ProbeRequestPacket : Packet{ | class ProbeRequestPacket : public Packet{ | ||||||
|     std::string requestSSID; | public: | ||||||
|  |     ProbeRequestPacket() | ||||||
|  |     {} | ||||||
|  |     ProbeRequestPacket(const Packet &packet) | ||||||
|  |         : Packet(packet) | ||||||
|  |     {} | ||||||
|  | 
 | ||||||
|  |     std::string requestSsid; | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| #endif /* CD2BF199_8153_4F10_A85C_50883FAD66A8 */ | #endif /* CD2BF199_8153_4F10_A85C_50883FAD66A8 */ | ||||||
|  | |||||||
							
								
								
									
										18
									
								
								DTO/probeResponsePacket.hpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								DTO/probeResponsePacket.hpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,18 @@ | |||||||
|  | #ifndef B199B4B3_BE27_4F0C_8DBE_5E78580AB1A9 | ||||||
|  | #define B199B4B3_BE27_4F0C_8DBE_5E78580AB1A9 | ||||||
|  | 
 | ||||||
|  | #include "./packet.hpp" | ||||||
|  | #include <string> | ||||||
|  | 
 | ||||||
|  | class ProbeResponsePacket : public Packet{ | ||||||
|  | public: | ||||||
|  |     ProbeResponsePacket() | ||||||
|  |     {} | ||||||
|  |     ProbeResponsePacket(const Packet &packet) | ||||||
|  |         : Packet(packet) | ||||||
|  |     {} | ||||||
|  | 
 | ||||||
|  |     std::string responseSsid; | ||||||
|  | }; | ||||||
|  | 
 | ||||||
|  | #endif /* B199B4B3_BE27_4F0C_8DBE_5E78580AB1A9 */ | ||||||
| @ -1,17 +0,0 @@ | |||||||
| #ifndef EFFCCB40_3639_4BD4_9649_302F05987909 |  | ||||||
| #define EFFCCB40_3639_4BD4_9649_302F05987909 |  | ||||||
| 
 |  | ||||||
| #include <future> |  | ||||||
| #include <string.h> |  | ||||||
| #include "bufHandler.hpp" |  | ||||||
| 
 |  | ||||||
| void asyncHandler(char *buf){ |  | ||||||
|     // Create a copy of buf for our thread
 |  | ||||||
|     char bufCopy[265]; |  | ||||||
|     strcpy(bufCopy, buf); |  | ||||||
| 
 |  | ||||||
|     // \/ Surpress unused warning
 |  | ||||||
|     (void)std::async(std::launch::async, bufHandler, bufCopy); |  | ||||||
| } |  | ||||||
| 
 |  | ||||||
| #endif /* EFFCCB40_3639_4BD4_9649_302F05987909 */ |  | ||||||
| @ -1,22 +1,28 @@ | |||||||
| #ifndef C251BA62_6D80_4033_86B6_61F184E6F250 | #ifndef C251BA62_6D80_4033_86B6_61F184E6F250 | ||||||
| #define C251BA62_6D80_4033_86B6_61F184E6F250 | #define C251BA62_6D80_4033_86B6_61F184E6F250 | ||||||
| 
 | 
 | ||||||
|  | #include <future> | ||||||
| #include <string> | #include <string> | ||||||
| #include "textPacketHandler.hpp" | #include "textPacketHandler.hpp" | ||||||
| 
 | 
 | ||||||
| using namespace std::string_literals; | using namespace std::string_literals; | ||||||
| 
 | 
 | ||||||
| std::vector<std::string> buffer; | std::vector<std::string> buffer; | ||||||
| void bufHandler(char *buf){ | void bufHandler(const char *buf){ | ||||||
|  |     std::string line = buf; | ||||||
|  |     // Remove last char which is \n
 | ||||||
|  |     line = line.substr(0, line.size()-1); | ||||||
|  | 
 | ||||||
|     // When first char of buf has text (no tab), we got a new packet
 |     // When first char of buf has text (no tab), we got a new packet
 | ||||||
|     if(buf[0] != '\t'){ |     if(buf[0] != '\t'){ | ||||||
|         // Submit the just-read text-packet
 |         // Submit the just-read text-packet in a new thread
 | ||||||
|         if(buffer.size() != 0) textPacketHandler(buffer); |         if(buffer.size() != 0) { | ||||||
|         buffer = std::vector<std::string>(); |             (void)std::async(std::launch::async, textPacketHandler, buffer); | ||||||
|  |         } | ||||||
|  |         buffer = {line}; | ||||||
|     } |     } | ||||||
| 
 |     else | ||||||
|     // Append part-packet
 |         buffer.push_back(line);     // Append part-packet
 | ||||||
|     buffer.push_back(buf); |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif /* C251BA62_6D80_4033_86B6_61F184E6F250 */ | #endif /* C251BA62_6D80_4033_86B6_61F184E6F250 */ | ||||||
|  | |||||||
| @ -3,16 +3,20 @@ | |||||||
| 
 | 
 | ||||||
| #include <string> | #include <string> | ||||||
| #include "../DTO/packet.hpp" | #include "../DTO/packet.hpp" | ||||||
|  | #include "../DTO/beaconPacket.hpp" | ||||||
|  | #include "../DTO/probeRequestPacket.hpp" | ||||||
|  | #include "../DTO/probeResponsePacket.hpp" | ||||||
| #include <vector> | #include <vector> | ||||||
| #include <sstream> |  | ||||||
| #include <locale> | #include <locale> | ||||||
| #include <iomanip> | #include <iomanip> | ||||||
| #include "../helper/split.hpp" | #include "../helper/string-helper.hpp" | ||||||
| #include "../helper/timestampConvert.hpp" | #include "../helper/timestampConvert.hpp" | ||||||
| #include "../helper/find.hpp" | #include "../helper/find.hpp" | ||||||
| #include "../helper/vector-stats.hpp" | #include "../helper/vector-stats.hpp" | ||||||
| #include <unordered_map> | #include <unordered_map> | ||||||
| 
 | 
 | ||||||
|  | using namespace std::string_literals; | ||||||
|  | 
 | ||||||
| const std::unordered_map<std::string, PacketType> PACKET_TYPE_MAP({ | const std::unordered_map<std::string, PacketType> PACKET_TYPE_MAP({ | ||||||
|     {"Beacon", PacketType::Beacon}, |     {"Beacon", PacketType::Beacon}, | ||||||
|     {"Probe Request", PacketType::ProbeRequest}, |     {"Probe Request", PacketType::ProbeRequest}, | ||||||
| @ -24,11 +28,20 @@ const std::unordered_map<std::string, PacketType> PACKET_TYPE_MAP({ | |||||||
|     {"BA", PacketType::BlockAcknowledgment} |     {"BA", PacketType::BlockAcknowledgment} | ||||||
| }); | }); | ||||||
| 
 | 
 | ||||||
| void textPacketHandler(std::vector<std::string> textPacket){ | void parseHeader(Packet &packet, const std::vector<std::string> &textPacket); | ||||||
|  | void parsePayload(Packet &packet, const std::vector<std::string> &textPacket); | ||||||
|  | 
 | ||||||
|  | void textPacketHandler(const std::vector<std::string> textPacket){ | ||||||
|     /// Here we have to parse the packet
 |     /// Here we have to parse the packet
 | ||||||
|     // Create empty packet
 |     // Create empty packet
 | ||||||
|     Packet packet; |     Packet packet; | ||||||
| 
 | 
 | ||||||
|  |     parseHeader(packet, textPacket); | ||||||
|  |     parsePayload(packet, textPacket); | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void parseHeader(Packet &packet, const std::vector<std::string> &textPacket){ | ||||||
|     const std::string textHeader = textPacket[0]; |     const std::string textHeader = textPacket[0]; | ||||||
| 
 | 
 | ||||||
|     const std::vector<std::string> headerData = split(textHeader, ' '); |     const std::vector<std::string> headerData = split(textHeader, ' '); | ||||||
| @ -44,8 +57,14 @@ void textPacketHandler(std::vector<std::string> textPacket){ | |||||||
|     packet.frequency = std::stoi(headerData[frequencyIndex]); |     packet.frequency = std::stoi(headerData[frequencyIndex]); | ||||||
| 
 | 
 | ||||||
|     int signalIndex = findIs(headerData, "signal", 1, 1); |     int signalIndex = findIs(headerData, "signal", 1, 1); | ||||||
|  |     if(signalIndex != -1){ | ||||||
|     std::string signalText = headerData[signalIndex].substr(0, 3); |     std::string signalText = headerData[signalIndex].substr(0, 3); | ||||||
|     packet.signal = std::stoi(signalText); |     packet.signal = std::stoi(signalText); | ||||||
|  |     } | ||||||
|  |     else { | ||||||
|  |         fprintf(stderr, "Missing signal-data!\n"); | ||||||
|  |         packet.signal = -100; | ||||||
|  |     } | ||||||
| 
 | 
 | ||||||
|     // Addresses seem complicated at first, but just have many fields which might be available.
 |     // Addresses seem complicated at first, but just have many fields which might be available.
 | ||||||
|     // SA and DA are src- and dst-Addresses
 |     // SA and DA are src- and dst-Addresses
 | ||||||
| @ -62,8 +81,8 @@ void textPacketHandler(std::vector<std::string> textPacket){ | |||||||
|     int bssidIndex = findContains(headerData, "BSSID:", 1); |     int bssidIndex = findContains(headerData, "BSSID:", 1); | ||||||
|     std::string bssidAddr = (bssidIndex != -1) ? headerData[bssidIndex].substr("BSSID:"s.length()) : ""; |     std::string bssidAddr = (bssidIndex != -1) ? headerData[bssidIndex].substr("BSSID:"s.length()) : ""; | ||||||
| 
 | 
 | ||||||
|     int taIndex = findContains(headerData, "SA:", 1); |     int taIndex = findContains(headerData, "TA:", 1); | ||||||
|     std::string tAddr = (taIndex != -1) ? headerData[taIndex].substr("SA:"s.length()) : ""; |     std::string tAddr = (taIndex != -1) ? headerData[taIndex].substr("TA:"s.length()) : ""; | ||||||
| 
 | 
 | ||||||
|     int raIndex = findContains(headerData, "RA:", 1); |     int raIndex = findContains(headerData, "RA:", 1); | ||||||
|     std::string rAddr = (raIndex != -1) ? headerData[raIndex].substr("RA:"s.length()) : ""; |     std::string rAddr = (raIndex != -1) ? headerData[raIndex].substr("RA:"s.length()) : ""; | ||||||
| @ -92,10 +111,72 @@ void textPacketHandler(std::vector<std::string> textPacket){ | |||||||
| 
 | 
 | ||||||
|         // If type is in map, use map-value, otherwise keep default
 |         // If type is in map, use map-value, otherwise keep default
 | ||||||
|         if(PACKET_TYPE_MAP.find(textType) != PACKET_TYPE_MAP.end()) |         if(PACKET_TYPE_MAP.find(textType) != PACKET_TYPE_MAP.end()) | ||||||
|             type = PACKET_TYPE_MAP[textType]; |             type = PACKET_TYPE_MAP.at(textType); | ||||||
|  |          | ||||||
|  |         if(type == PacketType::Unknown){ | ||||||
|  |             fprintf(stderr, "Unknown package-type: %s\n", textType.c_str()); | ||||||
|  |         } | ||||||
|     } |     } | ||||||
|  |     packet.type = type; | ||||||
| 
 | 
 | ||||||
|     // 
 |     // Read data for specializations
 | ||||||
|  |     if(type == PacketType::Beacon){ | ||||||
|  |         // Create BeaconPacket from packet
 | ||||||
|  |         BeaconPacket beaconPacket = BeaconPacket(packet); | ||||||
|  |         packet = beaconPacket;      // Overwrite packet
 | ||||||
|  | 
 | ||||||
|  |         // Find ssid
 | ||||||
|  |         int start = textHeader.find('(')+1; | ||||||
|  |         std::string ssid = textHeader.substr(start, textHeader.find(')')-start); | ||||||
|  | 
 | ||||||
|  |         // Write to packet
 | ||||||
|  |         beaconPacket.ssid = ssid; | ||||||
|  |     } | ||||||
|  |     else if (type == PacketType::ProbeRequest){ | ||||||
|  |         // Create ProbeRequestPacket from packet
 | ||||||
|  |         ProbeRequestPacket probeRequestPacket = ProbeRequestPacket(packet); | ||||||
|  |         packet = probeRequestPacket;      // Overwrite packet
 | ||||||
|  | 
 | ||||||
|  |         // Find probe-request
 | ||||||
|  |         int start = textHeader.find('(')+1; | ||||||
|  |         std::string requestSsid = textHeader.substr(start, textHeader.find(')')-start); | ||||||
|  | 
 | ||||||
|  |         // Write to packet
 | ||||||
|  |         probeRequestPacket.requestSsid = requestSsid; | ||||||
|  |     } | ||||||
|  |     else if (type == PacketType::ProbeResponse){ | ||||||
|  |         // Create ProbeResponsePacket from packet
 | ||||||
|  |         ProbeResponsePacket probeResponsePacket = ProbeResponsePacket(packet); | ||||||
|  |         packet = probeResponsePacket;      // Overwrite packet
 | ||||||
|  | 
 | ||||||
|  |         // Find probe-request
 | ||||||
|  |         int start = textHeader.find('(')+1; | ||||||
|  |         std::string responseSsid = textHeader.substr(start, textHeader.find(')')-start); | ||||||
|  | 
 | ||||||
|  |         // Write to packet
 | ||||||
|  |         probeResponsePacket.responseSsid = responseSsid; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | 
 | ||||||
|  | void parsePayload(Packet &packet, const std::vector<std::string> &textPacket){ | ||||||
|  | 
 | ||||||
|  |     // Expect max of 16byte per line of payload
 | ||||||
|  |     unsigned int payloadSize = 16*(textPacket.size()-1); | ||||||
|  | 
 | ||||||
|  |     // Go through last line
 | ||||||
|  |     int line = textPacket.size()-1, charPos; | ||||||
|  |     for(int f=0; f<8*2; ++f){ | ||||||
|  |         charPos = 10 + (f/2.0*5); | ||||||
|  | 
 | ||||||
|  |         if(textPacket[line][charPos] == ' ') {    // When our char is space, no more data is present
 | ||||||
|  |             // Set size
 | ||||||
|  |             payloadSize = 16*(textPacket.size()-2)+f; | ||||||
|  |             break; | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  |      | ||||||
|  |     packet.payloadSize = payloadSize; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #endif /* EE781A91_6D07_47AC_B3C4_F99E29F3731F */ | #endif /* EE781A91_6D07_47AC_B3C4_F99E29F3731F */ | ||||||
|  | |||||||
| @ -8,8 +8,8 @@ | |||||||
| /// @param cmd is the command
 | /// @param cmd is the command
 | ||||||
| /// @param handler is the handler(char*)-function
 | /// @param handler is the handler(char*)-function
 | ||||||
| /// @return Return-code form command
 | /// @return Return-code form command
 | ||||||
| int exec(const char* cmd, void (*handler)(char*) = nullptr){ | int exec(const char* cmd, void (*handler)(const char*) = nullptr){ | ||||||
|     const int buf_size = 256; |     const int buf_size = 512; | ||||||
|     char buf[buf_size]; |     char buf[buf_size]; | ||||||
| 
 | 
 | ||||||
|     // Open execution-pipe
 |     // Open execution-pipe
 | ||||||
|  | |||||||
| @ -1,6 +1,10 @@ | |||||||
| #ifndef F7CFE6A7_34BF_4E04_94CF_DB8374980631 | #ifndef F7CFE6A7_34BF_4E04_94CF_DB8374980631 | ||||||
| #define F7CFE6A7_34BF_4E04_94CF_DB8374980631 | #define F7CFE6A7_34BF_4E04_94CF_DB8374980631 | ||||||
| 
 | 
 | ||||||
|  | #include <vector> | ||||||
|  | #include <string> | ||||||
|  | #include <sstream> | ||||||
|  | 
 | ||||||
| std::vector<std::string> split(const std::string& s, char delimiter) | std::vector<std::string> split(const std::string& s, char delimiter) | ||||||
| { | { | ||||||
|    std::vector<std::string> tokens; |    std::vector<std::string> tokens; | ||||||
| @ -13,4 +17,18 @@ std::vector<std::string> split(const std::string& s, char delimiter) | |||||||
|    return tokens; |    return tokens; | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | char hex_char_to_int(const char &c) { | ||||||
|  |     unsigned char result = 0; | ||||||
|  |     if( ('0' <= c) && (c <= '9') ) { | ||||||
|  |         result = c - '0'; | ||||||
|  |     } | ||||||
|  |     else if( ('A' <= c) && (c <= 'F') ) { | ||||||
|  |         result = 10 + c - 'A'; | ||||||
|  |     } | ||||||
|  |     else if( ('a' <= c) && (c <= 'f') ) { | ||||||
|  |         result = 10 + c - 'a'; | ||||||
|  |     } | ||||||
|  |     return result; | ||||||
|  | } | ||||||
|  | 
 | ||||||
| #endif /* F7CFE6A7_34BF_4E04_94CF_DB8374980631 */ | #endif /* F7CFE6A7_34BF_4E04_94CF_DB8374980631 */ | ||||||
							
								
								
									
										4
									
								
								main.cpp
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								main.cpp
									
									
									
									
									
								
							| @ -1,7 +1,7 @@ | |||||||
| #include <stdio.h> | #include <stdio.h> | ||||||
| #include <string> | #include <string> | ||||||
| #include "./helper/exec.hpp" | #include "./helper/exec.hpp" | ||||||
| #include "./handler/asyncHandler.hpp" | #include "./handler/bufHandler.hpp" | ||||||
| 
 | 
 | ||||||
| const std::string tcpdump_baseCmd = "tcpdump -vvv -e -n -X -s0 -i "; | const std::string tcpdump_baseCmd = "tcpdump -vvv -e -n -X -s0 -i "; | ||||||
| 
 | 
 | ||||||
| @ -15,7 +15,7 @@ int main(int argc, char *args[]){ | |||||||
|         exit(1); |         exit(1); | ||||||
|     } |     } | ||||||
|      |      | ||||||
|     int exitCode = exec(tcpdump_cmd.c_str(), &asyncHandler); |     int exitCode = exec(tcpdump_cmd.c_str(), &bufHandler); | ||||||
| 
 | 
 | ||||||
|     if(exitCode){ |     if(exitCode){ | ||||||
|         fprintf(stderr, "\ntcpdump exited with non-zero ExitCode: %d\n Something went wrong! Check tcpdump-output for more information.\n", exitCode); |         fprintf(stderr, "\ntcpdump exited with non-zero ExitCode: %d\n Something went wrong! Check tcpdump-output for more information.\n", exitCode); | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user