Compare commits
No commits in common. "38985ea9e298f2e240eb4f31154d09b455835813" and "d0ee1a70441d3c1ff60cecbdceb15841454fe5f5" have entirely different histories.
38985ea9e2
...
d0ee1a7044
@ -3,6 +3,7 @@ const PacketType = {
|
|||||||
ProbeRequest: 'ProbeRequest',
|
ProbeRequest: 'ProbeRequest',
|
||||||
ProbeResponse: 'ProbeResponse',
|
ProbeResponse: 'ProbeResponse',
|
||||||
Data: 'Data',
|
Data: 'Data',
|
||||||
|
MoreData: 'MoreData',
|
||||||
RequestToSend: 'RequestToSend',
|
RequestToSend: 'RequestToSend',
|
||||||
ClearToSend: 'ClearToSend',
|
ClearToSend: 'ClearToSend',
|
||||||
Acknowledgment: 'Acknowledgment',
|
Acknowledgment: 'Acknowledgment',
|
||||||
@ -16,19 +17,9 @@ const PacketType = {
|
|||||||
Unknown: 'Unknown'
|
Unknown: 'Unknown'
|
||||||
}
|
}
|
||||||
|
|
||||||
const FlagType = {
|
|
||||||
MoreFragments: "MoreFragments",
|
|
||||||
Retry: "Retry",
|
|
||||||
PwrMgt: "PwrMgt",
|
|
||||||
MoreData: "MoreData",
|
|
||||||
Protected: "Protected",
|
|
||||||
Order: "Order"
|
|
||||||
}
|
|
||||||
|
|
||||||
class Packet{
|
class Packet{
|
||||||
timestampMicros;
|
timestampMicros;
|
||||||
|
isRetry;
|
||||||
flags = {};
|
|
||||||
|
|
||||||
srcMac;
|
srcMac;
|
||||||
dstMac;
|
dstMac;
|
||||||
@ -89,7 +80,6 @@ class HandshakePacket extends Packet{
|
|||||||
// Specify exports
|
// Specify exports
|
||||||
module.exports = {
|
module.exports = {
|
||||||
PacketType,
|
PacketType,
|
||||||
FlagType,
|
|
||||||
Packet,
|
Packet,
|
||||||
PacketWithSSID,
|
PacketWithSSID,
|
||||||
BeaconPacket,
|
BeaconPacket,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
const logger = require.main.require("./helper/logger.js")("PacketStreamFactory");
|
const logger = require.main.require("./helper/logger.js")("PacketStreamFactory");
|
||||||
const { Transform } = require('stream');
|
const { Transform } = require('stream');
|
||||||
const { DateTime } = require("luxon");
|
const { DateTime } = require("luxon");
|
||||||
const { PacketType, FlagType, Packet, PacketWithSSID, BeaconPacket, ProbeRequestPacket, ProbeResponsePacket, AuthenticationPacket, AuthenticationType, AssociationResponsePacket, DisassociationPacket, HandshakePacket, HandshakeStage } = require.main.require('./dto/Packet.js');
|
const { PacketType, Packet, PacketWithSSID, BeaconPacket, ProbeRequestPacket, ProbeResponsePacket, AuthenticationPacket, AuthenticationType, AssociationResponsePacket, DisassociationPacket, HandshakePacket, HandshakeStage } = require.main.require('./dto/Packet.js');
|
||||||
const hexConv = require.main.require("./helper/hexConverter.js");
|
const hexConv = require.main.require("./helper/hexConverter.js");
|
||||||
|
|
||||||
const PACKET_TYPE_MAP = {
|
const PACKET_TYPE_MAP = {
|
||||||
@ -9,6 +9,7 @@ const PACKET_TYPE_MAP = {
|
|||||||
"Probe Request": PacketType.ProbeRequest,
|
"Probe Request": PacketType.ProbeRequest,
|
||||||
"Probe Response": PacketType.ProbeResponse,
|
"Probe Response": PacketType.ProbeResponse,
|
||||||
"Data": PacketType.Data,
|
"Data": PacketType.Data,
|
||||||
|
"More Data": PacketType.MoreData,
|
||||||
"Request-To-Send": PacketType.RequestToSend,
|
"Request-To-Send": PacketType.RequestToSend,
|
||||||
"Clear-To-Send": PacketType.ClearToSend,
|
"Clear-To-Send": PacketType.ClearToSend,
|
||||||
"Acknowledgment": PacketType.Acknowledgment,
|
"Acknowledgment": PacketType.Acknowledgment,
|
||||||
@ -26,18 +27,14 @@ const AUTHENTICATION_TYPE_MAP = {
|
|||||||
"(Open System)-2": AuthenticationType.OpenSystem_2,
|
"(Open System)-2": AuthenticationType.OpenSystem_2,
|
||||||
}
|
}
|
||||||
|
|
||||||
const FLAG_TYPE_MAP = {
|
|
||||||
"Retry": FlagType.Retry,
|
|
||||||
"Pwr Mgmt": FlagType.PwrMgt,
|
|
||||||
"More Data": FlagType.MoreData,
|
|
||||||
"Protected": FlagType.Protected,
|
|
||||||
}
|
|
||||||
const FLAG_TYPE_MAPS_REGEX = Object.keys(FLAG_TYPE_MAP).join('|');
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Read data from text-blocks and convert them to Packet
|
* Read data from text-blocks and convert them to Packet
|
||||||
*/
|
*/
|
||||||
class PacketStreamFactory extends Transform{
|
class PacketStreamFactory extends Transform{
|
||||||
|
matcher;
|
||||||
|
withholdLastBlock;
|
||||||
|
matchAllOnFlush;
|
||||||
|
|
||||||
constructor(){
|
constructor(){
|
||||||
super({
|
super({
|
||||||
readableObjectMode: true,
|
readableObjectMode: true,
|
||||||
@ -53,6 +50,8 @@ class PacketStreamFactory extends Transform{
|
|||||||
packet = this._handleHeader(packet, header);
|
packet = this._handleHeader(packet, header);
|
||||||
packet = this._handlePayload(packet, lines);
|
packet = this._handlePayload(packet, lines);
|
||||||
|
|
||||||
|
logger.debug(packet);
|
||||||
|
|
||||||
next(null, packet); // Get next chunk
|
next(null, packet); // Get next chunk
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -60,10 +59,7 @@ class PacketStreamFactory extends Transform{
|
|||||||
// Convert time to epoch-micros Unfortunately luxon doesnt use micros, but millis as smallest time-unit requiring some "hacks"
|
// Convert time to epoch-micros Unfortunately luxon doesnt use micros, but millis as smallest time-unit requiring some "hacks"
|
||||||
packet.timestampMicros = DateTime.fromISO(data.slice(0, 12)).toSeconds() + data.slice(12, 15)/1000000;
|
packet.timestampMicros = DateTime.fromISO(data.slice(0, 12)).toSeconds() + data.slice(12, 15)/1000000;
|
||||||
|
|
||||||
// Find flags
|
packet.isRetry = data.match(/(?<=^|\s)Retry(?=$|\s)/i)? true: false;
|
||||||
data.match(data.match(new RegExp('(?<=^|\\s)('+ FLAG_TYPE_MAPS_REGEX +')(?=$|\\s)', 'ig'))
|
|
||||||
?.forEach(match => packet.flags[FLAG_TYPE_MAP[match]] = true) // Set them to true in flags
|
|
||||||
);
|
|
||||||
|
|
||||||
packet.dataRate = Number(data.match(/(?<=^|\s)[0-9]+(\.[0-9]+)?(?=\sMb\/?s($|\s))/i)?.[0]) || null;
|
packet.dataRate = Number(data.match(/(?<=^|\s)[0-9]+(\.[0-9]+)?(?=\sMb\/?s($|\s))/i)?.[0]) || null;
|
||||||
packet.frequency = Number(data.match(/(?<=^|\s)[0-9]{4}(?=\sMHz($|\s))/i)?.[0]) || null;
|
packet.frequency = Number(data.match(/(?<=^|\s)[0-9]{4}(?=\sMHz($|\s))/i)?.[0]) || null;
|
||||||
@ -73,10 +69,8 @@ class PacketStreamFactory extends Transform{
|
|||||||
packet.signal = Number(data.match(/(?<=^|\s)-[0-9]{2,3}(?=dBm\sSignal($|\s))/i)?.[0]) || null;
|
packet.signal = Number(data.match(/(?<=^|\s)-[0-9]{2,3}(?=dBm\sSignal($|\s))/i)?.[0]) || null;
|
||||||
|
|
||||||
let packetTypeStr = data.match(new RegExp('(?<=^|\\s)('+ PACKET_TYPES_REGEX +')(?=$|\\s)', 'i'))?.[0];
|
let packetTypeStr = data.match(new RegExp('(?<=^|\\s)('+ PACKET_TYPES_REGEX +')(?=$|\\s)', 'i'))?.[0];
|
||||||
packet.packetType = packetTypeStr? PACKET_TYPE_MAP[packetTypeStr]:
|
packet.packetType = packetTypeStr? PACKET_TYPE_MAP[packetTypeStr]: PacketType.Unknown;
|
||||||
data.match(/(SA|TA|DA|RA|BSSID):.{17}\s*$/i)? PacketType.NoData:
|
|
||||||
PacketType.Unknown;
|
|
||||||
|
|
||||||
packet.srcMac = data.match(/(?<=(^|\s)(SA|TA):).{17}(?=$|\s)/i)?.[0] ?? null;
|
packet.srcMac = data.match(/(?<=(^|\s)(SA|TA):).{17}(?=$|\s)/i)?.[0] ?? null;
|
||||||
|
|
||||||
packet.dstMac = data.match(/(?<=(^|\s)(DA|RA):).{17}(?=$|\s)/i)?.[0] ?? null;
|
packet.dstMac = data.match(/(?<=(^|\s)(DA|RA):).{17}(?=$|\s)/i)?.[0] ?? null;
|
||||||
@ -118,8 +112,7 @@ class PacketStreamFactory extends Transform{
|
|||||||
data = data.join('');
|
data = data.join('');
|
||||||
|
|
||||||
// Get payload-Hex-Data. If there is no data: empty
|
// Get payload-Hex-Data. If there is no data: empty
|
||||||
packet.payloadData = hexConv.hexToBytes(data.match(/(?<=\s)([A-F0-9]{1,4}(?=\s))/igm)?.join('') ?? '');
|
packet.payloadData = hexConv.hexToBytes(data.match(/(?<=\s)([A-F0-9]{1,4}(?!(\.|x)))/igm)?.join('') ?? '');
|
||||||
packet.payloadData.splice(packet.payloadData.length-4, 4); // Remove FrameCheck sequence
|
|
||||||
|
|
||||||
// Cover special cases with more data
|
// Cover special cases with more data
|
||||||
let newPacket;
|
let newPacket;
|
||||||
@ -128,8 +121,8 @@ class PacketStreamFactory extends Transform{
|
|||||||
newPacket = new HandshakePacket();
|
newPacket = new HandshakePacket();
|
||||||
|
|
||||||
// Read key-information
|
// Read key-information
|
||||||
const keyInfoRaw = (packet.payloadData[0x5]<<0x8) + packet.payloadData[0x6];
|
let keyInfoRaw = (packet.payloadData[0x5]<<0x8) + packet.payloadData[0x6];
|
||||||
const keyInfo = {
|
let keyInfo = {
|
||||||
"KeyDescriptorVersion": keyInfoRaw>>0 & 0b111,
|
"KeyDescriptorVersion": keyInfoRaw>>0 & 0b111,
|
||||||
"KeyType": keyInfoRaw>>3 & 0b1,
|
"KeyType": keyInfoRaw>>3 & 0b1,
|
||||||
"KeyIndex": keyInfoRaw>>4 & 0b11,
|
"KeyIndex": keyInfoRaw>>4 & 0b11,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user