备份: 完整开发状态(含反混淆脚本和临时文件)

This commit is contained in:
ccdojox-crypto
2025-12-17 17:18:02 +08:00
parent 9e2333c90c
commit 7e9ea173a7
2872 changed files with 326818 additions and 249 deletions

121
deobfuscate_full.js Normal file
View File

@@ -0,0 +1,121 @@
/**
* CursorPro 完整反编译脚本
* 解码所有混淆字符串并生成干净代码
*/
const fs = require('fs');
// 读取原版代码
const code = fs.readFileSync('D:/temp/破解/cursorpro-0.4.5/原版本/extension/out/api/client.js', 'utf8');
// 设置 vip
var vip = 'cursor';
// 1. 定义 _0x81f8 函数
const func81f8Start = code.indexOf('function _0x81f8()');
const func81f8End = code.indexOf('return _0x81f8();}', func81f8Start) + 'return _0x81f8();}'.length;
const func81f8Code = code.substring(func81f8Start, func81f8End);
eval(func81f8Code);
// 2. 定义 _0x3fbb 函数
const func3fbbStart = code.indexOf('function _0x3fbb(');
const func3fbbEnd = code.indexOf(',_0x3fbb(_0x91e0a,_0x2e3a7e);}', func3fbbStart) + ',_0x3fbb(_0x91e0a,_0x2e3a7e);}'.length;
const func3fbbCode = code.substring(func3fbbStart, func3fbbEnd);
eval(func3fbbCode);
// 3. 执行混淆IIFE
const iifeStart = code.indexOf("const _0x1ede40=_0x3fbb;");
const iifeEnd = code.indexOf("var __createBinding");
let iifeCode = code.substring(iifeStart, iifeEnd).trim();
if (iifeCode.endsWith(';')) {
iifeCode = iifeCode.slice(0, -1);
}
eval(iifeCode);
console.log('解码器初始化成功');
console.log('原版API地址:', _0x3fbb(0x18a, 'yC20'));
// 收集所有解码调用
const decode = _0x3fbb;
const decodedMap = new Map();
// 匹配所有解码调用: _0x变量名(0x数字, '字符串')
const regex = /_0x[a-zA-Z0-9]+\s*\(\s*(0x[0-9a-fA-F]+)\s*,\s*'([^']+)'\s*\)/g;
let match;
while ((match = regex.exec(code)) !== null) {
const fullMatch = match[0];
const index = parseInt(match[1], 16);
const key = match[2];
if (!decodedMap.has(fullMatch)) {
try {
const decoded = decode(index, key);
decodedMap.set(fullMatch, decoded);
} catch (e) {
console.log(`解码失败: ${fullMatch} - ${e.message}`);
}
}
}
console.log(`\n共解码 ${decodedMap.size} 个字符串\n`);
// 输出所有解码结果
console.log('=== 解码映射表 ===');
const sortedEntries = [...decodedMap.entries()].sort((a, b) => a[1].localeCompare(b[1]));
for (const [call, decoded] of sortedEntries) {
console.log(`${decoded.padEnd(40)} <- ${call}`);
}
// 保存映射表
const mapObj = {};
for (const [call, decoded] of decodedMap) {
mapObj[call] = decoded;
}
fs.writeFileSync('D:/temp/破解/cursorpro-0.4.5/decoded_map.json', JSON.stringify(mapObj, null, 2));
console.log('\n映射表已保存到 decoded_map.json');
// 生成干净代码
let cleanCode = code;
// 替换所有解码调用
for (const [call, decoded] of decodedMap) {
// 转义特殊字符
const escapedCall = call.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
const regex = new RegExp(escapedCall, 'g');
// 正确转义字符串值
const escapedDecoded = JSON.stringify(decoded);
cleanCode = cleanCode.replace(regex, escapedDecoded);
}
// 移除混淆函数定义
// 移除 _0x81f8 函数
cleanCode = cleanCode.replace(/function _0x81f8\(\)\{[\s\S]*?return _0x81f8\(\);\}/, '');
// 移除 _0x3fbb 函数
cleanCode = cleanCode.replace(/function _0x3fbb\([\s\S]*?,_0x3fbb\(_0x91e0a,_0x2e3a7e\);\}/, '');
// 移除IIFE
const cleanIifeStart = cleanCode.indexOf("const _0x1ede40=");
const cleanIifeEnd = cleanCode.indexOf("var __createBinding");
if (cleanIifeStart >= 0 && cleanIifeEnd > cleanIifeStart) {
cleanCode = cleanCode.substring(0, cleanIifeStart) + cleanCode.substring(cleanIifeEnd);
}
// 移除开头的 vip 声明
cleanCode = cleanCode.replace(/^var vip='cursor';'use strict';/, "'use strict';");
// 清理多余空白
cleanCode = cleanCode.replace(/\n\s*\n\s*\n/g, '\n\n');
// 保存干净代码
fs.writeFileSync('D:/temp/破解/cursorpro-0.4.5/client_clean.js', cleanCode);
console.log('干净代码已保存到 client_clean.js');
// 输出关键API信息
console.log('\n=== 关键API信息 ===');
console.log('DEFAULT_API_URL:', _0x3fbb(0x18a, 'yC20'));
console.log('/api/verify-key:', _0x3fbb(0x197, 'Kfdi'));
console.log('/api/switch-account:', _0x3fbb(0x141, 'z&uV'));
// 列出所有API端点
console.log('\n=== 所有API端点 ===');
const apiEndpoints = [...decodedMap.values()].filter(v => v.startsWith('/api/'));
apiEndpoints.forEach(ep => console.log(` ${ep}`));