Yarilo  v0.9
WPA2 Decrypter & Packet Analyzer
sniffer.h
Go to the documentation of this file.
1 #ifndef SNIFF_SNIFFER
2 #define SNIFF_SNIFFER
3 
4 #include "access_point.h"
5 #include "decrypter.h"
6 #include "net_card_manager.h"
7 #include "recording.h"
8 #include "uuid.h"
9 #include <tins/network_interface.h>
10 #include <tins/sniffer.h>
11 #include <unordered_map>
12 
13 namespace yarilo {
14 
15 enum ScanMode {
16  FOCUSED, // We are focused on one network and following its channel
17  GENERAL // We are hopping through the spectrum
18 };
19 
24 class Sniffer {
25 public:
26  typedef std::pair<MACAddress, SSID> network_name;
28 
33  Sniffer(std::unique_ptr<Tins::FileSniffer> sniffer,
34  const std::filesystem::path &filepath);
35 
41  Sniffer(std::unique_ptr<Tins::Sniffer> sniffer,
42  const Tins::NetworkInterface &iface);
43 
47  void start();
48 
53  std::set<network_name> all_networks();
54 
60  std::optional<MACAddress> get_bssid(const SSID &ssid);
61 
69  std::optional<std::shared_ptr<AccessPoint>> get_network(const SSID &ssid);
70 
77  std::optional<std::shared_ptr<AccessPoint>>
78  get_network(const MACAddress &bssid);
79 
84  void add_ignored_network(const SSID &ssid);
85 
90  void add_ignored_network(const MACAddress &bssid);
91 
96  std::unordered_map<MACAddress, SSID> ignored_networks();
97 
101  void shutdown();
102 
107  std::optional<std::string> iface();
108 
113  std::optional<std::filesystem::path> file();
114 
121  std::optional<uint32_t> focus_network(const SSID &ssid);
122 
129  std::optional<uint32_t> focus_network(const MACAddress &bssid);
130 
135  std::optional<std::shared_ptr<AccessPoint>> focused_network();
136 
140  void stop_focus();
141 
148  std::optional<Recording::info>
149  save_traffic(const std::filesystem::path &save_path, const std::string &name);
150 
157  std::optional<Recording::info>
158  save_decrypted_traffic(const std::filesystem::path &save_path,
159  const std::string &name);
160 
166  static std::vector<Recording::info>
167  available_recordings(const std::filesystem::path &save_path);
168 
175  static bool recording_exists(const std::filesystem::path &save_path,
176  const uuid::UUIDv4 &uuid);
177 
185  static std::optional<std::unique_ptr<PacketChannel>>
186  get_recording_stream(const std::filesystem::path &save_path,
187  const uuid::UUIDv4 &uuid);
188 
197  static std::optional<std::string>
198  detect_interface(std::shared_ptr<spdlog::logger> log,
199  const std::string &ifname);
200 
202  if (!filemode)
203  net_manager.disconnect();
204  }
205 
206 private:
212  bool handle_pkt(Tins::Packet &pkt);
213 
219  bool handle_data(Tins::Packet &pkt);
220 
226  bool handle_management(Tins::Packet &pkt);
227 
234  Tins::Packet *save_pkt(Tins::Packet &pkt);
235 
242  void hopper(int phy_idx, const std::vector<uint32_t> &channels);
243 
244  std::shared_ptr<spdlog::logger> logger;
245  std::vector<Tins::Packet> packets;
246  std::atomic<ScanMode> scan_mode = GENERAL;
247 
248  NetCardManager net_manager;
249  MACAddress focused;
250  bool filemode = true;
251  int count = 0;
252  int current_channel = 1;
253  std::unique_ptr<Tins::Crypto::WPA2Decrypter> decrypter;
254  std::unordered_map<MACAddress, std::shared_ptr<AccessPoint>> aps;
255  Tins::NetworkInterface send_iface;
256  std::string iface_name = "";
257  std::filesystem::path filepath;
258  std::unordered_map<MACAddress, SSID> ignored_nets;
259  std::unique_ptr<Tins::BaseSniffer> sniffer;
260  std::atomic<bool> finished;
261 };
262 
263 } // namespace yarilo
264 
265 #endif // SNIFF_SNIFFER
Manager for network card information gathering and state control.
Definition: net_card_manager.h:58
void disconnect()
Definition: net_card_manager.cpp:88
Packet sniffer and handler in charge of tracking, information gathering and decrypting passing data.
Definition: sniffer.h:24
Sniffer(std::unique_ptr< Tins::FileSniffer > sniffer, const std::filesystem::path &filepath)
Definition: sniffer.cpp:25
std::optional< Recording::info > save_traffic(const std::filesystem::path &save_path, const std::string &name)
Definition: sniffer.cpp:214
std::optional< Recording::info > save_decrypted_traffic(const std::filesystem::path &save_path, const std::string &name)
Definition: sniffer.cpp:227
std::optional< std::shared_ptr< AccessPoint > > get_network(const SSID &ssid)
Definition: sniffer.cpp:120
void stop_focus()
Definition: sniffer.cpp:206
std::set< network_name > all_networks()
Definition: sniffer.cpp:105
std::optional< std::shared_ptr< AccessPoint > > focused_network()
Definition: sniffer.cpp:198
~Sniffer()
Definition: sniffer.h:201
static std::optional< std::unique_ptr< PacketChannel > > get_recording_stream(const std::filesystem::path &save_path, const uuid::UUIDv4 &uuid)
Definition: sniffer.cpp:376
std::optional< uint32_t > focus_network(const SSID &ssid)
Definition: sniffer.cpp:181
std::optional< MACAddress > get_bssid(const SSID &ssid)
Definition: sniffer.cpp:112
void add_ignored_network(const SSID &ssid)
Definition: sniffer.cpp:134
static bool recording_exists(const std::filesystem::path &save_path, const uuid::UUIDv4 &uuid)
Definition: sniffer.cpp:369
std::optional< std::filesystem::path > file()
Definition: sniffer.cpp:175
std::unordered_map< MACAddress, SSID > ignored_networks()
Definition: sniffer.cpp:158
std::pair< MACAddress, SSID > network_name
Definition: sniffer.h:26
static MACAddress NoAddress
Definition: sniffer.h:27
static std::optional< std::string > detect_interface(std::shared_ptr< spdlog::logger > log, const std::string &ifname)
Definition: sniffer.cpp:408
std::optional< std::string > iface()
Definition: sniffer.cpp:169
static std::vector< Recording::info > available_recordings(const std::filesystem::path &save_path)
Definition: sniffer.cpp:354
void shutdown()
Definition: sniffer.cpp:162
void start()
Definition: sniffer.cpp:44
std::string UUIDv4
Definition: uuid.h:11
Definition: access_point.cpp:22
std::string SSID
Definition: decrypter.h:19
ScanMode
Definition: sniffer.h:15
@ GENERAL
Definition: sniffer.h:17
@ FOCUSED
Definition: sniffer.h:16
Tins::HWAddress< 6 > MACAddress
Definition: decrypter.h:20