低手,逻辑确实精妙,在成本最低的情况下做出了最出生的行为。
根据可以得知的情报来说,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)
运行脚本得到:
其中可视化的函数:
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,那直接写解密脚本:
得到一系列域名和关键词:
=== Domain Blacklist (147 entries) ===
- cn
- sankuai.com
- netease.com
- 163.com
- baidu-int.com
- baidu.com
- alibaba-inc.com
- alipay.com
- antgroup-inc.cn
- kuaishou.com
- bytedance.net
- xiaohongshu.com
- ctripcorp.com
- jd.com
- jdcloud.com
- bilibili.co
- iflytek.com
- stepfun-inc.com
- aliyuncs.com
- cn-shanghai.fcapp.run
- cn-beijing.fcapp.run
- xaminim.com
- moonshot.ai
- anyrouter.top
- packyapi.com
- aicodemirror.com
- aigocode.com
- hongshan.com
- iwhalecloud.com
- dhcoder.net
- lemongpt.top
- zhihuiapi.top
- intsig.net
- high-five-ai.xyz
- cloudsway.net
- 4sapi.com
- 529961.com
- 88996.cloud
- 88code.ai
- 88code.org
- 91code.pro
- 992236.xyz
- ai.codeqaq.com
- ai.hybgzs.com
- ai.kjvhh.com
- aicanapi.com
- aicoding.sh
- aifast.site
- aihubmix.com
- anmory.com
- api.5202030.xyz
- api.ablai.top
- api.bianxie.ai
- api.bltcy.ai
- api.cpass.cc
- api.dev88.tech
- api.dreamger.com
- api.expansion.chat
- api.gueai.com
- api.holdai.top
- api.ikuncode.cc
- api.lconai.com
- api.linkapi.org
- api.mkeai.com
- api.nekoapi.com
- api.oaipro.com
- api.ruyun.fun
- api.ssopen.top
- api.tu-zi.com
- api.uglycat.cc
- api.v3.cm
- api.whatai.cc
- api.wpgzs.top
- api.xty.app
- api.yuegle.com
- api.zzyu.me
- apimart.ai
- apipro.maynor1024.live
- apiyi.com
- applyj.hiapi.top
- augmunt.com
- b4u.qzz.io
- clauddy.com
- claude-code-hub.app
- claude-opus.top
- claudeide.net
- co.yes.vg
- code.wenwen-ai.com
- code.x-aio.com
- codeilab.com
- cubence.com
- deeprouter.top
- dimaray.com
- dmxapi.com
- docs.aigc2d.com
- duckcoding.com
- fk.hshwk.org
- flapcode.com
- foxcode.hshwk.org
- foxcode.rjj.cc
- fuli.hxi.me
- getgoapi.com
- gpt.zhizengzeng.com
- gptgod.cloud
- gptkey.eu.org
- gptpay.store
- hdgsb.com
- henapi.top
- instcopilot-api.com
- jeniya.top
- jiekou.ai
- kg-api.cloud
- n1n.ai
- new-api.u4vr.com
- new.xychatai.com
- one-api.bltcy.top
- one.ocoolai.com
- oneapi.paintbot.top
- open.xiaojingai.com
- openclaude.me
- opus.gptuu.com
- poloai.top
- poloapi.top
- privnode.com
- proxyai.com
- qinzhiai.com
- right.codes
- runanytime.hxi.me
- sssaicode.com
- store.zzyus.top
- tiantianai.pro
- uiuiapi.com
- uniapi.ai
- vip.undyingapi.com
- wolfai.top
- wzw.de5.net
- wzw.pp.ua
- xairouter.com
- xaixapi.com
- xiaohuapi.site
- xiaohumini.site
- xy.poloapi.com
- yansd666.com
- yansd666.top
- yunwu.ai
- yunwu.zeabur.app
- zenmux.ai
这些域名可以分为三类:
- 中国国家顶级域名:cn
- 中国主要互联网企业,包括字节、网易、百度等
- API中转站
以及11个AI实验室关键词
=== AI Lab Keywords (11 entries) ===
- deepseek:深度求索
- moonshot:月之暗面
- minimax:minimax
- xaminim:minimax
- zhipu:智谱清言
- bigmodel:智谱bigmodel
- baichuan:百川只能
- stepfun:阶跃星辰
- 01ai:零一万物
- dashscope:阿里通义千问(灵积 API)
- volces:火山引擎(字节跳动)
涵盖了中国主要的大模型公司
那么这些情报是如何传出去的呢?答案就藏在接下来这两个函数里:(这里的来源:Ai迷思录)
function ndp(e, t) {
if (!e && !t) return "'";
if (e && !t) return "\u2019";
if (!e && t) return "\u02BC";
return "\u02B9";
}
这是一个“撇号选择器”
对应于四种检测结果:

这几个符号肉眼几乎无法区分
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 都命中
感兴趣的也可以继续去看洛熙佬的文章