w0wzahh/GeoChecker

GitHub: w0wzahh/GeoChecker

一款用于视频聊天平台的零依赖 Tampermonkey 脚本,通过拦截 WebRTC 流量实现实时的 IP 地理定位、网络诊断与威胁情报查询。

Stars: 0 | Forks: 0

# GeoChecker v5.0 **适用于视频聊天平台的实时 IP 地理定位与 WebRTC 分析工具。** [![License](https://img.shields.io/badge/license-All%20Rights%20Reserved-ff4757?style=flat-square)](LICENSE) [![Version](https://img.shields.io/badge/version-5.0.3-58a6ff?style=flat-square)]() [![Userscript](https://img.shields.io/badge/Tampermonkey-Supported-ff9f43?style=flat-square)](https://www.tampermonkey.net/) [![Platform](https://img.shields.io/badge/platform-WebRTC-3fb950?style=flat-square)]() *无需 API key。无需注册。无需后端。安装即用。*
## 目录 - [概述](#overview) - [功能](#features) - [架构](#architecture) - [安装说明](#installation) - [方法 1:Tampermonkey 用户脚本(推荐)](#method-1-tampermonkey-userscript-recommended) - [方法 2:控制台注入(一次性)](#method-2-console-injection-one-off) - [用法](#usage) - [支持的平台](#supported-platforms) - [键盘快捷键](#keyboard-shortcuts) - [Tampermonkey 菜单命令](#tampermonkey-menu-commands) - [技术深入解析](#technical-deep-dive) - [WebRTC 挂钩引擎](#webrtc-hooking-engine) - [IP 提取流水线](#ip-extraction-pipeline) - [统计数据收集](#stats-collection) - [多 PC 处理](#multi-pc-handling) - [项目结构](#project-structure) - [技术栈](#tech-stack) - [API 与数据源](#apis--data-sources) - [自动更新系统](#auto-update-system) - [更新日志](#changelog) - [免责声明](#disclaimer) ## 概述 GeoChecker 挂钩到视频聊天平台上的 WebRTC 对等连接,提取对等端 IP 地址,并实时补充地理定位数据。所有信息都会显示在一个可拖拽的玻璃拟物化悬浮窗中,包含 10 个标签页,涵盖地理定位、网络诊断、威胁情报和 OSINT 查询。 它完全在您的浏览器中运行。没有服务器,没有数据库,没有 API key。它在原型级别拦截 ICE candidates,并在客户端查询免费的地理定位 API。离开您浏览器的唯一数据,就是视频聊天平台已经在交换的相同 ICE 流量。 ### 为什么选择 GeoChecker? | 问题 | GeoChecker 的应对方案 | |---------|---------------------| | 视频聊天平台将 peer IP 隐藏在 TURN 中继之后 | 深度被动扫描外加 Agora RTC 路径检测 | | 现有工具需要 API key 或付费订阅 | 100% 免费、无需 key 的地理定位 API | | 基础的 IP 查询工具只显示静态数据 | 实时 WebRTC 统计数据、连接质量评分、NAT 分析 | | 随机聊天对象缺乏威胁情报 | 内置代理/VPN/主机检测,外加完整的 OSINT 工具套件 | | 丑陋、杂乱的悬浮窗 | 玻璃拟物化 UI,10 个井然有序的标签页,支持响应式和缩放 | ## 功能 ### 核心能力 - **自动 IP 发现。** 挂钩 `RTCPeerConnection` 以拦截 ICE candidates 并提取公共 IPv4 和 IPv6 地址,无需平台配合。 - **多源地理定位。** 并行查询 GeoJS、FreeIPApi 和 ipapi.is,支持自动故障转移和智能字段合并。 - **威胁情报。** 实时代理和 VPN 检测、托管和数据中心标记、Tor 出口节点检查以及高风险国家警报。 ### WebRTC 分析 - **连接质量评分。** 基于 RTT、jitter、丢包、丢帧和带宽稳定性的实时 0-100 分评分。 - **网络路径可视化。** 直观的指示器,显示您是处于直接 P2P 路径还是通过 TURN 中继。 - **实时统计。** Bitrate 曲线图、丢包率、RTT、jitter、分辨率、FPS、丢帧、质量限制原因、NACK/FIR/PLI 计数器、音频电平以及可用带宽估算。 - **编解码器指纹识别。** 从 `getStats()` 报告中识别协商的编解码器(VP8、VP9、H.264、Opus 等)。 - **DTLS 和 ICE 检查。** 显示 DTLS 状态和角色、SRTP 密码、TLS 版本、ICE 角色、传输协议和 candidate 类型。 - **NAT 类型分析。** 双 STUN 探测,确定连接是否位于 Symmetric、Cone 或混合 NAT 之后。 - **mDNS 和 IPv6 泄漏检测。** 捕获来自 ICE candidates 的 `.local` 主机名泄漏和公共 IPv6 暴露。 ### 用户体验 - **10 标签页悬浮窗。** 概览、位置、网络、安全、地图、统计、时间线、设置、历史和帮助。 - **嵌入式迷你地图。** 带有一键全屏功能的 OpenStreetMap iframe。 - **天气和距离。** 对方所在位置的当前天气,以及与您自己 IP 的距离。 - **会话事件时间线。** 按时间顺序记录 peer 发现、连接状态更改、质量变化和泄漏事件。 - **Peer 历史记录。** 持久记录遇到过 peer,包含时间戳、位置和 ISP。可导出为 CSV。 - **Peer 指纹识别。** 根据 peer 属性生成确定性哈希,用于跨会话重新识别。 - **屏幕共享检测。** 通过 track 标签检测 peer 何时开始共享屏幕。 - **媒体设备枚举。** 列出您本地的摄像头、麦克风和扬声器。 - **自动刷新地理定位。** 定期重新获取位置数据,以捕捉正在移动的移动端 peer。 ### OSINT 集成 一键查询任何已发现的 IP: | 服务 | URL | |---------|-----| | Shodan | shodan.io | | AbuseIPDB | abuseipdb.com | | VirusTotal | virustotal.com | | ipinfo.io | ipinfo.io | | GreyNoise | viz.greynoise.io | | Censys | search.censys.io | | IPVoid | ipvoid.com | | ThreatFox | threatfox.abuse.ch | | AlienVault OTX | otx.alienvault.com | | Talos Intelligence | talosintelligence.com | | Tor Exit Node Checker | check.torproject.org | ### UI 与辅助功能 - **深色和浅色主题。** 在玻璃拟物化深色模式和简洁的浅色模式之间切换。 - **主播模式。** 模糊 UI 中的 IP 地址。悬停或按住 Shift 键进行预览。 - **紧凑模式。** 将悬浮窗缩小到最小宽度以节省屏幕空间。 - **可拖拽和缩放。** 从顶部栏拖拽,从边角手柄缩放。位置和尺寸会保存到 `localStorage`。 - **自动隐藏。** 当没有活跃的 peer 时,自动折叠小组件。 - **桌面通知。** 发现新 peer 时,通过原生 `GM_notification` 发出警报。 - **Toast 系统。** 针对操作、错误和事件的非侵入式反馈。 - **键盘快捷键。** `Ctrl+Shift+G` 切换悬浮窗,`?` 打开帮助,`Shift` 预览主播模式。 ## 架构 GeoChecker 是一个零依赖的单文件用户脚本。它完全在浏览器沙箱内运行,不需要后端、数据库或外部服务账户。 ``` Browser Page | |-- GeoChecker Userscript (IIFE) | | | |-- WebRTC Hook Layer | | |-- RTCPeerConnection prototype interception | | |-- Constructor wrapping (Reflect.construct) | | |-- Passive/deep instance scanning | | |-- iframe recursion | | | |-- IP Extraction Layer | | |-- ICE candidate parsing | | |-- Private IP filtering | | |-- mDNS and IPv6 leak detection | | | |-- Geolocation Layer | | |-- Parallel API queries (GeoJS, FreeIPApi, ipapi.is) | | |-- Response merging and normalization | | |-- Weather fetch (Open-Meteo) | | | |-- Stats Collection Layer | | |-- Periodic getStats() polling | | |-- Delta calculation for bitrate history | | |-- Per-PC stats scoping (prevents cross-contamination) | | | |-- UI Layer | | |-- Glassmorphism overlay (DOM) | | |-- 10-tab content router | | |-- Theme engine | | |-- Toast queue | | | |-- Persistence Layer | |-- localStorage (position, settings, history, stats) | |-- GM API (notifications, menu commands) ``` ## 安装说明 ### 方法 1:Tampermonkey 用户脚本(推荐) 适用于在任何视频聊天网站上的持久、自动使用。 1. 安装 [Tampermonkey](https://www.tampermonkey.net/)(Chrome / Firefox / Edge / Safari)。 2. 打开原始用户脚本的 URL: https://raw.githubusercontent.com/w0wzahh/GeoChecker/main/geochecker-webrtc.user.js 3. Tampermonkey 将检测到 `.user.js` 扩展名并提示安装。 4. 点击 **安装**。 5. 导航到任何 WebRTC 视频聊天网站。悬浮窗将自动出现。 **自动更新:** 该脚本包含 `@downloadURL` 和 `@updateURL` 元数据。Tampermonkey 每 24 小时检查一次更新并静默安装。脚本内的轮询器也会在每次推送后 30 分钟内通知您有新版本。 ### 方法 2:控制台注入(一次性) 用于无需安装任何内容的快速测试。 1. 打开目标网站(例如:Ome.tv、Emerald Chat)。 2. 按 **F12** → **控制台** 标签页。 3. 复制本仓库中 `console-inject.js` 的内容。 4. 将其粘贴到控制台并按 **Enter**。 5. 开始视频通话。悬浮窗会立即出现。 ## 用法 ### 支持的平台 GeoChecker 适用于任何使用 WebRTC 对等连接的网站。已验证的平台包括: - **Ome.tv** 及 Omegle 的替代品 - **Monkey**(支持 Agora RTC 路径) - **Emerald Chat** - **ChatHub** - **任何**使用标准 `RTCPeerConnection` 的**自定义 WebRTC 应用程序** ### 键盘快捷键 | 快捷键 | 操作 | |----------|--------| | `Ctrl + Shift + G` | 切换悬浮窗可见性 | | `?` | 打开或关闭帮助悬浮窗 | | `Shift` (按住) | 预览主播模式(显示被模糊的 IP) | ### Tampermonkey 菜单命令 右键点击 Tampermonkey 图标,然后选择 GeoChecker: | 命令 | 快捷键 | 操作 | |---------|-----------|--------| | 切换悬浮窗 | `t` | 显示 / 隐藏小组件 | | 切换紧凑模式 | `c` | 缩小 / 扩大悬浮窗宽度 | | 切换主播模式 | `s` | 模糊 / 显示 IP 地址 | | 切换主题 | `m` | 切换深色 / 浅色主题 | | 导出历史记录 CSV | `e` | 将 peer 历史记录下载为 CSV | | 检查更新 | `u` | 手动触发版本检查 | ## 技术深入解析 ### WebRTC 挂钩引擎 GeoChecker 采用四层挂钩策略来拦截对等连接: 1. **原型方法包装。** 拦截 `RTCPeerConnection.prototype` 上的 `addIceCandidate`、`setLocalDescription` 和 `setRemoteDescription`。这可以捕获来自遗留代码和直接调用这些方法的库的请求。 2. **构造函数包装。** 使用 `Reflect.construct(...)` 替换全局 `RTCPeerConnection` 构造函数,以保留 ES6 子类链。每个新实例都会被自动挂钩。 3. **被动全局扫描。** 定期扫描 `window`、`iframe.contentWindow` 和深层对象树,寻找未被挂钩的 `RTCPeerConnection` 实例。这在缓存实例的 SPA 框架中很常见。 4. **iframe MutationObserver。** 检测动态注入的 iframe,并递归扫描其内容窗口。 这四层并行工作。如果一层漏掉了某个实例,另一层会将其捕获。 ### IP 提取流水线 当拦截到 ICE candidate 时: ``` ICE Candidate String | |-- Parse candidate type (host, srflx, prflx, relay) |-- Extract IP address (IPv4, IPv6, or mDNS .local) |-- Filter private ranges (RFC 1918, loopback, link-local) |-- Validate format (regex plus isValidIP()) |-- Check for mDNS leak (.local hostnames) |-- Check for IPv6 public leak |-- De-duplicate against known IPs |-- Trigger geolocation fetch ``` ### 统计数据收集 捕获 IP 后,GeoChecker 会每 1.5 秒轮询一次活跃对等连接的 `getStats()`: - **Bitrate。** 根据 `bytesReceived` 和 `bytesSent` 的增量计算,通过 `__gc_stats_id` 为每个 PC 划定作用域,以防止交叉污染。 - **丢包。** 源自 `packetsLost` 和 `packetsReceived` 的比率。 - **RTT 和 Jitter。** 从 `candidate-pair` 和 `remote-inbound-rtp` 报告中提取。 - **编解码器信息。** 通过 `mimeType` 加上 `payloadType` 对 `codec` 报告进行去重。 - **质量指标。** `framesPerSecond`、`framesDropped`、`frameWidth`、`frameHeight` 和 `qualityLimitationReason`。 主 PC 选举算法确保只有最近活跃的连接驱动全局 UI 状态。这可以防止多个 peer 同时连接时出现闪烁。 ### 多 PC处理 在复杂的应用程序中(多方通话、SFU 连接),多个 `RTCPeerConnection` 实例可能会同时处于活动状态。GeoChecker 会: - 为每个 PC 分配一个唯一的 `__gc_stats_id`。 - 使用 `pcId|reportId` 键限定所有 `prevStatsMap` 条目的作用域。 - 选举一个主 PC(最后未关闭的连接)用于全局 UI 更新。 - 持续轮询后台 PC 以保证数据完整性。 ## 项目结构 ``` GeoChecker/ ├── geochecker-webrtc.user.js # Main Tampermonkey userscript (production) ├── console-inject.js # Standalone console injection variant ├── README.md # This file ├── .gitignore # Excludes local-only files from git └── LICENSE # All Rights Reserved ``` ## 技术栈 | 层级 | 技术 | |-------|-----------| | 语言 | 原生 ES6+ JavaScript(无构建步骤,无框架) | | 样式 | CSS3(包含 glassmorphism、backdrop-filter、CSS 变量) | | API | GeoJS、FreeIPApi、ipapi.is、Open-Meteo | | 地图 | OpenStreetMap iframe 嵌入 | | 通知 | `GM_notification` (Tampermonkey) 和 Web Notifications API | | 存储 | `localStorage` | | 托管 | GitHub(用户脚本源码)和 Cloudflare Pages(网站) | ## API 与数据源 所有地理定位和数据扩充 API 都是**免费的、无需 key 的,并且启用了 CORS**: | 服务 | Endpoint | 提供的数据 | |---------|----------|---------------| | GeoJS | `get.geojs.io` | IP、国家、地区、城市、纬度、经度 | | FreeIPApi | `free.freeipapi.com` | IP、国家、地区、城市、ISP、代理和 VPN 标记 | | ipapi.is | `api.ipapi.is` | IP、国家、ASN、ISP、托管、移动、Tor 标记 | | Open-Meteo | `api.open-meteo.com` | 当前天气(温度、风速、状况) | ## 自动更新系统 GeoChecker 拥有包含三层的更新机制: ### 第一层:原生 Tampermonkey 自动更新 - Tampermonkey 每 24 小时检查一次 `@downloadURL`。 - 将远程的 `@version` 与本地版本进行比较。 - 当版本号增加时静默安装更新。 ### 第二层:脚本内版本轮询 - 脚本每 30 分钟通过 `GM_xmlhttpRequest` 获取一次远程文件。 - 解析远程的 `@version` 标头。 - 如果较新:显示一条带有可点击更新链接的 Toast 通知。 ### 第三层:手动检查 - Tampermonkey 菜单中的“检查更新”会立即触发版本比较。 - 确认是否为最新状态或提示更新。 **重要提示:** 每次发布时都必须提升 `@version` 元数据的版本号。如果没有版本升级,Tampermonkey 将看不出差异并跳过更新。 ## 更新日志 ### v5.0.4 - 重新设计了键盘快捷键帮助悬浮窗,以匹配 glassmorphism 主题。 - 修复了按键徽标的对比度:明亮的强调色文本搭配发光边框。 - 添加了入场动画(缩放 + 淡入)和错落的滑入行效果。 - 添加了 Escape 键以关闭帮助悬浮窗。 - 将关闭按钮的文本更改为带有渐变和悬停发光效果的“Got it”。 ### v5.0.3 - 将许可证更改为 **保留所有权利**(原为 MIT)。未经书面许可,严禁未经授权的使用、修改或分发。 - 添加了带有 `@downloadURL` 和 `@updateURL` 元数据的自动更新系统。 - 添加了脚本内版本轮询(30 分钟间隔)和手动检查菜单项。 - 从仓库中删除了 `index.html` 和 `server.js`(通过 Cloudflare Pages 托管)。 ### v5.0.2 - 修复了更新 Toast 链接,使其直接使用原始的 `.user.js` URL(避免 TM 重定向页面)。 ### v5.0.1 - 修复了多个 PC 之间 `prevStatsMap` 的键冲突(通过 `__gc_stats_id` 实现每个 PC 的作用域划分)。 - 添加了主 PC 选举机制,以防止同时连接造成的全局 UI 状态损坏。 - 修复了 SPA 导航导致 hook/被动扫描间隔永久终止的问题。 - 在 `RTCPeerConnection` 构造函数 hook 上使用了 `Reflect.construct`,以实现稳健的 ES6 子类化。 - 在检测到新 peer 时清除了 `weatherData`,以防止天气显示陈旧。 - 在 `Notification.requestPermission()` 周围添加了 `try/catch`,以适配受限的浏览器。 - 为 `?` 键盘快捷键添加了输入保护(防止在输入时触发)。 ### v5.0.0 - 完全重写,采用 glassmorphism UI 和 10 标签页悬浮窗。 - 添加了 mDNS 和 IPv6 泄漏检测、编解码器指纹识别、DTLS 信息。 - 添加了 NAT 类型分析、peer 指纹识别、会话时间线。 - 添加了 11 项服务的 OSINT 套件、自动刷新地理定位。 - 添加了 Tampermonkey 原生菜单集成(`GM_registerMenuCommand`)。 - 添加了桌面通知(`GM_notification`)、主播模式、紧凑模式。 - 添加了可拖拽和缩放的悬浮窗,并支持位置记忆。 ## 免责声明 本工具仅供**教育和个人使用**。 - IP 地理定位是近似的(最高为城市级别的准确度)。 - WebRTC IP 提取是一种已知的浏览器行为。本工具仅显示已经在传输中的信息。 - 请尊重他人的隐私以及您使用此工具的任何平台的服务条款。 - 作者不对滥用或违反平台政策的行为负责。
由 **w0wzahh** 用 ❤️ 制作
标签:DFIR, IP地理定位, WebRTC, 代码示例, 数据分析, 数据可视化, 浏览器脚本, 策略控制器, 自定义脚本, 视频聊天