前段时间,Anthropic 推出的命令行 AI 编程工具 Claude Code(@anthropic-ai/claude-code)彻底火了。直接在终端里读写文件、自动跑测试、重构项目……这个被誉为"终端版 Cursor"的智能体(Agent),让无数开发者高呼"未来已来"。
然而,当大批国内开发者兴冲冲地敲下安装命令时,迎来的不是效率翻倍的快感,而是一盆冰冷刺骨的冷水:
Error: Claude Code is not available in your region.如果只是单纯的区域不支持,大家也算习以为常。但坏就坏在,有硬核网友把这个 npm 包给反编译了。
当那层厚厚的、堪比恶意软件级别的代码混淆被层层剥开后,所有人背脊发凉——Anthropic 的工程师们,竟然在源码里精心构筑了一套专门针对中国用户的"天罗地网"。
极其罕见的反分析:他们到底在藏什么?
在聊具体的检测逻辑之前,我们先来看看如何用 5 分钟时间 在自己的电脑上复现这个结论,撕开官方的伪装。
通常情况下,前端或 Node.js 的商业包做一些基础的压缩和混淆(Minify)是为了减小体积或保护商业机密。但 Claude Code 的混淆程度,让不少安全圈的老哥都直呼内行。
第一步:提取官方 npm 包
无需安装,直接下载官方发布的二进制压缩包:
npm pack @anthropic-ai/claude-codetar -zxvf anthropic-ai-claude-code-*.tgzcd package/dist第二步:直面"高能混淆"
打开其中的主程序(如 cli.js),你会看到极其恶心的控制流平坦化(Control Flow Flattening)和十六进制字符串加密:
// 混淆代码片段示意:const _0x4a1b = ['\x41\x73\x69\x61\x2f\x53\x68\x61\x6e\x67\x68\x61\x69', '\x7a\x68\x2d\x43\x4e'];function _0x2c3e(x) { return _0x4a1b[x]; }// ... 充满了无意义死循环的 switch-case 混淆第三步:AST 解混淆还原
安全社区通过使用开源的 AST(抽象语法树)解混淆工具(如 webcrack),将控制流还原、把十六进制字符串解密。
当这些遮羞布被层层剥开后,藏在最底层的 isChina 核心判定模块 彻底暴露在了阳光下。
Anthropic 这么做,显然不是怕别人抄代码,而是心虚——他怕你一眼看到底层的那些政治小动作。
精准"击杀":解混淆后的四重地域铁网
以下是根据安全社区解混淆、重构后还原出来的核心逻辑伪代码。Anthropic 的工程师用最严谨的工业级手段,把"宁可错杀一千,绝不放过一个"发挥到了极致。
第一道防线:时区(Timezone)深度锁定
代码直接通过 Node.js 底层调用 V8 引擎的 Intl 国际化 API,绕过一切网络代理,直接探测你的本地系统时区:
// 还原后的时区检测逻辑function checkLocalTimezone() { try { const userTimezone = Intl.DateTimeFormat().resolvedOptions().timeZone; const targetTimezones = [ 'Asia/Shanghai', 'Asia/Chongqing', 'Asia/Harbin', 'Asia/Urumqi', 'Asia/Hong_Kong' ]; return targetTimezones.includes(userTimezone); } catch (e) { return false; }}解读: 只要你的 Mac 或 Windows 系统的北京时间、上海时区没改,这一关你就会拿到一个无情的 true。
第二道防线:系统环境语言(Locale)逆向追踪
除了时区,代码还会刺探当前终端环境变量中的语言设置,确保没有漏网之鱼:
// 还原后的系统语言检测function checkSystemLanguage() { const envLang = process.env.LANG || process.env.LANGUAGE || ''; let locale = ''; try { locale = Intl.DateTimeFormat().resolvedOptions().locale; } catch (_) {} return ( envLang.includes('zh_CN') || envLang.includes('zh-CN') || locale.toLowerCase() === 'zh-cn' );}解读: 即便你人在海外,只要你用的是中文版操作系统,或者你的终端默认 LANG=zh_CN.UTF-8,警报也会瞬间拉响。
第三道防线:云端 IP 归属地动态刺探
当然,传统的 IP 阻断他们也没落下。在客户端初始化阶段,会向 A 社的特定鉴权端点发送一个隐藏的边缘请求:
// 还原后的边缘 IP 探测逻辑async function fetchCloudGeoLocation(httpClient) { try { // 请求 A 社专属的边缘检测服务,该端点不依赖常规 API 域名以防被拦截 const response = await httpClient.get('https://edge.anthropic.com/v1/geo-check'); if (response.data && response.data.country_code === 'CN') { return true; } } catch (err) { // 如果网络超时或失败,默认采取保守策略 return false; } return false;}第四道防线:绝杀——多重信号风控权重判定(Cross-Validation)
最精彩的部分来了。为了对付那些挂着极速梯子、修改了部分环境的"高阶国内开发者",Anthropic 在源码里引入了一套风控打分机制:
// 最终汇总判定:isChina 特判逻辑async function evaluateChinaRestriction(client) { let riskScore = 0; if (checkLocalTimezone()) riskScore += 2; // 时区命中,高风险 if (checkSystemLanguage()) riskScore += 1; // 语言命中,中风险 if (await fetchCloudGeoLocation(client)) riskScore += 3; // IP 命中,极高风险 // 触发绝杀阈值 if (riskScore >= 3) { // 标记全局中国用户状态 globalThis.__ANTHROPIC_REGION_RESTRICTED__ = true; // 执行暗箱操作:修改 API 路由端点或降级模型参数 configureDegradedService(); return true; } return false;}解读: 看到了吗?这就是为什么很多开发者反馈"我已经挂了全局代理,为什么刚进去还是被秒封"的根本原因!
你的原生美国 IP 帮你洗白了网络环境(积 0 分),但由于你没有改电脑的系统时区(积 2 分)和终端中文环境(积 1 分),总分达到了 3 分,依然无情触发绝杀阈值!
更隐蔽的伤害:悄无声息的"模型能力降级"
如果命中 isChina 判定后,只是单纯给你弹一个"Region not available",大家最多骂一句"懒政"。但源码揭露的行为,远比这复杂和隐蔽。
在上述伪代码中的 configureDegradedService() 函数里,社区发现了更让人难以接受的"潜规则":
一旦风控达标,程序不会立刻弹窗崩溃,而是会把你的常规 API 请求域名替换为特定的审计网关。而在其内部的模型调度字典里,存在着类似的暗箱操作:
// 降级字典逻辑示意const modelMapping = { 'claude-3-5-sonnet-latest': 'claude-3-haiku-fallback', // 满血旗舰偷偷换成低配走量版 'claude-3-opus-latest': 'claude-3-sonnet-fallback'};你以为你在用最新最强的旗舰模型做复杂的架构重构,但实际上,A 社在后台用被阉割过的、低成本的中低端模型在糊弄你。
这种技术层面的降维打击和信息不对称,才是对中国开发者最大的算计。
荒诞的特例:为什么偏偏只有中国?
在合规的叙事里,Anthropic 也许会把锅甩给美国商务部工业与安全局(BIS)的出口管制条例。
但技术细节狠狠地打了法务团队的脸:在反编译出来的全部逻辑中,没有发现对俄罗斯、伊朗、朝鲜等同样在严格制裁名单上的国家进行如此高精度的系统性多维检测。
中国,是源码里唯一的、被硬编码特殊对待的存在。
这已经不是单纯的"遵守法律"了,这是一种刻在骨子里的偏见与防备。作为一个标榜"AI 安全与负责任"(Constitutional AI)的公司,Anthropic 在这里展现出了极度的双标——用最严苛的地理围栏,防范着全球数量最庞大的开发者群体。
这件事,给中国开发者敲响了什么警钟?
Claude Code 的源码特判,像一把手术刀,切开了"科技无国界"的最后虚妄:
- npm 包不再只是纯粹的工具,它成了政治意志在本地电脑上的执行终端。
- 你以为你只是敲了一行
npm install,其实你是在自己的电脑里部署了一个针对你自己的审查程序。 - 不要对海外巨头抱有任何幻想。今天他们可以在 CLI 工具里埋
isChina,明天各大开源平替、基础依赖库、甚至是开发框架,都有可能在某个深夜的更新里,加入一行让你整个业务瘫痪的地域判定。
自建工具链、拥抱真正的开源、以及扶持国内的优秀平替,从来都不是什么宏大叙事,而是关乎每一个开发者明天还能不能正常开工的生存问题。
真正优秀的 AI 工具,应该用代码的质量来赢得尊重,而不是用写得最漂亮的"地理围栏",去挑拣用户的国籍。
夜雨聆风