GXX 是一款高性能指纹识别工具,基于 YAML 配置的 CEL 表达式规则进行目标系统识别。支持 HTTP/HTTPS、TCP、UDP 协议,可进行大规模批量目标扫描。
- YAML 规则引擎 - 基于 CEL 表达式的指纹匹配,规则简洁强大
- 高性能并发 - ants 协程池 + 两级并发(URL 级 + 规则级),支持大规模目标
- 多协议支持 - HTTP/HTTPS、TCP、UDP、Raw HTTP
- 技术栈识别 - 内置 Wappalyzer 引擎识别网站技术组件
- 多格式输出 - TXT / CSV / JSON,支持 Unix Domain Socket 实时推送
- SDK 接口 - 独立 SDK 包,所有对外类型自包含,支持
context.Context
- 内存优化 - CEL 环境单例 + Program 缓存 + 延迟格式化日志 + 对象池
# 扫描单个目标
gxx -u https://example.com
# 从文件批量扫描
gxx -f targets.txt
# 使用代理
gxx -u https://example.com --proxy http://127.0.0.1:8080
# 输出为 CSV(格式由扩展名自动识别)
gxx -u https://example.com -o results.csv
# JSON 输出
gxx -u https://example.com -o results.json --json
# 调试模式
gxx -u https://example.com --debug
# 设置规则并发线程数
gxx -u https://example.com -rt 500
package main
import (
"context"
"fmt"
"gxx/sdk"
"log"
)
func main() {
ctx := context.Background()
// 1. 初始化指纹规则
options, _ := sdk.NewFingerOptions()
if err := sdk.InitFingerRules(options); err != nil {
log.Fatal(err)
}
// 2. 执行指纹识别
result, err := sdk.FingerScan(ctx, "https://example.com", "", 10)
if err != nil {
log.Fatal(err)
}
// 3. 读取结果
fmt.Printf("URL: %s 状态码: %d 标题: %s\n", result.URL, result.StatusCode, result.Title)
for _, m := range result.Matches {
fmt.Printf(" - %s (%s)\n", m.Info.Name, m.Info.ID)
}
}
详细 SDK 文档参见 sdk/sdk.md。
| 参数 |
说明 |
-u, --url |
目标 URL/主机(可指定多个) |
-f, --file |
目标列表文件(每行一个) |
-t, --threads |
URL 并发线程数(默认 5) |
-rt, --rulethreads |
规则并发线程数(默认 200,最大 5000) |
| 参数 |
说明 |
-o, --output |
输出文件路径(txt/csv/json) |
--json |
JSON 格式输出 |
--sock |
Unix Domain Socket 实时输出路径 |
| 参数 |
说明 |
--proxy |
HTTP/SOCKS5 代理 |
-p |
测试单个 YAML 文件 |
-pf |
测试指定目录的 YAML 文件 |
--debug |
开启调试模式 |
--no-file-log |
禁用文件日志 |
--timeout |
请求超时(秒,默认 3) |
gxx/
├── cmd/ # CLI 入口
│ ├── main.go # 主程序
│ └── cli/ # 命令行处理
├── sdk/ # SDK 对外接口(所有对外类型均在此定义)
│ ├── sdk.go # 业务 API
│ ├── sdk.md # SDK 文档
│ └── debug/ # 运维/调试 API(内存监控、GC等)
├── pkg/ # 核心引擎
│ ├── cel/ # CEL 表达式引擎(全局环境单例 + Program 缓存)
│ ├── finger/ # 指纹规则解析与执行
│ ├── runner/ # 扫描调度器(工作池、缓存、监控)
│ ├── network/ # 网络请求层(HTTP/TCP/UDP)
│ └── wappalyzer/ # Wappalyzer 技术栈识别
├── types/ # 公共类型定义
├── utils/ # 基础设施
│ ├── logger/ # 日志系统(延迟格式化,高并发友好)
│ ├── output/ # 多格式输出
│ ├── common/ # 通用工具
│ ├── config/ # 配置管理
│ └── proto/ # Protobuf 协议定义
├── fingerYaml/ # 内置指纹规则库(embed)
└── example/ # 示例代码
├── basic_scan/ # 基本扫描
├── api_scan_baidu/ # API 调用示例
├── file_target_scan/ # 文件批量扫描
├── proxy_scan/ # 代理扫描
└── wappalyzer_scan/ # 技术栈识别
目标输入 → 存活探测(GET /) → 基础信息提取 → 缓存预热 → 规则并发匹配 → 结果输出
│ │
标题/证书/ICP/Wappalyzer CEL表达式评估
(2348条规则×200并发)
- 存活探测:对目标发起 GET / 请求,获取标题、证书、服务器信息、ICP 备案号、Wappalyzer 技术栈
- 缓存预热:将基础响应写入缓存,后续规则匹配时直接复用(TTL + LRU 驱逐)
- 规则匹配:2348 条指纹规则通过全局规则池(200 并发)并行执行 CEL 表达式评估
- 结果输出:匹配结果实时输出到控制台 + 文件 + Socket
| 优化项 |
效果 |
CEL 基础环境单例 + Extend() 派生 |
消除每条规则创建 cel.NewEnv() 的重量级开销 |
CEL Program 缓存 (sync.Map) |
相同表达式零重复编译 |
延迟格式化日志 (logger.Debug(format, args...)) |
非 Debug 模式下零字符串分配 |
SetVariableMap 跳过 proto 对象 |
消除 64% 的 protobuf 序列化分配 (9.3GB → 0) |
| HTTP 客户端池化 |
相同配置复用客户端实例 |
| Wappalyzer 全局单例 |
启动时加载一次,全程共享 |
| 指纹快照版本号缓存 |
扫描期间只复制一次指纹列表 |
| 内存监控频率调优 |
ReadMemStats 从 5s 降到 15s,减少 STW |
| 指标 |
值 |
| 总分配 |
11.8 GB |
| 峰值堆 |
539 MB |
| 最终残留 |
147 MB |
| GC CPU |
3% |
| 扫描耗时 |
20s |
| 零 goroutine 泄漏 |
race detector 验证通过 |
id: web-application
info:
name: Web应用识别
author: 作者名
description: 识别特定Web应用
rules:
r0:
request:
method: GET
path: /
expression: response.status == 200 && response.body.ibcontains(b"特征字符串")
expression: r0()
详细规则语法参考 docs/指纹规则格式说明.md。
# Makefile 构建
make build # 基本构建
make build-embed # 嵌入指纹库
make release # 构建发布包
# 手动编译
CGO_ENABLED=0 go build -ldflags "-w -s" -o gxx cmd/main.go
# 构建脚本
chmod +x build.sh && ./build.sh
本工具仅用于授权的安全测试和研究目的。使用者应遵守相关法律法规,未经授权不得对目标系统进行扫描。工具作者不对任何滥用行为负责。
MIT License