备份: 完整开发状态(含反混淆脚本和临时文件)
This commit is contained in:
121
deobfuscate_full.js
Normal file
121
deobfuscate_full.js
Normal 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}`));
|
||||
Reference in New Issue
Block a user