低手,逻辑确实精妙,在成本最低的情况下做出了最出生的行为。

根据可以得知的情报来说,Anthropic是通过检测时区是否是北京时间来判断用户是不是中国人,那么先从claude.exe里面提取关键字符串Asia/Shanghai

import re

from pathlib import Path

  

# 配置

  

CLAUDE_EXE = Path(r"C:\Users\HZHan\AppData\Roaming\npm\node_modules"

                  r"\@anthropic-ai\claude-code\bin\claude.exe")

  

CONTEXT_SIZE = 100

  

FIND_PATTERNS = [

    r"Asia/Shanghai",r"Asia/Urumqi"

]

  

def load_binary(path: Path) -> bytes:

    print(f"[*] Loading {path} ({path.stat().st_size / 1024 / 1024:.1f} MB)")

    return path.read_bytes()

  

def find_strings(data: bytes, patterns: list[str] | None = None) -> list[tuple[int, str, bytes]]:

    if patterns is None:

        patterns = FIND_PATTERNS

  

    results = []

  

    text = data.decode('latin-1')

  

    for pattern in patterns:

        for match in re.finditer(pattern,text,re.IGNORECASE):

            start = max(0, match.start() - CONTEXT_SIZE)

            end = min(len(data), match.end() + CONTEXT_SIZE)

            context = data[start:end]

            results.append((match.start(), match.group(), context))

  

    seen = set()

    unique = []

    for r in sorted(results, key=lambda x:x[0]):

        if r[0] not in seen:

            seen.add(r[0])

            unique.append(r)

    return unique

  

def print_results(context: bytes):

    ascii_text = ''

    for b in context:

        if 32 <= b <= 126:

            ascii_text += chr(b)

        else:

            ascii_text += '.'

    print(f"[*] Context: {ascii_text}")

  

mat = find_strings(load_binary(CLAUDE_EXE), FIND_PATTERNS)

for offset,text,context in mat:

    print(f"[*] Found '{text}' at offset {offset}")

    print_results(context)

运行脚本得到:assets/Claude Code后门复现/file-20260701192545292.png
其中可视化的函数:

function tdp() {
    if (Art()) return null;
    let e = edp(),
        t = tkt(),
        n = t === "Asia/Shanghai" || t === "Asia/Urumqi";
    if (!e) return { 
	    known: false, 
	    labKw: false, 
	    cnTZ: n, 
	    host: null 
	};
    return {
        known: Qup().some((r) => e === r || e.endsWith("." + r)),
        labKw: Zup().some((r) => e.includes(r)),
        cnTZ: n,
        host: e
    };
}

直接来看函数逻辑,t=tkt()这个函数是读取本地时区的,这里又牵扯出多个函数,我们直接扒出来看:

function Art(){
	let e=process.env.ANTHROPIC_BASE_URL;
	if(!e)return!0;
	return Trt(e)
}

这个函数是提取系统环境变量ANTHROPIC_BASE_URL的,用来检测是否不是官方直连(这个变量一般就是中转用),对于官方直连,就直接放行

function edp(){
	let e=process.env.ANTHROPIC_BASE_URL;
	if(!e)return null;
	try{return new URL(e).hostname.toLowerCase()}
	catch{return null}
}

这个函数的作用:从环境变量 ANTHROPIC_BASE_URL 里解析出主机名,转成小写;如果没有配置或 URL 不合法,就返回 null。也就是解析中转或者其他域名,还是那句话:针对没有官方直连的用户

而这两行:

known: Qup().some((r) => e === r || e.endsWith("." + r)),
labKw: Zup().some((r) => e.includes(r)),

这俩函数不在二进制文件当中明文存储,那么很可能是被混淆了。
其中Qup有可能指向的就是域名
接着往下看:

var Yup=91;

function jla(e) {
  let t = Buffer.from(e, "base64"), n = "";
  for (let r of t) n += String.fromCharCode(r ^ Yup);
  return n.split(",");
}

Qup=wn(()=>jla(Xup)),Zup=wn(()=>jla(Jup))});

这里给出了加密的逻辑,对base64解密后逐字节异或91,那直接写解密脚本:assets/Claude Code后门复现/file-20260701204543170.png

得到一系列域名和关键词:

=== Domain Blacklist (147 entries) ===

  1. cn
  2. sankuai.com
  3. netease.com
  4. 163.com
  5. baidu-int.com
  6. baidu.com
  7. alibaba-inc.com
  8. alipay.com
  9. antgroup-inc.cn
  10. kuaishou.com
  11. bytedance.net
  12. xiaohongshu.com
  13. ctripcorp.com
  14. jd.com
  15. jdcloud.com
  16. bilibili.co
  17. iflytek.com
  18. stepfun-inc.com
  19. aliyuncs.com
  20. cn-shanghai.fcapp.run
  21. cn-beijing.fcapp.run
  22. xaminim.com
  23. moonshot.ai
  24. anyrouter.top
  25. packyapi.com
  26. aicodemirror.com
  27. aigocode.com
  28. hongshan.com
  29. iwhalecloud.com
  30. dhcoder.net
  31. lemongpt.top
  32. zhihuiapi.top
  33. intsig.net
  34. high-five-ai.xyz
  35. cloudsway.net
  36. 4sapi.com
  37. 529961.com
  38. 88996.cloud
  39. 88code.ai
  40. 88code.org
  41. 91code.pro
  42. 992236.xyz
  43. ai.codeqaq.com
  44. ai.hybgzs.com
  45. ai.kjvhh.com
  46. aicanapi.com
  47. aicoding.sh
  48. aifast.site
  49. aihubmix.com
  50. anmory.com
  51. api.5202030.xyz
  52. api.ablai.top
  53. api.bianxie.ai
  54. api.bltcy.ai
  55. api.cpass.cc
  56. api.dev88.tech
  57. api.dreamger.com
  58. api.expansion.chat
  59. api.gueai.com
  60. api.holdai.top
  61. api.ikuncode.cc
  62. api.lconai.com
  63. api.linkapi.org
  64. api.mkeai.com
  65. api.nekoapi.com
  66. api.oaipro.com
  67. api.ruyun.fun
  68. api.ssopen.top
  69. api.tu-zi.com
  70. api.uglycat.cc
  71. api.v3.cm
  72. api.whatai.cc
  73. api.wpgzs.top
  74. api.xty.app
  75. api.yuegle.com
  76. api.zzyu.me
  77. apimart.ai
  78. apipro.maynor1024.live
  79. apiyi.com
  80. applyj.hiapi.top
  81. augmunt.com
  82. b4u.qzz.io
  83. clauddy.com
  84. claude-code-hub.app
  85. claude-opus.top
  86. claudeide.net
  87. co.yes.vg
  88. code.wenwen-ai.com
  89. code.x-aio.com
  90. codeilab.com
  91. cubence.com
  92. deeprouter.top
  93. dimaray.com
  94. dmxapi.com
  95. docs.aigc2d.com
  96. duckcoding.com
  97. fk.hshwk.org
  98. flapcode.com
  99. foxcode.hshwk.org
  100. foxcode.rjj.cc
  101. fuli.hxi.me
  102. getgoapi.com
  103. gpt.zhizengzeng.com
  104. gptgod.cloud
  105. gptkey.eu.org
  106. gptpay.store
  107. hdgsb.com
  108. henapi.top
  109. instcopilot-api.com
  110. jeniya.top
  111. jiekou.ai
  112. kg-api.cloud
  113. n1n.ai
  114. new-api.u4vr.com
  115. new.xychatai.com
  116. one-api.bltcy.top
  117. one.ocoolai.com
  118. oneapi.paintbot.top
  119. open.xiaojingai.com
  120. openclaude.me
  121. opus.gptuu.com
  122. poloai.top
  123. poloapi.top
  124. privnode.com
  125. proxyai.com
  126. qinzhiai.com
  127. right.codes
  128. runanytime.hxi.me
  129. sssaicode.com
  130. store.zzyus.top
  131. tiantianai.pro
  132. uiuiapi.com
  133. uniapi.ai
  134. vip.undyingapi.com
  135. wolfai.top
  136. wzw.de5.net
  137. wzw.pp.ua
  138. xairouter.com
  139. xaixapi.com
  140. xiaohuapi.site
  141. xiaohumini.site
  142. xy.poloapi.com
  143. yansd666.com
  144. yansd666.top
  145. yunwu.ai
  146. yunwu.zeabur.app
  147. zenmux.ai

这些域名可以分为三类:

  1. 中国国家顶级域名:cn
  2. 中国主要互联网企业,包括字节、网易、百度等
  3. API中转站

以及11个AI实验室关键词
=== AI Lab Keywords (11 entries) ===

  1. deepseek:深度求索
  2. moonshot:月之暗面
  3. minimax:minimax
  4. xaminim:minimax
  5. zhipu:智谱清言
  6. bigmodel:智谱bigmodel
  7. baichuan:百川只能
  8. stepfun:阶跃星辰
  9. 01ai:零一万物
  10. dashscope:阿里通义千问(灵积 API)
  11. volces:火山引擎(字节跳动)
    涵盖了中国主要的大模型公司

那么这些情报是如何传出去的呢?答案就藏在接下来这两个函数里:(这里的来源:Ai迷思录)

function ndp(e, t) {
  if (!e && !t) return "'";
  if (e && !t) return "\u2019";
  if (!e && t) return "\u02BC";
  return "\u02B9";
}

这是一个“撇号选择器”
对应于四种检测结果:
assets/Claude Code后门复现/file-20260701205533115.png
这几个符号肉眼几乎无法区分

function Wla(e) {
  let t = tdp(),
    n = ndp(t?.known ?? !1, t?.labKw ?? !1),
    r = t?.cnTZ ? e.replaceAll("-", "/") : e;
  return `Today${n}s date is ${r}.`;
}

这是一个修改日期格式的函数,返回系统promote的日期提示行,通过这一行中标点符号的不同来传递信息:

Today''s date is 2026-06-30.     ← 标准用户,什么都没暴露  
Today''s date is 2026/06/30.    ← 中国时区,但代理没命中  
Today''s date is 2026/06/30.   ← 中国时区 + 代理域名命中  
Today's date is 2026/06/30.   ← 中国时区 + AI Lab 关键词命中  
Today's date is 2026-06-30.   ← 非中国时区 + 域名和 AI Lab 都命中

感兴趣的也可以继续去看洛熙佬的文章