UNPKG

netkitty

Version:
102 lines (101 loc) 3.48 kB
"use strict"; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.GeneratePCAPHeader = GeneratePCAPHeader; exports.GeneratePCAPData = GeneratePCAPData; exports.GeneratePCAP = GeneratePCAP; /** * 由pcap-generator库改写 * @see:https://github.com/onomondo/pcap-generator/tree/master */ const bignumber_js_1 = __importDefault(require("bignumber.js")); const headerOptions = { majorVersion: 2, minorVersion: 4, gmtOffset: 0, timestampAccuracy: 0, snapshotLength: 65535, linkLayerType: 1 }; function generate(packets) { const globalHeader = GeneratePCAPHeader(); const packetsBuffer = Buffer.concat(packets.map((packet) => GeneratePCAPData(packet))); return Buffer.concat([globalHeader, packetsBuffer]); } /** * Converts a timestamp in milliseconds to an integer of the seconds part and an integer of the microseconds part * * @param ms */ function convertMillisecond2Microsecond(ms) { const [seconds, microseconds] = new bignumber_js_1.default(ms).dividedBy(1000).toFixed(6).split('.').map(value => parseInt(value)); return [seconds, microseconds]; } function makeLessThanAMillion(i) { while (i > 1000000) { i = Math.floor(i / 10); } return i; } /** * Generate pcap file header's buffer * @constructor */ function GeneratePCAPHeader() { const globalHeader = Buffer.alloc(24); globalHeader.writeUInt32BE(2712847316, 0); // 4 globalHeader.writeUInt16BE(headerOptions.majorVersion, 4); // 2 globalHeader.writeUInt16BE(headerOptions.minorVersion, 6); // 2 globalHeader.writeInt32BE(headerOptions.gmtOffset, 8); // 4 globalHeader.writeUInt32BE(headerOptions.timestampAccuracy, 12); // 4 globalHeader.writeUInt32BE(headerOptions.snapshotLength, 16); // 4 globalHeader.writeUInt32BE(headerOptions.linkLayerType, 20); // 4 return globalHeader; } /** * Generate single record data in pcap file * @param packet * @constructor */ function GeneratePCAPData(packet) { const packetHeader = Buffer.alloc(16); let seconds; let microseconds; if (packet.microsecond) { seconds = packet.microsecond.seconds; microseconds = packet.microsecond.microseconds; } else { if (packet.timestamp) { [seconds, microseconds] = convertMillisecond2Microsecond(packet.timestamp); } else { seconds = 0; microseconds = 0; } } packetHeader.writeUInt32BE(seconds, 0); // 4 if (packet.microsecond) { packetHeader.writeUInt32BE(microseconds, 4); // 4 - if in microsecond precision then remove excess of 1,000,000 (see documentation) } else { packetHeader.writeUInt32BE(makeLessThanAMillion(microseconds), 4); // 4 - if in microsecond precision then remove excess of 1,000,000 (see documentation) } packetHeader.writeUInt32BE(packet.buffer.length, 8); // 4 packetHeader.writeUInt32BE(packet.buffer.length, 12); // 4 return Buffer.concat([packetHeader, packet.buffer]); } /** * Generate whole pcap file buffer data * @param packets * @constructor */ function GeneratePCAP(packets = []) { return generate(packets.map((packet) => ({ timestamp: packet.timestamp, microsecond: packet.microsecond, buffer: Buffer.from(packet.frameBase64Data, 'base64') }))); }