Browse Source

Merge pull request #366 from LeaveC/master

免重置机器码,完美去除app机器码校验
pull/387/head v0.0.137
煎饼果子卷鲨鱼辣椒 2 months ago
committed by GitHub
parent
commit
f130869f51
No known key found for this signature in database GPG Key ID: B5690EEEBB952194
  1. 1280
      scripts/run/cursor_linux_id_modifier.sh
  2. 364
      scripts/run/cursor_mac_id_modifier.sh

1280
scripts/run/cursor_linux_id_modifier.sh
File diff suppressed because it is too large
View File

364
scripts/run/cursor_mac_id_modifier.sh

@ -134,26 +134,6 @@ check_and_kill_cursor() {
exit 1
}
# 备份系统 ID
backup_system_id() {
log_info "正在备份系统 ID..."
local system_id_file="$BACKUP_DIR/system_id.backup_$(date +%Y%m%d_%H%M%S)"
# 获取并备份 IOPlatformExpertDevice 信息
{
echo "# Original System ID Backup" > "$system_id_file"
echo "## IOPlatformExpertDevice Info:" >> "$system_id_file"
ioreg -rd1 -c IOPlatformExpertDevice >> "$system_id_file"
chmod 444 "$system_id_file"
chown "$CURRENT_USER" "$system_id_file"
log_info "系统 ID 已备份到: $system_id_file"
} || {
log_error "备份系统 ID 失败"
return 1
}
}
# 备份配置文件
backup_config() {
if [ ! -f "$STORAGE_FILE" ]; then
@ -246,86 +226,61 @@ modify_or_add_config() {
# 生成新的配置
generate_new_config() {
# 修改系统 ID
log_info "正在修改系统 ID..."
echo "[CONFIG] 开始修改系统 ID" >> "$LOG_FILE"
# 备份当前系统 ID
backup_system_id
# 生成新的系统 UUID
local new_system_uuid=$(uuidgen)
echo "[CONFIG] 生成新的系统 UUID: $new_system_uuid" >> "$LOG_FILE"
# 修改系统 UUID
sudo nvram SystemUUID="$new_system_uuid"
echo "[CONFIG] 已设置系统 UUID" >> "$LOG_FILE"
printf "${YELLOW}系统 UUID 已更新为: $new_system_uuid${NC}\n"
printf "${YELLOW}请重启系统以使更改生效${NC}\n"
# 将 auth0|user_ 转换为字节数组的十六进制
local prefix_hex=$(echo -n "auth0|user_" | xxd -p)
local random_part=$(generate_random_id)
local machine_id="${prefix_hex}${random_part}"
local mac_machine_id=$(generate_random_id)
local device_id=$(generate_uuid | tr '[:upper:]' '[:lower:]')
local sqm_id="{$(generate_uuid | tr '[:lower:]' '[:upper:]')}"
echo "[CONFIG] 生成的 ID:" >> "$LOG_FILE"
echo "[CONFIG] machine_id: $machine_id" >> "$LOG_FILE"
echo "[CONFIG] mac_machine_id: $mac_machine_id" >> "$LOG_FILE"
echo "[CONFIG] device_id: $device_id" >> "$LOG_FILE"
echo "[CONFIG] sqm_id: $sqm_id" >> "$LOG_FILE"
log_info "正在修改配置文件..."
# 检查配置文件是否存在
if [ ! -f "$STORAGE_FILE" ]; then
log_error "未找到配置文件: $STORAGE_FILE"
log_warn "请先安装并运行一次 Cursor 后再使用此脚本"
exit 1
fi
# 确保配置文件目录存在
mkdir -p "$(dirname "$STORAGE_FILE")" || {
log_error "无法创建配置目录"
exit 1
}
# 如果文件不存在,创建一个基本的 JSON 结构
if [ ! -s "$STORAGE_FILE" ]; then
echo '{}' > "$STORAGE_FILE" || {
log_error "无法初始化配置文件"
exit 1
}
fi
echo
log_warn "机器码重置选项"
# 修改现有文件
modify_or_add_config "telemetry.machineId" "$machine_id" "$STORAGE_FILE" || exit 1
modify_or_add_config "telemetry.macMachineId" "$mac_machine_id" "$STORAGE_FILE" || exit 1
modify_or_add_config "telemetry.devDeviceId" "$device_id" "$STORAGE_FILE" || exit 1
modify_or_add_config "telemetry.sqmId" "$sqm_id" "$STORAGE_FILE" || exit 1
# 使用菜单选择函数询问用户是否重置机器码
select_menu_option "是否需要重置机器码? (通常情况下,只修改js文件即可):" "不重置 - 仅修改js文件即可|重置 - 同时修改配置文件和机器码" 0
reset_choice=$?
# 设置文件权限和所有者
chmod 444 "$STORAGE_FILE" # 改为只读权限
chown "$CURRENT_USER" "$STORAGE_FILE"
# 记录日志以便调试
echo "[INPUT_DEBUG] 机器码重置选项选择: $reset_choice" >> "$LOG_FILE"
# 验证权限设置
if [ -w "$STORAGE_FILE" ]; then
log_warn "无法设置只读权限,尝试使用其他方法..."
chattr +i "$STORAGE_FILE" 2>/dev/null || true
# 处理用户选择 - 索引0对应"不重置"选项,索引1对应"重置"选项
if [ "$reset_choice" = "1" ]; then
log_info "您选择了重置机器码"
# 确保配置文件目录存在
if [ -f "$STORAGE_FILE" ]; then
log_info "发现已有配置文件: $STORAGE_FILE"
# 备份现有配置(以防万一)
backup_config
# 生成并设置新的设备ID
local new_device_id=$(generate_uuid)
local new_machine_id="auth0|user_$(openssl rand -hex 16)"
log_info "正在设置新的设备和机器ID..."
log_debug "新设备ID: $new_device_id"
log_debug "新机器ID: $new_machine_id"
# 修改配置文件
if modify_or_add_config "deviceId" "$new_device_id" "$STORAGE_FILE" && \
modify_or_add_config "machineId" "$new_machine_id" "$STORAGE_FILE"; then
log_info "配置文件修改成功"
else
log_error "配置文件修改失败"
fi
else
log_warn "未找到配置文件,这是正常的,脚本将跳过ID修改"
fi
else
log_info "成功设置文件只读权限"
log_info "您选择了不重置机器码,将仅修改js文件"
# 确保配置文件目录存在
if [ -f "$STORAGE_FILE" ]; then
log_info "发现已有配置文件: $STORAGE_FILE"
# 备份现有配置(以防万一)
backup_config
else
log_warn "未找到配置文件,这是正常的,脚本将跳过ID修改"
fi
fi
echo
log_info "已更新配置: $STORAGE_FILE"
log_debug "machineId: $machine_id"
log_debug "macMachineId: $mac_machine_id"
log_debug "devDeviceId: $device_id"
log_debug "sqmId: $sqm_id"
log_info "配置处理完成"
}
# 清理 Cursor 之前的修改
@ -377,8 +332,9 @@ modify_cursor_app_files() {
return 1
fi
# 定义目标文件
# 定义目标文件 - 将extensionHostProcess.js放在最前面优先处理
local target_files=(
"${CURSOR_APP_PATH}/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js"
"${CURSOR_APP_PATH}/Contents/Resources/app/out/main.js"
"${CURSOR_APP_PATH}/Contents/Resources/app/out/vs/code/node/cliProcessMain.js"
)
@ -497,9 +453,10 @@ modify_cursor_app_files() {
fi
done
# 修改目标文件
# 修改目标文件 - 优先处理js文件
local modified_count=0
local files=(
"${temp_app}/Contents/Resources/app/out/vs/workbench/api/node/extensionHostProcess.js"
"${temp_app}/Contents/Resources/app/out/main.js"
"${temp_app}/Contents/Resources/app/out/vs/code/node/cliProcessMain.js"
)
@ -527,7 +484,45 @@ modify_cursor_app_files() {
}
# 使用 sed 替换而不是字符串操作
if grep -q "IOPlatformUUID" "$file"; then
if [[ "$file" == *"extensionHostProcess.js"* ]]; then
log_debug "处理 extensionHostProcess.js 文件..."
echo "[PROCESS_DETAIL] 开始处理 extensionHostProcess.js 文件" >> "$LOG_FILE"
# 检查是否包含目标代码
if grep -q 'i.header.set("x-cursor-checksum' "$file"; then
log_debug "找到 x-cursor-checksum 设置代码"
echo "[FOUND] 找到 x-cursor-checksum 设置代码" >> "$LOG_FILE"
# 记录匹配的行到日志
grep -n 'i.header.set("x-cursor-checksum' "$file" >> "$LOG_FILE"
# 执行特定的替换
if sed -i.tmp 's/i\.header\.set("x-cursor-checksum",e===void 0?`${p}${t}`:`${p}${t}\/${e}`)/i.header.set("x-cursor-checksum",e===void 0?`${p}${t}`:`${p}${t}\/${p}`)/' "$file"; then
log_info "成功修改 x-cursor-checksum 设置代码"
echo "[SUCCESS] 成功完成 x-cursor-checksum 设置代码替换" >> "$LOG_FILE"
# 记录修改后的行
grep -n 'i.header.set("x-cursor-checksum' "$file" >> "$LOG_FILE"
((modified_count++))
log_info "成功修改文件: ${file/$temp_dir\//}"
else
log_error "修改 x-cursor-checksum 设置代码失败"
echo "[ERROR] 替换 x-cursor-checksum 设置代码失败" >> "$LOG_FILE"
cp "${file}.bak" "$file"
fi
else
log_warn "未找到 x-cursor-checksum 设置代码"
echo "[FILE_CHECK] 未找到 x-cursor-checksum 设置代码" >> "$LOG_FILE"
# 记录文件部分内容到日志以便排查
echo "[FILE_CONTENT] 文件中包含 'header.set' 的行:" >> "$LOG_FILE"
grep -n "header.set" "$file" | head -20 >> "$LOG_FILE"
echo "[FILE_CONTENT] 文件中包含 'checksum' 的行:" >> "$LOG_FILE"
grep -n "checksum" "$file" | head -20 >> "$LOG_FILE"
fi
echo "[PROCESS_DETAIL] 完成处理 extensionHostProcess.js 文件" >> "$LOG_FILE"
elif grep -q "IOPlatformUUID" "$file"; then
log_debug "找到 IOPlatformUUID 关键字"
echo "[FOUND] 找到 IOPlatformUUID 关键字" >> "$LOG_FILE"
grep -n "IOPlatformUUID" "$file" | head -5 >> "$LOG_FILE"
@ -836,98 +831,6 @@ disable_auto_update() {
log_info "完成后请重启 Cursor"
}
# 生成随机MAC地址
generate_random_mac() {
# 生成随机MAC地址,保持第一个字节的第二位为0(保证是单播地址)
printf '02:%02x:%02x:%02x:%02x:%02x' $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256)) $((RANDOM%256))
}
# 获取网络接口列表
get_network_interfaces() {
networksetup -listallhardwareports | awk '/Hardware Port|Ethernet Address/ {print $NF}' | paste - - | grep -v 'N/A'
}
# 备份MAC地址
backup_mac_addresses() {
log_info "正在备份MAC地址..."
local backup_file="$BACKUP_DIR/mac_addresses.backup_$(date +%Y%m%d_%H%M%S)"
{
echo "# Original MAC Addresses Backup - $(date)" > "$backup_file"
echo "## Network Interfaces:" >> "$backup_file"
networksetup -listallhardwareports >> "$backup_file"
chmod 444 "$backup_file"
chown "$CURRENT_USER" "$backup_file"
log_info "MAC地址已备份到: $backup_file"
} || {
log_error "备份MAC地址失败"
return 1
}
}
# 修改MAC地址
modify_mac_address() {
log_info "正在获取网络接口信息..."
# 备份当前MAC地址
backup_mac_addresses
# 获取所有网络接口
local interfaces=$(get_network_interfaces)
if [ -z "$interfaces" ]; then
log_error "未找到可用的网络接口"
return 1
fi
echo
log_info "发现以下网络接口:"
echo "$interfaces" | nl -w2 -s') '
echo
echo -n "请选择要修改的接口编号 (按回车跳过): "
read -r choice
if [ -z "$choice" ]; then
log_info "跳过MAC地址修改"
return 0
fi
# 获取选择的接口名称
local selected_interface=$(echo "$interfaces" | sed -n "${choice}p" | awk '{print $1}')
if [ -z "$selected_interface" ]; then
log_error "无效的选择"
return 1
fi
# 生成新的MAC地址
local new_mac=$(generate_random_mac)
log_info "正在修改接口 $selected_interface 的MAC地址..."
# 关闭网络接口
sudo ifconfig "$selected_interface" down || {
log_error "无法关闭网络接口"
return 1
}
# 修改MAC地址
if sudo ifconfig "$selected_interface" ether "$new_mac"; then
# 重新启用网络接口
sudo ifconfig "$selected_interface" up
log_info "成功修改MAC地址为: $new_mac"
echo
log_warn "请注意: MAC地址修改可能需要重新连接网络才能生效"
else
log_error "修改MAC地址失败"
# 尝试恢复网络接口
sudo ifconfig "$selected_interface" up
return 1
fi
}
# 新增恢复功能选项
restore_feature() {
# 检查备份目录是否存在
@ -1128,85 +1031,35 @@ main() {
╚═════╝ ╚═════╝ ╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚═╝ ╚═╝
"
echo -e "${BLUE}================================${NC}"
echo -e "${GREEN} Cursor 设备ID 修改工具 ${NC}"
echo -e "${GREEN} Cursor 启动工具 ${NC}"
echo -e "${YELLOW} 关注公众号【煎饼果子卷AI】 ${NC}"
echo -e "${YELLOW} 一起交流更多Cursor技巧和AI知识(脚本免费、关注公众号加群有更多技巧和大佬) ${NC}"
echo -e "${BLUE}================================${NC}"
echo
echo -e "${YELLOW}[重要提示]${NC} 本工具支持 Cursor v0.47.x"
echo -e "${YELLOW}[重要提示]${NC} 本工具优先修改js文件,更加安全可靠"
echo -e "${YELLOW}[重要提示]${NC} 本工具免费,如果对您有帮助,请关注公众号【煎饼果子卷AI】"
echo
# 删除开头的修复选项部分,直接执行主要功能
# 执行主要功能
check_permissions
check_and_kill_cursor
backup_config
generate_new_config
# 询问用户是否要修改主程序文件
echo
log_warn "是否要修改 Cursor 主程序文件?"
# 使用新的菜单选择函数
select_menu_option "请使用上下箭头选择,按Enter确认:" "否 - 仅修改配置文件 (更安全但可能需要更频繁地重置)|是 - 同时修改主程序文件 (更持久但有小概率导致程序不稳定)" 1
app_choice=$?
# 记录到日志
echo "[INPUT_DEBUG] 读取到的选择: $app_choice" >> "$LOG_FILE"
# 确保脚本不会因为输入问题而终止
set +e
# 处理用户选择
if [ "$app_choice" = "0" ]; then
log_info "您选择了跳过主程序文件修改"
log_info "已跳过主程序文件修改"
else
# 默认或输入1都执行修改
log_info "正在执行主程序文件修改..."
# 使用子shell执行修改,避免错误导致整个脚本退出
(
if modify_cursor_app_files; then
log_info "主程序文件修改成功!"
else
log_warn "主程序文件修改失败,但配置文件修改可能已成功"
log_warn "如果重启后 Cursor 仍然提示设备被禁用,请重新运行此脚本"
fi
)
fi
# 恢复错误处理
set -e
# 添加MAC地址修改选项
echo
log_warn "是否要修改MAC地址?"
# 使用新的菜单选择函数
select_menu_option "请使用上下箭头选择,按Enter确认:" "否 - 保持默认设置|是 - 修改MAC地址 (推荐)" 1
mac_choice=$?
# 记录到日志
echo "[INPUT_DEBUG] MAC地址选择: $mac_choice" >> "$LOG_FILE"
# 询问用户是否需要重置机器码(默认不重置)
generate_new_config
# 确保脚本不会因为输入问题而终止
set +e
# 执行主程序文件修改
log_info "正在执行主程序文件修改..."
# 处理用户选择 - 索引1对应"是"选项
if [ "$mac_choice" = "1" ]; then
log_info "您选择了修改MAC地址"
# 使用子shell执行修改,避免错误导致整个脚本退出
(
if modify_mac_address; then
log_info "MAC地址修改完成!"
else
log_error "MAC地址修改失败"
fi
)
else
log_info "已跳过MAC地址修改"
fi
# 使用子shell执行修改,避免错误导致整个脚本退出
(
if modify_cursor_app_files; then
log_info "主程序文件修改成功!"
else
log_warn "主程序文件修改失败,但配置文件修改可能已成功"
log_warn "如果重启后 Cursor 仍然提示设备被禁用,请重新运行此脚本"
fi
)
# 恢复错误处理
set -e
@ -1219,9 +1072,6 @@ main() {
log_info "请重启 Cursor 以应用新的配置"
# 新增恢复功能选项
#restore_feature
# 显示最后的提示信息
show_follow_info

Loading…
Cancel
Save