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