备份: 完整开发状态(含反混淆脚本和临时文件)
This commit is contained in:
122
final_check.js
Normal file
122
final_check.js
Normal file
@@ -0,0 +1,122 @@
|
||||
/**
|
||||
* 最终全面检查 - 反混淆结果验证
|
||||
*/
|
||||
const fs = require('fs');
|
||||
const babel = require('@babel/core');
|
||||
|
||||
const inputPath = 'D:/temp/破解/cursorpro-0.4.5/deobfuscated_full/extension/out/webview/provider.js';
|
||||
const code = fs.readFileSync(inputPath, 'utf8');
|
||||
|
||||
console.log('='.repeat(50));
|
||||
console.log(' provider.js 反混淆最终检查报告');
|
||||
console.log('='.repeat(50));
|
||||
|
||||
// 1. 语法检查
|
||||
console.log('\n1. 语法验证:');
|
||||
try {
|
||||
babel.parseSync(code, { sourceType: 'script' });
|
||||
console.log(' ✅ 语法正确');
|
||||
} catch (e) {
|
||||
console.log(' ❌ 语法错误:', e.message);
|
||||
}
|
||||
|
||||
// 2. 混淆特征检查
|
||||
console.log('\n2. 混淆特征检查:');
|
||||
|
||||
// _0x 开头的变量名
|
||||
const oxPattern = /_0x[a-f0-9]+/gi;
|
||||
const oxMatches = code.match(oxPattern) || [];
|
||||
console.log(` _0x 变量名: ${oxMatches.length === 0 ? '✅ 无' : '❌ ' + oxMatches.length + ' 个'}`);
|
||||
|
||||
// Unicode 转义
|
||||
const unicodePattern = /\\u[0-9a-fA-F]{4}/g;
|
||||
const unicodeMatches = code.match(unicodePattern) || [];
|
||||
console.log(` Unicode 转义: ${unicodeMatches.length === 0 ? '✅ 无' : '❌ ' + unicodeMatches.length + ' 个'}`);
|
||||
|
||||
// 加密字符串调用 (如 _0x1234('0x0'))
|
||||
const encryptedCallPattern = /_0x[a-f0-9]+\s*\(\s*['"]0x/gi;
|
||||
const encryptedCalls = code.match(encryptedCallPattern) || [];
|
||||
console.log(` 加密字符串调用: ${encryptedCalls.length === 0 ? '✅ 无' : '❌ ' + encryptedCalls.length + ' 个'}`);
|
||||
|
||||
// 死代码分支 (如 "xxx" === "xxx" 或 "xxx" !== "yyy")
|
||||
const deadCodePattern = /["'][a-zA-Z]+["']\s*[!=]==\s*["'][a-zA-Z]+["']/g;
|
||||
const deadCodeMatches = code.match(deadCodePattern) || [];
|
||||
console.log(` 死代码分支: ${deadCodeMatches.length === 0 ? '✅ 无' : '⚠️ ' + deadCodeMatches.length + ' 个 (可能是正常代码)'}`);
|
||||
|
||||
// 泛型变量名 (var0-9, v0-9, param 等是正常的)
|
||||
const genericVarPattern = /\b(var[0-9]{2,}|v[0-9]{2,})\b/g;
|
||||
const genericVars = code.match(genericVarPattern) || [];
|
||||
const uniqueGeneric = [...new Set(genericVars)];
|
||||
if (uniqueGeneric.length > 0) {
|
||||
console.log(` 泛型变量名: ⚠️ ${uniqueGeneric.length} 种`);
|
||||
console.log(` 示例: ${uniqueGeneric.slice(0, 5).join(', ')}`);
|
||||
} else {
|
||||
console.log(` 泛型变量名: ✅ 无`);
|
||||
}
|
||||
|
||||
// 3. 代码质量统计
|
||||
console.log('\n3. 代码质量统计:');
|
||||
|
||||
const lines = code.split('\n');
|
||||
console.log(` 总行数: ${lines.length}`);
|
||||
console.log(` 文件大小: ${(code.length / 1024).toFixed(2)} KB`);
|
||||
|
||||
// 中文字符数量
|
||||
const chineseChars = (code.match(/[\u4e00-\u9fff]/g) || []).length;
|
||||
console.log(` 中文字符: ${chineseChars} 个`);
|
||||
|
||||
// 函数数量
|
||||
const funcCount = (code.match(/function\s*\(/g) || []).length;
|
||||
const arrowCount = (code.match(/=>\s*{/g) || []).length;
|
||||
const asyncCount = (code.match(/async\s+(function|\()/g) || []).length;
|
||||
console.log(` 函数定义: ${funcCount + arrowCount} 个 (含 ${asyncCount} 个 async)`);
|
||||
|
||||
// 类方法数量
|
||||
const methodCount = (code.match(/async\s+_?[a-zA-Z]+\s*\(/g) || []).length;
|
||||
console.log(` 类方法: ${methodCount} 个`);
|
||||
|
||||
// 4. 关键功能检查
|
||||
console.log('\n4. 关键功能保留检查:');
|
||||
|
||||
const keyFeatures = [
|
||||
['CursorProViewProvider', '主类'],
|
||||
['verifyKey', '验证激活码'],
|
||||
['switchSeamlessToken', '换号功能'],
|
||||
['_handleActivate', '激活处理'],
|
||||
['_handleInjectSeamless', '无感换号注入'],
|
||||
['_writeHostsFile', 'hosts文件写入'],
|
||||
['_getCursorInstallPath', '获取Cursor路径'],
|
||||
['sqliteSetBatch', 'SQLite批量写入'],
|
||||
['CURRENT_VERSION', '版本号'],
|
||||
['SNI_PROXY_IP', '代理IP']
|
||||
];
|
||||
|
||||
keyFeatures.forEach(([feature, desc]) => {
|
||||
const exists = code.includes(feature);
|
||||
console.log(` ${exists ? '✅' : '❌'} ${desc} (${feature})`);
|
||||
});
|
||||
|
||||
// 5. 显示一些关键配置
|
||||
console.log('\n5. 关键配置提取:');
|
||||
|
||||
// 版本号
|
||||
const versionMatch = code.match(/CURRENT_VERSION\s*=\s*['"]([^'"]+)['"]/);
|
||||
if (versionMatch) {
|
||||
console.log(` 版本号: ${versionMatch[1]}`);
|
||||
}
|
||||
|
||||
// SNI代理IP
|
||||
const proxyMatch = code.match(/SNI_PROXY_IP\s*=\s*['"]([^'"]+)['"]/);
|
||||
if (proxyMatch) {
|
||||
console.log(` SNI代理IP: ${proxyMatch[1]}`);
|
||||
}
|
||||
|
||||
// Cursor域名
|
||||
const domainsMatch = code.match(/CURSOR_DOMAINS\s*=\s*\[([^\]]+)\]/);
|
||||
if (domainsMatch) {
|
||||
console.log(` Cursor域名: ${domainsMatch[1].replace(/["']/g, '')}`);
|
||||
}
|
||||
|
||||
console.log('\n' + '='.repeat(50));
|
||||
console.log(' 检查完成');
|
||||
console.log('='.repeat(50));
|
||||
Reference in New Issue
Block a user