anti-mage的assess包API完全参考:Evaluate与Decode两个入口的完整用法和示例
【免费下载链接】anti-mageFor detecting anti-detect browsers and spoofed profiles through runtime coherence analysis.项目地址: https://gitcode.com/gh_mirrors/an/anti-mage
本文带你一次性读懂anti-mage的assess包——这个包是整个反检测浏览器检测工具链中,做运行时一致性分析的进程内入口。它只暴露两个入口:assess.Evaluate把"你已采集到的观测数据"直接判定打分,assess.Decode则安全地解析来自被检测环境的 JSON 载荷。掌握这两个入口,你就能在自己的 Go 项目里嵌入一套无需特征库、只靠"自相矛盾"来抓异常环境的评分能力。
💡
anti-mage用一个 0–100(步长为 10)的分数衡量"一个浏览器环境有多自洽":分数越高,说明该环境自我矛盾越多。全部源码见 readme.md。
🧭 一分钟看懂:两个入口分别解决什么问题
assess是"你手里已经有数据"时的入口。它把数据喂给底层引擎(位于 internal/scan/),换回一个判定 + 一个分数 + 一句人话解释。
| 入口 | 你给它什么 | 它还你什么 | 典型场景 |
|---|---|---|---|
assess.Evaluate(env) | 进程内构造好的Environment结构体 | Assessment(判定/分数/说明) | 你自己采集完数据,直接打分 |
assess.Decode(b) | 被检测环境 POST 上来的 JSON 字节 | 一个"只含安全字段"的Environment | 接收外部载荷,再交给Evaluate |
两者常被串联使用:Decode负责"安全地读",Evaluate负责"正确地判"。
🔍 入口一:assess.Evaluate —— 从观测数据直接得到判定
Evaluate是一个纯函数:没有全局状态、不读时钟、不碰文件系统、不发网络请求,对恶意输入也是"总能返回、绝不 panic"的。签名如下(见 assess/assess.go#L115):
a := assess.Evaluate(env)1. 构造 Environment
核心是Observations:一张以"探针 id"为键的观测表,每条观测带一个状态和一段原始 JSON 值(见 assess/assess.go#L21-L24)。
env := assess.Environment{ Observations: map[string]assess.Observation{ "scope.main": {Status: assess.StatusOK, Value: mainThreadFacts}, "native.tostring": {Status: assess.StatusOK, Value: accessorSources}, "font.resolved": {Status: assess.StatusUnsupported}, }, FontControls: controls, // 由你在"提问前"选定 OffsetDates: dates, // 由你在"提问前"选定 ElapsedMS: int(time.Since(issued) / time.Millisecond), }⚠️ 只有
StatusOK会被当作证据;StatusUnsupported、StatusError、空状态一律不计入打分(见 assess/assess.go#L14-L19)。浏览器"没答上来"永远不会被扣分。
三个状态常量一览:
| 状态 | 含义 | 是否计入证据 |
|---|---|---|
assess.StatusOK | 成功读到 | ✅ 是 |
assess.StatusUnsupported | 该环境不支持此接口 | ❌ 否 |
assess.StatusError | 读取出错 | ❌ 否 |
2. 用 Findings 补充"库没采集的证据"
Findings让你把自己算出来的结论并入同一个分数(见 assess/assess.go#L40-L44)。每个Finding带一个名字和一个Verdict:
| Verdict | 含义 |
|---|---|
assess.Consistent | 一致,不加分 |
assess.Contradiction | 矛盾,显著抬分 |
assess.Modified | 表面被改写,抬分 |
assess.Unverified | 参考数据缺失,不进分母 |
assess.Inconclusive | 读不出结论,只降低置信度 |
📌
Findings与Observations会被折叠进同一个分数;一个Contradiction带来的抬升,和库自己发现的矛盾等价。
3. 读回判定:有序、可比较、可当策略用
Evaluate返回的Assessment携带有序的Determination(见 assess/assess.go#L59-L113),因此"策略"就是一次比较:
if a.Determination.AtLeast(assess.Discrepant) && a.Score >= 30 { reject() // 已出现矛盾且分数越过阈值 } if !a.Determination.Established() { tooLittleWasRead() // 读到的太少,任何方向都不敢下结论 }Determination从弱到强共 5 级:
| 等级 | 常量 | 直觉 |
|---|---|---|
| 0 | NotEvaluated | 什么都没读到,此判定不代表任何结论 |
| 1 | Insufficient | 没有矛盾,但证据太少,两个方向都不敢说 |
| 2 | Coherent | 读到的部分与"它自称的平台"全部吻合 |
| 3 | Discrepant | 出现一处"不可能同时为真"的矛盾 |
| 4 | Instrumented | 环境看起来被改写了(隐私/无障碍/内容拦截工具也会落到这一档) |
📥 入口二:assess.Decode —— 安全解析外部 JSON 载荷
当观测数据以 JSON 形式从被检测环境传来时,用Decode读取(见 assess/decode.go#L12-L56):
env, err := assess.Decode(body) if err != nil { // 只有"不是 JSON 对象"才返回 ErrNotAnObject } a := assess.Evaluate(env)它的安全边界是这个包的设计精髓:
- ✅ 只读
nonce(顶层)与probes/observations两个字段(二者视为同一字段,见 assess/decode.go#L10)。 - ❌绝不从载荷里取走
elapsedMs、offsetDates、fontControls、findings——这些"提问、时钟、补充证据"必须由调用方自己选定,不能由被检测环境自证。 - 🧯 对乱码/截断载荷"能读多少算多少",不 panic;只有整体不是 JSON 对象时才返回
ErrNotAnObject。
💻 最小可运行示例
下面两段取自官方示例 assess/example_test.go,可直接照搬:
① 进程内直接判定
a := assess.Evaluate(assess.Environment{ Observations: map[string]assess.Observation{ "scope.main": {Status: assess.StatusOK, Value: mainThreadFacts}, "native.tostring": {Status: assess.StatusOK, Value: accessorSources}, }, FontControls: controls, OffsetDates: dates, ElapsedMS: int(time.Since(issued) / time.Millisecond), }) fmt.Println(a.Determination, a.Score, len(a.Supplied))② 解析外部载荷再判定
body := []byte(`{"v":1,"nonce":"n1", "probes":{"auto.residue":{"status":"ok","value":{"webdriver":true}}}}`) env, _ := assess.Decode(body) fmt.Println(assess.Evaluate(env).Determination) // → instrumented⚖️ 分数 Score 意味着什么
Score是一个 0–100、步长为 10 的估计值(见 assess/assess.go#L240-L248),衡量的是一组独立证据而非单项检查:
- 单调:只有证据能抬升它,没有任何证据能降低它;
- 量化:步长固定为 10,你设的阈值不会漂移;
- 保守:从不因"缺少某功能"而给分;
0只表示"没有读到矛盾",绝不等于"未被改写"。
评分细节由底层引擎实现,完整分节顺序见 internal/scan/scan.go。
📁 相关源码与模块路径
想继续深入,从这几处入手即可:
- 进程内入口与打分:assess/assess.go
- 载荷安全解析:assess/decode.go
- 官方示例(可直接运行):assess/example_test.go
- 底层一致性分析引擎:internal/scan/
- 经过核实的常量参考表:reference/
- 字体族解析(作为"下限"而非结论):osfont/
- 回环 HTTP 服务(选输入、守时钟):server/
🔁 如需获取完整代码:
git clone https://gitcode.com/gh_mirrors/an/anti-mage,项目要求Go 1.24+且零外部依赖。
掌握Evaluate与Decode这两个入口,你就拥有了把"运行时一致性分析"嵌进任意 Go 服务的全部钥匙:Decode保证"只读该读的",Evaluate保证"只判该判的"。
【免费下载链接】anti-mageFor detecting anti-detect browsers and spoofed profiles through runtime coherence analysis.项目地址: https://gitcode.com/gh_mirrors/an/anti-mage
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考