netkitty
Version:
Network tools kit
102 lines (101 loc) • 3.48 kB
JavaScript
;
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')
})));
}