From 33e611ba9afe273d65b075d2820e67502481e602 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E7=85=8E=E9=A5=BC=E6=9E=9C=E5=AD=90=E5=8D=B7=E9=B2=A8?= =?UTF-8?q?=E9=B1=BC=E8=BE=A3=E6=A4=92?= Date: Wed, 14 Jan 2026 18:55:17 +0800 Subject: [PATCH] =?UTF-8?q?```=20feat(cursor):=20=E4=B8=BALinux=E3=80=81Ma?= =?UTF-8?q?c=E5=92=8CWindows=E5=B9=B3=E5=8F=B0=E7=9A=84ID=E4=BF=AE?= =?UTF-8?q?=E6=94=B9=E8=84=9A=E6=9C=AC=E6=B7=BB=E5=8A=A0=E8=AF=8A=E6=96=AD?= =?UTF-8?q?=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 在cursor_linux_id_modifier.sh、cursor_mac_id_modifier.sh和 cursor_win_id_modifier.ps1脚本中增加了详细的诊断日志输出功能, 用于追踪ID修改过程中的匹配情况和错误定位。新增了diag函数来 输出诊断信息,包括模块标记查找结果、候选函数匹配过程、特 征校验结果等,便于调试和问题排查。 ``` --- scripts/run/cursor_linux_id_modifier.sh | 29 +++++++++++++++-- scripts/run/cursor_mac_id_modifier.sh | 29 +++++++++++++++-- scripts/run/cursor_win_id_modifier.ps1 | 43 ++++++++++++++++++++----- 3 files changed, 87 insertions(+), 14 deletions(-) diff --git a/scripts/run/cursor_linux_id_modifier.sh b/scripts/run/cursor_linux_id_modifier.sh index e460c4a..de74195 100755 --- a/scripts/run/cursor_linux_id_modifier.sh +++ b/scripts/run/cursor_linux_id_modifier.sh @@ -1135,6 +1135,9 @@ EOF if True: import re, sys + def diag(msg): + print(f"[方案B][诊断] {msg}", file=sys.stderr) + path, machine_guid, machine_id = sys.argv[1], sys.argv[2], sys.argv[3] with open(path, "r", encoding="utf-8") as f: @@ -1145,6 +1148,7 @@ if True: marker_index = data.find(marker) if marker_index < 0: print("NOT_FOUND") + diag(f"未找到模块标记: {marker}") raise SystemExit(0) window_end = min(len(data), marker_index + 200000) @@ -1237,33 +1241,50 @@ if True: hash_re = re.compile(r'createHash\\([\"\\']sha256[\"\\']\\)') sig_re = re.compile(r'^async function (\\w+)\\((\\w+)\\)') - for hm in hash_re.finditer(window): + hash_matches = list(hash_re.finditer(window)) + diag(f"marker_index={marker_index} window_len={len(window)} sha256_createHash={len(hash_matches)}") + + for idx, hm in enumerate(hash_matches, start=1): hash_pos = hm.start() func_start = window.rfind("async function", 0, hash_pos) if func_start < 0: + if idx <= 3: + diag(f"候选#{idx}: 未找到 async function 起点") continue open_brace = window.find("{", func_start) if open_brace < 0: + if idx <= 3: + diag(f"候选#{idx}: 未找到函数起始花括号") continue end_brace = find_matching_brace(window, open_brace, max_scan=20000) if end_brace is None: + if idx <= 3: + diag(f"候选#{idx}: 花括号配对失败(扫描上限内未闭合)") continue func_text = window[func_start:end_brace + 1] if len(func_text) > 8000: + if idx <= 3: + diag(f"候选#{idx}: 函数体过长 len={len(func_text)},已跳过") continue sm = sig_re.match(func_text) if not sm: + if idx <= 3: + diag(f"候选#{idx}: 未解析到函数签名(async function name(param))") continue name, param = sm.group(1), sm.group(2) # 特征校验:sha256 + hex digest + return param ? raw : hash - if not re.search(r'\\.digest\\([\"\\']hex[\"\\']\\)', func_text): + has_digest = re.search(r'\\.digest\\([\"\\']hex[\"\\']\\)', func_text) is not None + has_return = re.search(r'return\\s+' + re.escape(param) + r'\\?\\w+:\\w+\\}', func_text) is not None + if idx <= 3: + diag(f"候选#{idx}: {name}({param}) len={len(func_text)} digest={has_digest} return={has_return}") + if not has_digest: continue - if not re.search(r'return\\s+' + re.escape(param) + r'\\?\\w+:\\w+\\}', func_text): + if not has_return: continue replacement = f'async function {name}({param}){{return {param}?"{machine_guid}":"{machine_id}";}}' @@ -1272,9 +1293,11 @@ if True: new_data = data[:abs_start] + replacement + data[abs_end + 1:] with open(path, "w", encoding="utf-8") as f: f.write(new_data) + diag(f"命中并重写: {name}({param}) len={len(func_text)}") print("PATCHED") break else: + diag("未找到满足特征的候选函数") print("NOT_FOUND") PY ) diff --git a/scripts/run/cursor_mac_id_modifier.sh b/scripts/run/cursor_mac_id_modifier.sh index cb83899..a7c66b8 100644 --- a/scripts/run/cursor_mac_id_modifier.sh +++ b/scripts/run/cursor_mac_id_modifier.sh @@ -1862,6 +1862,9 @@ EOF if True: import re, sys + def diag(msg): + print(f"[方案B][诊断] {msg}", file=sys.stderr) + path, machine_guid, machine_id = sys.argv[1], sys.argv[2], sys.argv[3] with open(path, "r", encoding="utf-8") as f: @@ -1872,6 +1875,7 @@ if True: marker_index = data.find(marker) if marker_index < 0: print("NOT_FOUND") + diag(f"未找到模块标记: {marker}") raise SystemExit(0) window_end = min(len(data), marker_index + 200000) @@ -1964,33 +1968,50 @@ if True: hash_re = re.compile(r'createHash\\([\"\\']sha256[\"\\']\\)') sig_re = re.compile(r'^async function (\\w+)\\((\\w+)\\)') - for hm in hash_re.finditer(window): + hash_matches = list(hash_re.finditer(window)) + diag(f"marker_index={marker_index} window_len={len(window)} sha256_createHash={len(hash_matches)}") + + for idx, hm in enumerate(hash_matches, start=1): hash_pos = hm.start() func_start = window.rfind("async function", 0, hash_pos) if func_start < 0: + if idx <= 3: + diag(f"候选#{idx}: 未找到 async function 起点") continue open_brace = window.find("{", func_start) if open_brace < 0: + if idx <= 3: + diag(f"候选#{idx}: 未找到函数起始花括号") continue end_brace = find_matching_brace(window, open_brace, max_scan=20000) if end_brace is None: + if idx <= 3: + diag(f"候选#{idx}: 花括号配对失败(扫描上限内未闭合)") continue func_text = window[func_start:end_brace + 1] if len(func_text) > 8000: + if idx <= 3: + diag(f"候选#{idx}: 函数体过长 len={len(func_text)},已跳过") continue sm = sig_re.match(func_text) if not sm: + if idx <= 3: + diag(f"候选#{idx}: 未解析到函数签名(async function name(param))") continue name, param = sm.group(1), sm.group(2) # 特征校验:sha256 + hex digest + return param ? raw : hash - if not re.search(r'\\.digest\\([\"\\']hex[\"\\']\\)', func_text): + has_digest = re.search(r'\\.digest\\([\"\\']hex[\"\\']\\)', func_text) is not None + has_return = re.search(r'return\\s+' + re.escape(param) + r'\\?\\w+:\\w+\\}', func_text) is not None + if idx <= 3: + diag(f"候选#{idx}: {name}({param}) len={len(func_text)} digest={has_digest} return={has_return}") + if not has_digest: continue - if not re.search(r'return\\s+' + re.escape(param) + r'\\?\\w+:\\w+\\}', func_text): + if not has_return: continue replacement = f'async function {name}({param}){{return {param}?"{machine_guid}":"{machine_id}";}}' @@ -1999,9 +2020,11 @@ if True: new_data = data[:abs_start] + replacement + data[abs_end + 1:] with open(path, "w", encoding="utf-8") as f: f.write(new_data) + diag(f"命中并重写: {name}({param}) len={len(func_text)}") print("PATCHED") break else: + diag("未找到满足特征的候选函数") print("NOT_FOUND") PY ) diff --git a/scripts/run/cursor_win_id_modifier.ps1 b/scripts/run/cursor_win_id_modifier.ps1 index 945a6c1..4bc3649 100644 --- a/scripts/run/cursor_win_id_modifier.ps1 +++ b/scripts/run/cursor_win_id_modifier.ps1 @@ -618,37 +618,61 @@ function Modify-CursorJSFiles { $hashRegex = [regex]::new('createHash\(["'']sha256["'']\)') $hashMatches = $hashRegex.Matches($windowText) + Write-Host " $BLUEℹ️ $NC [方案B诊断] id.js偏移=$markerIndex | sha256 createHash 命中=$($hashMatches.Count)" $patched = $false + $diagLines = @() + $candidateNo = 0 foreach ($hm in $hashMatches) { + $candidateNo++ $hashPos = $hm.Index $funcStart = $windowText.LastIndexOf("async function", $hashPos) - if ($funcStart -lt 0) { continue } + if ($funcStart -lt 0) { + if ($candidateNo -le 3) { $diagLines += "候选#$candidateNo: 未找到 async function 起点" } + continue + } $openBrace = $windowText.IndexOf("{", $funcStart) - if ($openBrace -lt 0) { continue } + if ($openBrace -lt 0) { + if ($candidateNo -le 3) { $diagLines += "候选#$candidateNo: 未找到函数起始花括号" } + continue + } $endBrace = Find-JsMatchingBraceEnd -Text $windowText -OpenBraceIndex $openBrace -MaxScan 20000 - if ($endBrace -lt 0) { continue } + if ($endBrace -lt 0) { + if ($candidateNo -le 3) { $diagLines += "候选#$candidateNo: 花括号配对失败(扫描上限内未闭合)" } + continue + } $funcText = $windowText.Substring($funcStart, $endBrace - $funcStart + 1) - if ($funcText.Length -gt 8000) { continue } + if ($funcText.Length -gt 8000) { + if ($candidateNo -le 3) { $diagLines += "候选#$candidateNo: 函数体过长 len=$($funcText.Length),已跳过" } + continue + } $sig = [regex]::Match($funcText, '^async function (\w+)\((\w+)\)') - if (-not $sig.Success) { continue } + if (-not $sig.Success) { + if ($candidateNo -le 3) { $diagLines += "候选#$candidateNo: 未解析到函数签名(async function name(param))" } + continue + } $fn = $sig.Groups[1].Value $param = $sig.Groups[2].Value # 特征校验:sha256 + hex digest + return param ? raw : hash - if (-not ($funcText -match 'createHash\(["'']sha256["'']\)')) { continue } - if (-not ($funcText -match '\.digest\(["'']hex["'']\)')) { continue } - if (-not ($funcText -match ('return\s+' + [regex]::Escape($param) + '\?\w+:\w+\}'))) { continue } + $hasDigest = ($funcText -match '\.digest\(["'']hex["'']\)') + $hasReturn = ($funcText -match ('return\s+' + [regex]::Escape($param) + '\?\w+:\w+\}')) + if ($candidateNo -le 3) { + $diagLines += "候选#$candidateNo: $fn($param) len=$($funcText.Length) digest=$hasDigest return=$hasReturn" + } + if (-not $hasDigest) { continue } + if (-not $hasReturn) { continue } $replacement = "async function $fn($param){return $param?'$machineGuid':'$machineId';}" $absStart = $markerIndex + $funcStart $absEnd = $markerIndex + $endBrace $content = $content.Substring(0, $absStart) + $replacement + $content.Substring($absEnd + 1) + Write-Host " $BLUEℹ️ $NC [方案B诊断] 命中候选#$candidateNo:$fn($param) len=$($funcText.Length)" Write-Host " $GREEN✓$NC [方案B] 已重写 $fn($param) 机器码源函数(融合版特征匹配)" $replacedB6 = $true $patched = $true @@ -657,6 +681,9 @@ function Modify-CursorJSFiles { if (-not $patched) { Write-Host " $YELLOW⚠️ $NC [方案B] 未定位到机器码源函数特征,已跳过" + foreach ($d in ($diagLines | Select-Object -First 3)) { + Write-Host " $BLUEℹ️ $NC [方案B诊断] $d" + } } } catch { Write-Host " $YELLOW⚠️ $NC [方案B] 定位失败,已跳过:$($_.Exception.Message)"