🚀 Transparent proxy injector for Antigravity. Force SOCKS5/HTTP proxy without TUN mode on Windows. | 专为 Antigravity 打造的免 TUN 强制代理工具,支持 DLL 注入与进程流量劫持。
C++
4,118
124 commits
updated Sep 1, 2026
🚀 专为 Antigravity 编辑器打造:在中国也能无需 TUN 模式稳定走代理
🇬🇧 English Version | 🇷🇺 Русская версия
先说结论:如果 Antigravity 的对话框里出现
Agent execution terminated due to error,请先排查代理出口 IP,不要先怀疑 DLL 没生效。
我们已经在真实现场里确认过,最容易误判的场景是:
version.dll 已加载language_server_windows_x64.exe 已注入node.exe 也已注入oauth2.googleapis.com / daily-cloudcode-pa.googleapis.com 仍然可以通过 SOCKS5 正常连通ls-main.log 仍然返回:
FAILED_PRECONDITION (code 400): User location is not supported for the API use.这类问题的主因通常不是 DLL 失效,而是:
<Antigravity安装目录>\\logs\\proxy-YYYYMMDD.log如果你在这份日志里看到类似下面这些关键行,说明 DLL 本身已经在工作:
[成功] 已注入目标进程: language_server_windows_x64.exe[成功] 已注入目标进程: node.exeSOCKS5: 隧道建立成功, 目标=oauth2.googleapis.com:443SOCKS5: 隧道建立成功, 目标=daily-cloudcode-pa.googleapis.com:443在配置页开启 diagnostics.agent_ip_probe 后,DLL 会额外输出 IP 诊断日志:
[诊断/IP] 当前代理出口探测完成: ...[诊断/IP] 当前代理出口呈现机房/托管特征...[诊断/IP] 最新 Antigravity 日志已命中 location 限制错误,同时当前代理出口呈现机房/托管特征...%APPDATA%\\Antigravity\\logs\\<最新时间目录>\\ls-main.log如果你在这里看到:
agent executor error: FAILED_PRECONDITION (code 400): User location is not supported for the API use.那就说明:
proxy-YYYYMMDD.log
%APPDATA%\\Antigravity\\logs\\<最新目录>\\ls-main.log
User location is not supported for the API use.,优先排 IP。Antigravity 对话报错时,先排出口 IP,再排 DLL。看到
location is not supported基本优先看 IP。
Antigravity-Proxy 是专门为 Antigravity 编辑器量身定制的 Windows 代理注入组件(DLL)。
它的目标很简单:让中国用户使用 Antigravity 时,不用开 Clash TUN 模式,也能把网络流量稳定交给你的 SOCKS5/HTTP 代理。
项目名 Antigravity-Proxy = Antigravity + Proxy:只把 Antigravity 相关进程的流量“拽”进代理里(别担心,不会全局接管)。
你是否遇到过这些情况?
Antigravity-Proxy 就是来专治这个的。 它可以:
| 传统方案 | Antigravity-Proxy |
|---|---|
| 需要 TUN 模式 | 无需 TUN |
| 全局代理 | 精准代理指定进程 |
| 需要管理员权限 | 普通用户即可 |
| 配置复杂 | 放入 DLL 即用 |
在使用本工具前,请确保系统已安装必要的运行库,否则可能无法正常启动目标程序。
如果启动程序时遇到 错误代码 0xc0000142(如下图所示),通常是由于系统缺少 Windows 运行库导致的。
请安装 微软常用运行库合集,该工具已包含在本仓库中:
📦 下载路径: microsoft\微软常用运行库合集-2025.exe
安装步骤:
microsoft 目录微软常用运行库合集-2025.exe只想让 Antigravity 立刻能用?看这一节就够了。
启动你的代理软件(例如 Clash/Mihomo),确保本机有可用的 SOCKS5 或 HTTP 代理端口(如 127.0.0.1:7890)。
| 代理软件 | SOCKS5 端口 | HTTP 端口 | 混合端口 | 备注 |
|---|---|---|---|---|
| Clash / Clash Verge | 7891 | 7890 | 7890 | 混合端口同时支持 SOCKS5 和 HTTP |
| Clash for Windows | 7891 | 7890 | 7890 | 设置 → Ports 可查看/修改 |
| Mihomo (Clash Meta) | 7891 | 7890 | 7890 | 同 Clash 配置格式 |
| V2RayN | 10808 | 10809 | - | 设置 → 参数设置 → Core 基础设置 |
| V2RayA | 20170 | 20171 | - | 后台管理页面可修改 |
| Shadowsocks | 1080 | - | - | 仅 SOCKS5,无 HTTP |
| ShadowsocksR | 1080 | - | - | 仅 SOCKS5,无 HTTP |
| Surge (Mac/iOS) | 6153 | 6152 | - | 增强模式下端口可能不同 |
| Qv2ray | 1089 | 8889 | - | 首选项 → 入站设置 |
| sing-box | 自定义 | 自定义 | 自定义 | 需在配置文件中手动指定 |
| NekoBox | 2080 | 2081 | - | 设置 → 入站 |
| Clash Meta for Android | 7891 | 7890 | 7890 | 同 Clash 规则 |
💡 推荐使用 SOCKS5 协议:本工具对 SOCKS5 的支持更完善,建议优先使用。
方法 1:查看代理软件界面
方法 2:命令行测试
# 测试 SOCKS5 端口 (默认 7891)
Test-NetConnection -ComputerName 127.0.0.1 -Port 7891
# 测试 HTTP 端口 (默认 7890)
Test-NetConnection -ComputerName 127.0.0.1 -Port 7890
方法 3:curl 测试(需安装 curl)
# 通过 SOCKS5 代理访问
curl -x socks5://127.0.0.1:7891 https://www.google.com -I
# 通过 HTTP 代理访问
curl -x http://127.0.0.1:7890 https://www.google.com -I
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 端口被占用 | 其他程序使用了该端口 | `netstat -ano |
| 连接被拒绝 | 代理软件未启动或端口错误 | 确认代理软件已启动,检查端口配置 |
| 代理无响应 | 防火墙阻止 | 检查 Windows 防火墙设置 |
Release 按架构和运行目标提供四个独立压缩包,下载时只选实际使用的一套:
antigravity-proxy-vX-ide-win-x64.zip / ...-x86.zip:包含 ide/(version.dll、config.json)。antigravity-proxy-vX-cli-win-x64.zip / ...-x86.zip:包含 cli/(dbghelp.dll、antigravity_proxy.dll、config.json)。每个压缩包还包含通用的 config-web.html 与 使用说明.md;自行编译时仍会在本地 output/ide、output/cli 生成两套目录。
桌面端只复制 ide/ 内的文件到 Antigravity 主程序目录(与 Antigravity.exe 同级)。
如果使用 Antigravity CLI,只复制 cli/ 内的文件到 agy.exe 同级目录。dbghelp.dll 会在导出函数首次调用时加载唯一名称的 antigravity_proxy.dll,避开系统 version.dll 同名冲突。
ide/与cli/不要混合复制;桌面端不需要dbghelp.dll。
version.dll与config.json必须来自同一次构建且架构一致。当前版本默认对宿主进程启用全量网络 Hook;启动日志应出现使用全量模式,随后再以 OAuth 回调和业务请求日志做功能验收。
Antigravity 2.0 新增/改名了关键进程,默认配置已覆盖:
"target_processes": [
"agy.exe",
"language_server.exe",
"language_server_windows",
"Antigravity.exe",
"Antigravity IDE.exe",
"node.exe"
]
如果你是从旧版本手动迁移 config.json,请确认 child_injection 仍为 true,并把上面的目标进程列表同步进去。2.0 环境如果存在多个启动目录,也要把 version.dll 和 config.json 放到实际启动的 Antigravity/IDE 目录中。
Antigravity 更新后可能清理安装目录里的劫持文件;如果更新后不走代理,请重新复制这些文件。若代理软件区分 mixed-port 和 SOCKS5 端口,也要确认 proxy.type 和 proxy.port 匹配本机实际监听端口。
更多现场记录见 docs/antigravity-2.0-issue-85.md。
一般情况下 Antigravity 会装在:
例如:C:\Users\<用户名>\AppData\Local\Programs\Antigravity
如果你找不到这个目录:在桌面/开始菜单找到 Antigravity 图标,右键 → 打开文件所在的位置,跳出来的那个目录就是它的主程序目录。
想从命令行一键跳过去(少点鼠标,多点快乐):
cd "$env:LOCALAPPDATA\Programs\Antigravity"
cd /d "%LOCALAPPDATA%\Programs\Antigravity"
(可选)你也可以自己设个环境变量,之后就能 cd 秒过去:
setx ANTIGRAVITY_HOME "%LOCALAPPDATA%\Programs\Antigravity"
设置完后:PowerShell 用 cd $env:ANTIGRAVITY_HOME,CMD 用 cd /d %ANTIGRAVITY_HOME%。
代理不工作?按照本手册逐步排查,找到问题根源。
代理不工作?
│
├── 检查日志是否存在 ───────────────────────────────────┐
│ │ │
│ ├── ❌ 无日志 → DLL未加载/位置错误 │
│ │ └── 见「DLL 加载问题」 │
│ │ │
│ └── ✅ 有日志 → 继续检查日志内容 │
│ │ │
├── 日志中有 "SOCKS5: 隧道建立成功" 吗? ────────────────┤
│ │ │
│ ├── ❌ 没有 → 代理连接失败 │
│ │ └── 见「代理软件排查」 │
│ │ │
│ └── ✅ 有 → 隧道建立成功,问题在后续 │
│ │ │
└── 检查 Clash 日志和节点可用性 ──────────────────────────┘
日志是排查问题的第一手资料。
日志位置(按优先级):
<Antigravity安装目录>\logs\proxy-YYYYMMDD.log%TEMP%\antigravity-proxy-logs\proxy-YYYYMMDD.log快速打开:
# 打开 DLL 目录的 logs 文件夹
cd "$env:LOCALAPPDATA\Programs\Antigravity\logs"
# 或打开 TEMP 目录
cd "$env:TEMP\antigravity-proxy-logs"
日志关键行解读:
| 日志内容 | 含义 | 状态 |
|---|---|---|
Antigravity-Proxy DLL 已加载 | DLL 成功注入 | ✅ 正常 |
配置加载成功 | config.json 读取成功 | ✅ 正常 |
所有 API Hook 安装成功 | Hook 生效 | ✅ 正常 |
ConnectEx Hook 已安装 | 异步连接 Hook 成功 | ✅ 正常 |
SOCKS5: 隧道建立成功 | 代理连接成功 | ✅ 正常 |
非 SOCK_STREAM socket 直连, soType=2 | UDP 有效策略为 direct,或该端口未命中代理规则 | ⚠️ 视配置而定 |
SOCKS5 握手失败 | 代理握手失败 | ❌ 需排查 |
连接代理服务器失败 | 无法连接到代理 | ❌ 需排查 |
WSA错误码=10061 | 连接被拒绝(代理未启动) | ❌ 需排查 |
WSA错误码=10060 | 连接超时 | ❌ 需排查 |
# 测试 SOCKS5/混合端口
Test-NetConnection -ComputerName 127.0.0.1 -Port 7890
# 如果 TcpTestSucceeded: False,说明端口未监听
在 Clash 配置文件中检查:
# 必须开启混合端口或 SOCKS5 端口
mixed-port: 7890 # 混合端口(推荐)
# 或
port: 7890 # HTTP 端口
socks-port: 7891 # SOCKS5 端口
# 如果需要局域网访问
allow-lan: true
在 Clash 界面查看「日志」或「Logs」,确认:
daily-cloudcode-pa.googleapis.com、www.googleapis.com 的请求DIRECT(直连)还是走了代理节点REJECT 规则命中最简单的方法:直接开启 TUN 模式,如果 TUN 模式下 Antigravity 正常,说明节点没问题。
winver
不同 Windows 11 小版本的 Winsock 行为可能有差异。请记录版本号备用。
某些安全软件会注入 LSP(分层服务提供程序),可能干扰 Hook。
# 以管理员身份运行
netsh winsock show catalog
正常情况下只应该有 Microsoft 的 Provider。如果看到第三方 Provider(如 360、火绒等),可能会有兼容性问题。
以下软件可能干扰 DLL 注入或 Hook:
| 软件 | 可能的影响 | 解决方案 |
|---|---|---|
| 360 安全卫士 | 拦截 DLL 注入、Hook | 添加白名单或临时关闭 |
| 火绒安全 | 可能阻止远程线程注入 | 添加白名单 |
| 腾讯电脑管家 | LSP 注入可能干扰网络 | 添加白名单 |
| Windows Defender | 通常不干扰 | 无需处理 |
临时排查:尝试完全退出安全软件后测试(不只是退到托盘,要完全退出)。
如果系统启用了 IPv6,某些连接可能尝试 IPv6 优先:
# 查看网络适配器 IPv6 状态
Get-NetAdapterBinding -ComponentID ms_tcpip6
如果日志中出现大量 IPv6 相关内容,可以尝试在 config.json 中设置:
"proxy_rules": {
"ipv6_mode": "block"
}
如果你的环境正常,但朋友的不行,请对比以下信息:
| 对比项 | 你的值 | 对方的值 |
|---|---|---|
| Windows 版本 (winver) | ||
| Clash 版本 | ||
| 代理端口 | 7890 | |
| 代理类型 | socks5 | |
| 是否有安全软件 | ||
netsh winsock show catalog 输出行数 |
如果以上排查都无法解决,请收集以下信息提交 GitHub Issue:
proxy-YYYYMMDD.log 内容winver 输出| 问题 | 原因 | 解决方案 |
|---|---|---|
大量 非 SOCK_STREAM socket 直连, soType=2 | UDP/QUIC 有效策略为 direct,或 UDP 代理未生效 | 优先使用 udp_mode=auto + proxy.type=socks5,并确认代理端支持 SOCKS5 UDP Associate |
| 日志显示成功但网页打不开 | Clash 规则、节点问题 | 检查 Clash 日志 |
| 某些请求绕过代理 | 应用使用了未 Hook 的 API | 提交 Issue 反馈 |
| 360 等安全软件环境下失效 | LSP 注入干扰 | 添加白名单或卸载 |
遇到问题时,建议先确认目标程序位数(x86/x64),并查看目标程序目录下的日志文件(如
proxy-YYYYMMDD.log)。
| 错误码 | 问题描述 | 可能原因 | 解决方案 |
|---|---|---|---|
0xC0000142 | 应用程序无法正常启动(已知:部分环境使用 x64 版本会出现此错误,切换到 x86 版本可以正常运行) | 架构不兼容(目标程序为 x86,但放入了 x64 的 version.dll)依赖库缺失或版本不匹配(常见:VC++ 运行库未安装/版本不一致) 安全软件拦截/隔离导致初始化失败 | 使用与目标程序一致的版本(x86 程序用 x86,x64 程序用 x64) 安装对应架构的 VC++ 2015-2022 运行库(尤其是 x64) 尝试使用静态运行库构建: .\build.ps1 -StaticRuntime |
| 错误码 | 问题描述 | 可能原因 | 解决方案 |
|---|---|---|---|
0xC000007B | 应用程序无法正常启动(常见于位数不匹配) | version.dll 与目标程序位数不一致(x86/x64 混用)依赖 DLL 位数不一致或文件损坏 | 确保 version.dll 与目标程序位数一致,并替换为对应版本产物清理目标目录中可能残留的旧 DLL 后重试 |
0xC0000135 | 找不到组件/缺少 DLL,程序无法启动 | 依赖库缺失(常见:VC++ 运行库 DLL 缺失) 依赖库被安全软件删除/隔离 | 安装对应架构的 VC++ 2015-2022 运行库 或使用静态运行库构建: .\build.ps1 -StaticRuntime |
VCRUNTIME140_1.dll 缺失 | 启动时报“找不到 VCRUNTIME140_1.dll” | VC++ 2015-2022 运行库未安装或被安全软件删除 | 安装对应架构的 VC++ 2015-2022 运行库(x64/x86) 或使用静态运行库构建: .\build.ps1 -StaticRuntime |
0xC0000906 | 应用程序无法正常启动 | 文件被安全软件拦截/隔离 文件不完整或已损坏 | 重新获取/重新编译 DLL 并替换 将目标程序目录加入安全软件白名单/排除项后重试 |
0xC0000005 | 程序启动后闪退/崩溃(事件查看器常见) | Hook 与目标程序/系统环境不兼容 目标进程范围过大,误注入导致冲突 | 缩小 target_processes 仅代理必要进程必要时关闭 child_injection 或 fake_ip 排查 |
10061 (WSAECONNREFUSED) | 代理连接被拒绝(通常会出现在日志里) | 代理软件未启动或端口未监听config.json 中代理地址/端口错误 | 启动代理软件并确认端口可用(如 127.0.0.1:7890)检查并修正 config.json 的 proxy.host/proxy.port |
10060 (WSAETIMEDOUT) | 连接超时(通常会出现在日志里) | 代理不可达/网络被阻断 超时配置过短 | 检查代理与网络状态后重试 适当增大 config.json 的 timeout.connect/send/recv |
| 功能 | 说明 | Feature | Description |
|---|---|---|---|
| 🔀 代理重定向 | 拦截 connect() 调用,重定向至代理服务器 | Proxy Redirect | Intercepts connect() and redirects to proxy |
| 🌐 FakeIP 系统 | 拦截 DNS 解析,分配虚拟 IP 并建立映射 | FakeIP System | Intercepts DNS, allocates virtual IPs |
| 👶 子进程注入 | 自动将 DLL 注入到子进程 | Child Injection | Auto-injects DLL into child processes |
| ⏱️ 超时控制 | 防止目标程序因网络问题卡死 | Timeout Control | Prevents hanging on network issues |
| 🔄 Fail-Safe | 配置加载失败时自动直连 | Fail-Safe | Falls back to direct connection on error |
| 🎯 进程过滤 | 仅代理指定的进程列表 | Process Filter | Proxy only specified processes |
| 📊 流量监控 | 可选的流量日志记录 | Traffic Monitor | Optional traffic logging |
┌─────────────────────────────────────────────────────────────────────────┐
│ 目标程序 (Target Process) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ 应用代码 │───►│ Winsock API │───►│ antigravity-proxy.dll │ │
│ │ (App Code) │ │ (ws2_32.dll) │ │ (Hook Layer) │ │
│ └──────────────┘ └──────────────┘ └────────────┬─────────────┘ │
│ │ │
└───────────────────────────────────────────────────────│──────────────────┘
▼
┌──────────────────┐
│ 代理服务器 │
│ (SOCKS5/HTTP) │
│ Proxy Server │
└──────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ 1. DLL 劫持 (DLL Hijacking) │
│ 程序加载 version.dll → 加载我们的 DLL → 转发真实 version.dll 调用 │
└─────────────────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 2. API Hook 安装 (Install Hooks) │
│ 使用 MinHook 拦截: connect, getaddrinfo, CreateProcessW 等 │
└─────────────────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 3. DNS 拦截 (DNS Interception) │
│ getaddrinfo("example.com") → 分配 FakeIP (198.18.x.x) → 记录映射 │
└─────────────────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 4. 连接重定向 (Connection Redirect) │
│ connect(198.18.x.x) → 查询映射还原域名 → 连接代理 → SOCKS5 握手 │
└─────────────────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 5. 子进程传播 (Child Process Propagation) │
│ CreateProcessW → 挂起进程 → 注入 DLL → 恢复运行 │
└─────────────────────────────────────────────────────────────────────────┘
| API | 模块 | 用途 |
|---|---|---|
connect | ws2_32.dll | 拦截 TCP 连接 |
WSAConnect | ws2_32.dll | 拦截 WSA 方式连接 |
getaddrinfo | ws2_32.dll | 拦截 DNS 解析 (ANSI) |
GetAddrInfoW | ws2_32.dll | 拦截 DNS 解析 (Unicode) |
WSAConnectByNameA/W | ws2_32.dll | 拦截按名称连接 |
ConnectEx | ws2_32.dll | 拦截异步连接 |
CreateProcessW | kernel32.dll | 拦截进程创建,注入子进程 |
send/recv | ws2_32.dll | 流量监控(可选) |
在开始编译之前,请确保已安装以下工具:
💡 提示: 安装 Visual Studio 时,请确保勾选 "使用 C++ 的桌面开发" 工作负载。
| 依赖 | 说明 | 获取方式 |
|---|---|---|
| MinHook | API Hook 框架 | 已内置于项目 |
| nlohmann/json | JSON 解析库 | 编译脚本自动下载 |
项目提供了 PowerShell 编译脚本,支持一键编译:
# 默认编译 Release x64
.\build.ps1
# 编译 Debug 版本
.\build.ps1 -Config Debug
# 编译 32 位版本
.\build.ps1 -Arch x86
# 清理后重新编译
.\build.ps1 -Clean
# 输出详细编译日志
.\build.ps1 -Verbose
# 构建并运行 CTest(CI/Release 使用)
.\build.ps1 -RunTests
# 显式声明跳过测试(也是默认行为)
.\build.ps1 -SkipTests
# 查看帮助
.\build.ps1 -Help
如果你更喜欢手动编译,也可以使用以下命令:
# ========== x64 (64位) ==========
mkdir build-x64 && cd build-x64
# 配置 (使用 Visual Studio 2022)
cmake .. -G "Visual Studio 17 2022" -A x64
# 编译 Release 版本
cmake --build . --config Release
# 输出: version.dll
# ========== x86 (32位) ==========
mkdir build-x86 && cd build-x86
# 配置
cmake .. -G "Visual Studio 17 2022" -A Win32
# 编译
cmake --build . --config Release
# 输出: version.dll
原因: CMake 未安装或未添加到 PATH
解决方案:
原因: Visual Studio 未安装或 C++ 工具链缺失
解决方案:
原因: JSON 库未下载
解决方案:
使用编译脚本 build.ps1 会自动下载,或手动下载:
# 手动下载
curl -o include/nlohmann/json.hpp https://raw.githubusercontent.com/nlohmann/json/develop/single_include/nlohmann/json.hpp
原因: 链接错误,通常是 Winsock 库未链接
解决方案: 确保 CMakeLists.txt 中包含:
target_link_libraries(version PRIVATE ws2_32)
只需 3 步,即可让目标程序走代理!
编译完成后,你会在 output 目录得到:
ide/version.dll 与 ide/config.json - 桌面端部署目录cli/dbghelp.dll、cli/antigravity_proxy.dll 与 cli/config.json - CLI 部署目录config-web.html 与 使用说明.md - 配置工具和说明编辑 config.json:
{
"proxy": {
"host": "127.0.0.1",
"port": 7890,
"type": "socks5"
},
"fake_ip": {
"enabled": true,
"cidr": "198.18.0.0/15"
},
"timeout": {
"connect": 5000,
"send": 5000,
"recv": 5000
},
"child_injection": true,
"child_injection_mode": "filtered",
"target_processes": [
"agy.exe",
"language_server.exe",
"language_server_windows",
"Antigravity.exe",
"Antigravity IDE.exe",
"node.exe"
],
"proxy_rules": {
"allowed_ports": [80, 443],
"dns_mode": "direct",
"ipv6_mode": "proxy"
}
}
将 version.dll 和 config.json 复制到目标程序的同一目录:
目标程序目录/
├── 目标程序.exe
├── version.dll ← 放这里
└── config.json ← 放这里
启动目标程序,完成!🎉
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
proxy.host | string | "127.0.0.1" | 代理服务器地址 |
proxy.port | int | 7890 | 代理服务器端口 |
proxy.type | string | "socks5" | 代理类型: socks5 或 http(兼容 https,按 http 处理) |
fake_ip.enabled | bool | true | 是否启用 FakeIP 系统 |
fake_ip.cidr | string | "198.18.0.0/15" | FakeIP 地址范围 (基准测试保留网段) |
timeout.connect | int | 5000 | 连接超时 (毫秒) |
timeout.send | int | 5000 | 发送超时 (毫秒) |
timeout.recv | int | 5000 | 接收超时 (毫秒) |
child_injection | bool | true | 是否注入子进程 |
traffic_logging | bool | false | 是否记录流量日志 |
diagnostics.agent_ip_probe | bool | false | 是否探测代理出口 IP 并关联 location 日志 |
target_processes | array | [] | 目标进程列表 (空=全部) |
proxy_rules.allowed_ports | array | [80, 443] | 端口白名单 (空=全部) |
proxy_rules.dns_mode | string | "direct" | DNS策略: direct(直连) / proxy(走代理) |
proxy_rules.ipv6_mode | string | "proxy" | IPv6策略: proxy(走代理) / direct(直连) / block(阻止) |
proxy_rules.udp_mode | string | "auto" | UDP策略: auto(SOCKS5 自动代理) / block / direct / proxy |
proxy_rules.udp_fallback | string | "block" | UDP 代理失败或 auto 遇到非 SOCKS5 代理时: block / direct |
proxy_rules.routing.enabled | bool | true | 是否启用规则路由 |
proxy_rules.routing.priority_mode | string | "order" | 规则优先级: order(按顺序) / number(priority) |
proxy_rules.routing.default_action | string | "proxy" | 未命中时默认动作 |
proxy_rules.routing.use_default_private | bool | true | 自动加载 RFC1918/loopback 内网直连规则 |
proxy_rules.routing.rules | array | [] | 规则列表(支持 CIDR/域名通配符/端口/协议) |
路由规则由 proxy_rules.routing 管理,支持 CIDR/域名通配符/端口/协议分流,优先级可选 order(按顺序) 或 number(priority)。
{
"proxy_rules": {
"routing": {
"enabled": true,
"priority_mode": "order",
"default_action": "proxy",
"use_default_private": true,
"rules": [
{
"name": "lan-direct",
"action": "direct",
"ip_cidrs_v4": ["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"],
"ip_cidrs_v6": ["fc00::/7","fe80::/10","::1/128"],
"domains": [".local","*.corp.example.com"],
"protocols": ["tcp"]
}
]
}
}
}
可视化配置工具:resources/config-web/index.html(本地打开即可使用;或构建后使用 output/config-web.html,支持导入/编辑/导出 config.json)。
说明:AUTHORS.txt 为内嵌的 MinHook 依赖作者名单,并非本项目维护者列表。
提示:
* 将匹配所有域名。0.0.0.0/0 与 ::/0。proxy.host / proxy.port / proxy.type 的编辑。direct + domains + ports:在部分旧版本中,若启用 FakeIP,且 action=direct 的规则同时配置了 domains 与 ports,可能出现 DNS 阶段分配 FakeIP,随后 connect 阶段“直连虚拟地址”导致连接失败。若你仍在使用旧版本,建议升级;或临时规避:移除该规则的 ports 条件,或关闭 FakeIP。当日志出现 SOCKS5: 读取认证响应失败, WSA错误码=10060,且目标是 IPv6 地址(如 2001:4860:4860::8888:443),表示代理没有及时响应该 IPv6 连接。
当前版本会在 IPv6 socket 创建且尚未 bind 时自动关闭 IPV6_V6ONLY,使 127.0.0.1 这类 IPv4 代理可通过 v4-mapped IPv6 地址连接。若应用之后重新启用 v6-only,日志会输出具体 WSA 错误码。
可选处理方式:
proxy_rules.ipv6_mode 改为 block(阻止)或 direct(直连)。::1,再把 proxy.host 改为 ::1。优先级说明:当目标为纯 IPv6(非 v4-mapped)且 proxy_rules.ipv6_mode 为 direct/block 时,会在进入 routing 规则前直接直连/阻止;当 ipv6_mode=proxy 时才会继续进入 routing 匹配。
当目标程序使用 QUIC/HTTP3(UDP/443)时,默认 udp_mode=auto 会在 SOCKS5 下自动使用 UDP Associate。
推荐配置:
proxy_rules.udp_mode=autoproxy.type 设为 socks5(HTTP 代理没有标准 UDP 转发能力)proxy_rules.udp_fallback 设为 direct(⚠️ 可能导致 UDP 直连泄漏;默认 block 更安全)示例:
{
"proxy": { "host": "127.0.0.1", "port": 10808, "type": "socks5" },
"proxy_rules": {
"udp_mode": "auto",
"dns_mode": "direct",
"allowed_ports": [80, 443]
}
}
说明:
dns_mode="direct" 仍会放行 UDP/53(避免 DNS 超时);若你希望 DNS 也走代理,请改为 dns_mode="proxy"。auto + socks5 的有效策略为 proxy;auto + http 按 udp_fallback 决定 block/direct。udp_mode=block 会阻断大部分 UDP,但仍放行 loopback 与 UDP/53。proxy-YYYYMMDD.log)日志文件按以下优先级存放:
| 优先级 | 位置 | 说明 |
|---|---|---|
| 1️⃣ | <DLL所在目录>\logs\ | 与代理主体 DLL 同级的 logs 子目录 |
| 2️⃣ | %TEMP%\antigravity-proxy-logs\ | 系统临时目录(通常为 C:\Users\<用户名>\AppData\Local\Temp\antigravity-proxy-logs\) |
💡 提示:如果在 DLL 目录无法创建
logs文件夹(例如权限不足),日志会自动回退到系统 TEMP 目录。快速打开 TEMP 目录:按
Win+R,输入%TEMP%,回车即可。
⚠️ 重要提示:Antigravity-Proxy(version.dll 劫持方案)无法直接代理 WSL 内部的流量。
这是由技术架构决定的根本性限制,无法通过修改代码来解决:
| 技术层面 | 详细说明 |
|---|---|
| DLL 注入机制 | 本项目使用 Windows version.dll 劫持,只能 Hook Windows PE 进程 |
| Winsock API | 拦截的是 ws2_32.dll 中的 connect()、getaddrinfo() 等 Windows 专用 API |
| WSL 架构 | WSL2 运行真正的 Linux 内核,网络使用 Linux socket() 系统调用,与 Windows Winsock 完全独立 |
| 进程边界 | 即使注入 wsl.exe,也无法 Hook 其内部 Linux 子系统中 language_server_linux_x64 发出的流量 |
┌─────────────────────────────────────────────────────────────────┐
│ Windows 主机 │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Antigravity-Proxy (version.dll) │ │
│ │ ├── Hook: connect(), getaddrinfo(), WSAConnect()... │ │
│ │ └── ✅ 可以拦截所有 Windows 进程的网络请求 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │ │
│ ❌ 无法穿透 │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ WSL2 (轻量级 Linux 虚拟机) │ │
│ │ ┌──────────────────────────────────────────────────────┐ │ │
│ │ │ language_server_linux_x64 │ │ │
│ │ │ └── 使用 Linux socket() 系统调用 → 绕过 Winsock │ │ │
│ │ └──────────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
antissh 是专门为在 WSL 中代理 Antigravity Agent 设计的工具。
原理:在 WSL 内部使用 graftcp 对 language_server_linux_x64 进行代理包装。
快速开始:
# 在 WSL 中执行
curl -O https://raw.githubusercontent.com/ccpopy/antissh/main/antissh.sh
chmod +x antissh.sh
bash ./antissh.sh
脚本会引导你:
socks5://127.0.0.1:10808)language_server_linux_x64优点:
注意:IDE 升级后可能需要重新运行脚本。
原理:让 WSL 共享 Windows 的网络栈,从而可以使用 127.0.0.1 访问 Windows 上的代理。
配置步骤:
.wslconfig 文件:# PowerShell 执行
notepad "$env:USERPROFILE\.wslconfig"
[wsl2]
networkingMode=mirrored
wsl --shutdown
~/.bashrc 或 ~/.zshrc):export ALL_PROXY=socks5://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export HTTP_PROXY=http://127.0.0.1:7890
要求:
wsl --version 检查)优点:
缺点:
原理:使用 Clash/Mihomo 的 TUN 模式创建虚拟网卡,在 IP 层拦截所有流量。
操作:在 Clash/Mihomo 中开启 TUN 模式即可。
优点:
缺点:
| 方案 | 适用场景 | 复杂度 | 推荐度 |
|---|---|---|---|
| antissh | 仅需在 WSL 中代理 Antigravity | 中等 | ⭐⭐⭐⭐⭐ |
| Mirrored 模式 | 系统满足版本要求,需简单代理 | 低 | ⭐⭐⭐⭐ |
| TUN 全局代理 | 需要所有流量代理 | 低 | ⭐⭐⭐ |
附加价值:本项目首先为 Antigravity 服务,但底层是通用的进程级强制代理方案,也可以用来强制代理其他不走系统代理的 Windows 程序,或基于此二次开发。
想让 Chrome、VS Code 或其他程序也走代理?只需修改配置文件!
{
"proxy": {
"host": "127.0.0.1",
"port": 7890,
"type": "socks5"
},
"child_injection": true,
"target_processes": []
}
然后将 version.dll 和 config.json 复制到 Chrome 安装目录:
C:\Program Files\Google\Chrome\Application\
├── chrome.exe
├── version.dll ← 放这里
└── config.json ← 放这里
C:\Users\你的用户名\AppData\Local\Programs\Microsoft VS Code\
├── Code.exe
├── version.dll ← 放这里
└── config.json ← 放这里
如果你只想代理程序的某些子进程,可以使用 target_processes 配置:
{
"target_processes": [
"node.exe",
"npm.cmd",
"language_server.exe"
]
}
如果你想基于此项目进行二次开发,以下是关键代码位置:
| 模块 | 文件 | 说明 |
|---|---|---|
| 配置加载 | src/core/Config.hpp | 修改配置项结构 |
| 网络 Hook | src/hooks/Hooks.cpp | 添加/修改 Hook 函数 |
| 代理协议 | src/network/Socks5.hpp | SOCKS5 握手实现 |
| 代理协议 | src/network/HttpConnect.hpp | HTTP CONNECT 实现 |
| FakeIP | src/network/FakeIP.hpp | 虚拟 IP 分配逻辑 |
| DLL 劫持 | src/proxy/VersionProxy.cpp | version.dll 代理转发 |
| 进程注入 | src/injection/ProcessInjector.hpp | 子进程注入逻辑 |
src/hooks/Hooks.cpp 中定义函数指针类型和 Detour 函数Hooks::Install() 中添加 MH_CreateHookApi() 调用Hooks::Uninstall() 中处理清理逻辑src/network/ 下创建新的协议实现 (参考 Socks5.hpp)src/hooks/Hooks.cpp 的 DoProxyHandshake() 中添加协议分支本项目基于 BSD-2-Clause License 开源。
MinHook 部分版权归 Tsuda Kageyu 所有。
|
煎饼果子(86) 独立开发者 / Independent Developer |
如果这个项目对你有帮助,欢迎:
![]() 添加微信交流 |
![]() 关注公众号 |
![]() 🔥 加入微信交流群 |
如果这个项目帮到了你,可以请作者喝杯咖啡 ☕
![]() 微信赞赏 |
![]() 支付宝打赏 |
本仓库的 pseudocode_dll/ 目录收录了对某论坛帖中发布的 DLL进行反编译得到的伪代码(Binary Ninja / IDA Hex-Rays 输出),用途仅为:
⚠️ 重要声明
pseudocode_dll/不参与本项目的构建与发布,只是学习与研究记录。- 本项目当前代码为我从零实现与持续维护的版本,并非“原 DLL 的源码开源”。
- 本仓库不分发原帖中的成品 DLL;如需获取原始 DLL,请前往原帖。
- 若原帖作者认为该伪代码公开不合适、希望移除相关内容,请在仓库提 Issue,我会第一时间配合调整(移动到单独分支/移除/重写说明均可)。
来源(原帖含 DLL):
https://linux.do/t/topic/1189424
本仓库伪代码文件:
pseudocode_dll/BinaryNinja.txt(Binary Ninja 反编译输出)pseudocode_dll/Hex-Rays.txt(IDA Hex-Rays 反编译输出)Made with ❤️ by 煎饼果子(86)
C++
79.4%
HTML
10.3%
C
5.3%
PowerShell
4.4%
🚀 Transparent proxy injector for Antigravity. Force SOCKS5/HTTP proxy without TUN mode on Windows. | 专为 Antigravity 打造的免 TUN 强制代理工具,支持 DLL 注入与进程流量劫持。
C++
4,118
124 commits
updated Sep 1, 2026
🚀 专为 Antigravity 编辑器打造:在中国也能无需 TUN 模式稳定走代理
🇬🇧 English Version | 🇷🇺 Русская версия
先说结论:如果 Antigravity 的对话框里出现
Agent execution terminated due to error,请先排查代理出口 IP,不要先怀疑 DLL 没生效。
我们已经在真实现场里确认过,最容易误判的场景是:
version.dll 已加载language_server_windows_x64.exe 已注入node.exe 也已注入oauth2.googleapis.com / daily-cloudcode-pa.googleapis.com 仍然可以通过 SOCKS5 正常连通ls-main.log 仍然返回:
FAILED_PRECONDITION (code 400): User location is not supported for the API use.这类问题的主因通常不是 DLL 失效,而是:
<Antigravity安装目录>\\logs\\proxy-YYYYMMDD.log如果你在这份日志里看到类似下面这些关键行,说明 DLL 本身已经在工作:
[成功] 已注入目标进程: language_server_windows_x64.exe[成功] 已注入目标进程: node.exeSOCKS5: 隧道建立成功, 目标=oauth2.googleapis.com:443SOCKS5: 隧道建立成功, 目标=daily-cloudcode-pa.googleapis.com:443在配置页开启 diagnostics.agent_ip_probe 后,DLL 会额外输出 IP 诊断日志:
[诊断/IP] 当前代理出口探测完成: ...[诊断/IP] 当前代理出口呈现机房/托管特征...[诊断/IP] 最新 Antigravity 日志已命中 location 限制错误,同时当前代理出口呈现机房/托管特征...%APPDATA%\\Antigravity\\logs\\<最新时间目录>\\ls-main.log如果你在这里看到:
agent executor error: FAILED_PRECONDITION (code 400): User location is not supported for the API use.那就说明:
proxy-YYYYMMDD.log
%APPDATA%\\Antigravity\\logs\\<最新目录>\\ls-main.log
User location is not supported for the API use.,优先排 IP。Antigravity 对话报错时,先排出口 IP,再排 DLL。看到
location is not supported基本优先看 IP。
Antigravity-Proxy 是专门为 Antigravity 编辑器量身定制的 Windows 代理注入组件(DLL)。
它的目标很简单:让中国用户使用 Antigravity 时,不用开 Clash TUN 模式,也能把网络流量稳定交给你的 SOCKS5/HTTP 代理。
项目名 Antigravity-Proxy = Antigravity + Proxy:只把 Antigravity 相关进程的流量“拽”进代理里(别担心,不会全局接管)。
你是否遇到过这些情况?
Antigravity-Proxy 就是来专治这个的。 它可以:
| 传统方案 | Antigravity-Proxy |
|---|---|
| 需要 TUN 模式 | 无需 TUN |
| 全局代理 | 精准代理指定进程 |
| 需要管理员权限 | 普通用户即可 |
| 配置复杂 | 放入 DLL 即用 |
在使用本工具前,请确保系统已安装必要的运行库,否则可能无法正常启动目标程序。
如果启动程序时遇到 错误代码 0xc0000142(如下图所示),通常是由于系统缺少 Windows 运行库导致的。
请安装 微软常用运行库合集,该工具已包含在本仓库中:
📦 下载路径: microsoft\微软常用运行库合集-2025.exe
安装步骤:
microsoft 目录微软常用运行库合集-2025.exe只想让 Antigravity 立刻能用?看这一节就够了。
启动你的代理软件(例如 Clash/Mihomo),确保本机有可用的 SOCKS5 或 HTTP 代理端口(如 127.0.0.1:7890)。
| 代理软件 | SOCKS5 端口 | HTTP 端口 | 混合端口 | 备注 |
|---|---|---|---|---|
| Clash / Clash Verge | 7891 | 7890 | 7890 | 混合端口同时支持 SOCKS5 和 HTTP |
| Clash for Windows | 7891 | 7890 | 7890 | 设置 → Ports 可查看/修改 |
| Mihomo (Clash Meta) | 7891 | 7890 | 7890 | 同 Clash 配置格式 |
| V2RayN | 10808 | 10809 | - | 设置 → 参数设置 → Core 基础设置 |
| V2RayA | 20170 | 20171 | - | 后台管理页面可修改 |
| Shadowsocks | 1080 | - | - | 仅 SOCKS5,无 HTTP |
| ShadowsocksR | 1080 | - | - | 仅 SOCKS5,无 HTTP |
| Surge (Mac/iOS) | 6153 | 6152 | - | 增强模式下端口可能不同 |
| Qv2ray | 1089 | 8889 | - | 首选项 → 入站设置 |
| sing-box | 自定义 | 自定义 | 自定义 | 需在配置文件中手动指定 |
| NekoBox | 2080 | 2081 | - | 设置 → 入站 |
| Clash Meta for Android | 7891 | 7890 | 7890 | 同 Clash 规则 |
💡 推荐使用 SOCKS5 协议:本工具对 SOCKS5 的支持更完善,建议优先使用。
方法 1:查看代理软件界面
方法 2:命令行测试
# 测试 SOCKS5 端口 (默认 7891)
Test-NetConnection -ComputerName 127.0.0.1 -Port 7891
# 测试 HTTP 端口 (默认 7890)
Test-NetConnection -ComputerName 127.0.0.1 -Port 7890
方法 3:curl 测试(需安装 curl)
# 通过 SOCKS5 代理访问
curl -x socks5://127.0.0.1:7891 https://www.google.com -I
# 通过 HTTP 代理访问
curl -x http://127.0.0.1:7890 https://www.google.com -I
| 问题 | 原因 | 解决方案 |
|---|---|---|
| 端口被占用 | 其他程序使用了该端口 | `netstat -ano |
| 连接被拒绝 | 代理软件未启动或端口错误 | 确认代理软件已启动,检查端口配置 |
| 代理无响应 | 防火墙阻止 | 检查 Windows 防火墙设置 |
Release 按架构和运行目标提供四个独立压缩包,下载时只选实际使用的一套:
antigravity-proxy-vX-ide-win-x64.zip / ...-x86.zip:包含 ide/(version.dll、config.json)。antigravity-proxy-vX-cli-win-x64.zip / ...-x86.zip:包含 cli/(dbghelp.dll、antigravity_proxy.dll、config.json)。每个压缩包还包含通用的 config-web.html 与 使用说明.md;自行编译时仍会在本地 output/ide、output/cli 生成两套目录。
桌面端只复制 ide/ 内的文件到 Antigravity 主程序目录(与 Antigravity.exe 同级)。
如果使用 Antigravity CLI,只复制 cli/ 内的文件到 agy.exe 同级目录。dbghelp.dll 会在导出函数首次调用时加载唯一名称的 antigravity_proxy.dll,避开系统 version.dll 同名冲突。
ide/与cli/不要混合复制;桌面端不需要dbghelp.dll。
version.dll与config.json必须来自同一次构建且架构一致。当前版本默认对宿主进程启用全量网络 Hook;启动日志应出现使用全量模式,随后再以 OAuth 回调和业务请求日志做功能验收。
Antigravity 2.0 新增/改名了关键进程,默认配置已覆盖:
"target_processes": [
"agy.exe",
"language_server.exe",
"language_server_windows",
"Antigravity.exe",
"Antigravity IDE.exe",
"node.exe"
]
如果你是从旧版本手动迁移 config.json,请确认 child_injection 仍为 true,并把上面的目标进程列表同步进去。2.0 环境如果存在多个启动目录,也要把 version.dll 和 config.json 放到实际启动的 Antigravity/IDE 目录中。
Antigravity 更新后可能清理安装目录里的劫持文件;如果更新后不走代理,请重新复制这些文件。若代理软件区分 mixed-port 和 SOCKS5 端口,也要确认 proxy.type 和 proxy.port 匹配本机实际监听端口。
更多现场记录见 docs/antigravity-2.0-issue-85.md。
一般情况下 Antigravity 会装在:
例如:C:\Users\<用户名>\AppData\Local\Programs\Antigravity
如果你找不到这个目录:在桌面/开始菜单找到 Antigravity 图标,右键 → 打开文件所在的位置,跳出来的那个目录就是它的主程序目录。
想从命令行一键跳过去(少点鼠标,多点快乐):
cd "$env:LOCALAPPDATA\Programs\Antigravity"
cd /d "%LOCALAPPDATA%\Programs\Antigravity"
(可选)你也可以自己设个环境变量,之后就能 cd 秒过去:
setx ANTIGRAVITY_HOME "%LOCALAPPDATA%\Programs\Antigravity"
设置完后:PowerShell 用 cd $env:ANTIGRAVITY_HOME,CMD 用 cd /d %ANTIGRAVITY_HOME%。
代理不工作?按照本手册逐步排查,找到问题根源。
代理不工作?
│
├── 检查日志是否存在 ───────────────────────────────────┐
│ │ │
│ ├── ❌ 无日志 → DLL未加载/位置错误 │
│ │ └── 见「DLL 加载问题」 │
│ │ │
│ └── ✅ 有日志 → 继续检查日志内容 │
│ │ │
├── 日志中有 "SOCKS5: 隧道建立成功" 吗? ────────────────┤
│ │ │
│ ├── ❌ 没有 → 代理连接失败 │
│ │ └── 见「代理软件排查」 │
│ │ │
│ └── ✅ 有 → 隧道建立成功,问题在后续 │
│ │ │
└── 检查 Clash 日志和节点可用性 ──────────────────────────┘
日志是排查问题的第一手资料。
日志位置(按优先级):
<Antigravity安装目录>\logs\proxy-YYYYMMDD.log%TEMP%\antigravity-proxy-logs\proxy-YYYYMMDD.log快速打开:
# 打开 DLL 目录的 logs 文件夹
cd "$env:LOCALAPPDATA\Programs\Antigravity\logs"
# 或打开 TEMP 目录
cd "$env:TEMP\antigravity-proxy-logs"
日志关键行解读:
| 日志内容 | 含义 | 状态 |
|---|---|---|
Antigravity-Proxy DLL 已加载 | DLL 成功注入 | ✅ 正常 |
配置加载成功 | config.json 读取成功 | ✅ 正常 |
所有 API Hook 安装成功 | Hook 生效 | ✅ 正常 |
ConnectEx Hook 已安装 | 异步连接 Hook 成功 | ✅ 正常 |
SOCKS5: 隧道建立成功 | 代理连接成功 | ✅ 正常 |
非 SOCK_STREAM socket 直连, soType=2 | UDP 有效策略为 direct,或该端口未命中代理规则 | ⚠️ 视配置而定 |
SOCKS5 握手失败 | 代理握手失败 | ❌ 需排查 |
连接代理服务器失败 | 无法连接到代理 | ❌ 需排查 |
WSA错误码=10061 | 连接被拒绝(代理未启动) | ❌ 需排查 |
WSA错误码=10060 | 连接超时 | ❌ 需排查 |
# 测试 SOCKS5/混合端口
Test-NetConnection -ComputerName 127.0.0.1 -Port 7890
# 如果 TcpTestSucceeded: False,说明端口未监听
在 Clash 配置文件中检查:
# 必须开启混合端口或 SOCKS5 端口
mixed-port: 7890 # 混合端口(推荐)
# 或
port: 7890 # HTTP 端口
socks-port: 7891 # SOCKS5 端口
# 如果需要局域网访问
allow-lan: true
在 Clash 界面查看「日志」或「Logs」,确认:
daily-cloudcode-pa.googleapis.com、www.googleapis.com 的请求DIRECT(直连)还是走了代理节点REJECT 规则命中最简单的方法:直接开启 TUN 模式,如果 TUN 模式下 Antigravity 正常,说明节点没问题。
winver
不同 Windows 11 小版本的 Winsock 行为可能有差异。请记录版本号备用。
某些安全软件会注入 LSP(分层服务提供程序),可能干扰 Hook。
# 以管理员身份运行
netsh winsock show catalog
正常情况下只应该有 Microsoft 的 Provider。如果看到第三方 Provider(如 360、火绒等),可能会有兼容性问题。
以下软件可能干扰 DLL 注入或 Hook:
| 软件 | 可能的影响 | 解决方案 |
|---|---|---|
| 360 安全卫士 | 拦截 DLL 注入、Hook | 添加白名单或临时关闭 |
| 火绒安全 | 可能阻止远程线程注入 | 添加白名单 |
| 腾讯电脑管家 | LSP 注入可能干扰网络 | 添加白名单 |
| Windows Defender | 通常不干扰 | 无需处理 |
临时排查:尝试完全退出安全软件后测试(不只是退到托盘,要完全退出)。
如果系统启用了 IPv6,某些连接可能尝试 IPv6 优先:
# 查看网络适配器 IPv6 状态
Get-NetAdapterBinding -ComponentID ms_tcpip6
如果日志中出现大量 IPv6 相关内容,可以尝试在 config.json 中设置:
"proxy_rules": {
"ipv6_mode": "block"
}
如果你的环境正常,但朋友的不行,请对比以下信息:
| 对比项 | 你的值 | 对方的值 |
|---|---|---|
| Windows 版本 (winver) | ||
| Clash 版本 | ||
| 代理端口 | 7890 | |
| 代理类型 | socks5 | |
| 是否有安全软件 | ||
netsh winsock show catalog 输出行数 |
如果以上排查都无法解决,请收集以下信息提交 GitHub Issue:
proxy-YYYYMMDD.log 内容winver 输出| 问题 | 原因 | 解决方案 |
|---|---|---|
大量 非 SOCK_STREAM socket 直连, soType=2 | UDP/QUIC 有效策略为 direct,或 UDP 代理未生效 | 优先使用 udp_mode=auto + proxy.type=socks5,并确认代理端支持 SOCKS5 UDP Associate |
| 日志显示成功但网页打不开 | Clash 规则、节点问题 | 检查 Clash 日志 |
| 某些请求绕过代理 | 应用使用了未 Hook 的 API | 提交 Issue 反馈 |
| 360 等安全软件环境下失效 | LSP 注入干扰 | 添加白名单或卸载 |
遇到问题时,建议先确认目标程序位数(x86/x64),并查看目标程序目录下的日志文件(如
proxy-YYYYMMDD.log)。
| 错误码 | 问题描述 | 可能原因 | 解决方案 |
|---|---|---|---|
0xC0000142 | 应用程序无法正常启动(已知:部分环境使用 x64 版本会出现此错误,切换到 x86 版本可以正常运行) | 架构不兼容(目标程序为 x86,但放入了 x64 的 version.dll)依赖库缺失或版本不匹配(常见:VC++ 运行库未安装/版本不一致) 安全软件拦截/隔离导致初始化失败 | 使用与目标程序一致的版本(x86 程序用 x86,x64 程序用 x64) 安装对应架构的 VC++ 2015-2022 运行库(尤其是 x64) 尝试使用静态运行库构建: .\build.ps1 -StaticRuntime |
| 错误码 | 问题描述 | 可能原因 | 解决方案 |
|---|---|---|---|
0xC000007B | 应用程序无法正常启动(常见于位数不匹配) | version.dll 与目标程序位数不一致(x86/x64 混用)依赖 DLL 位数不一致或文件损坏 | 确保 version.dll 与目标程序位数一致,并替换为对应版本产物清理目标目录中可能残留的旧 DLL 后重试 |
0xC0000135 | 找不到组件/缺少 DLL,程序无法启动 | 依赖库缺失(常见:VC++ 运行库 DLL 缺失) 依赖库被安全软件删除/隔离 | 安装对应架构的 VC++ 2015-2022 运行库 或使用静态运行库构建: .\build.ps1 -StaticRuntime |
VCRUNTIME140_1.dll 缺失 | 启动时报“找不到 VCRUNTIME140_1.dll” | VC++ 2015-2022 运行库未安装或被安全软件删除 | 安装对应架构的 VC++ 2015-2022 运行库(x64/x86) 或使用静态运行库构建: .\build.ps1 -StaticRuntime |
0xC0000906 | 应用程序无法正常启动 | 文件被安全软件拦截/隔离 文件不完整或已损坏 | 重新获取/重新编译 DLL 并替换 将目标程序目录加入安全软件白名单/排除项后重试 |
0xC0000005 | 程序启动后闪退/崩溃(事件查看器常见) | Hook 与目标程序/系统环境不兼容 目标进程范围过大,误注入导致冲突 | 缩小 target_processes 仅代理必要进程必要时关闭 child_injection 或 fake_ip 排查 |
10061 (WSAECONNREFUSED) | 代理连接被拒绝(通常会出现在日志里) | 代理软件未启动或端口未监听config.json 中代理地址/端口错误 | 启动代理软件并确认端口可用(如 127.0.0.1:7890)检查并修正 config.json 的 proxy.host/proxy.port |
10060 (WSAETIMEDOUT) | 连接超时(通常会出现在日志里) | 代理不可达/网络被阻断 超时配置过短 | 检查代理与网络状态后重试 适当增大 config.json 的 timeout.connect/send/recv |
| 功能 | 说明 | Feature | Description |
|---|---|---|---|
| 🔀 代理重定向 | 拦截 connect() 调用,重定向至代理服务器 | Proxy Redirect | Intercepts connect() and redirects to proxy |
| 🌐 FakeIP 系统 | 拦截 DNS 解析,分配虚拟 IP 并建立映射 | FakeIP System | Intercepts DNS, allocates virtual IPs |
| 👶 子进程注入 | 自动将 DLL 注入到子进程 | Child Injection | Auto-injects DLL into child processes |
| ⏱️ 超时控制 | 防止目标程序因网络问题卡死 | Timeout Control | Prevents hanging on network issues |
| 🔄 Fail-Safe | 配置加载失败时自动直连 | Fail-Safe | Falls back to direct connection on error |
| 🎯 进程过滤 | 仅代理指定的进程列表 | Process Filter | Proxy only specified processes |
| 📊 流量监控 | 可选的流量日志记录 | Traffic Monitor | Optional traffic logging |
┌─────────────────────────────────────────────────────────────────────────┐
│ 目标程序 (Target Process) │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────────────────┐ │
│ │ 应用代码 │───►│ Winsock API │───►│ antigravity-proxy.dll │ │
│ │ (App Code) │ │ (ws2_32.dll) │ │ (Hook Layer) │ │
│ └──────────────┘ └──────────────┘ └────────────┬─────────────┘ │
│ │ │
└───────────────────────────────────────────────────────│──────────────────┘
▼
┌──────────────────┐
│ 代理服务器 │
│ (SOCKS5/HTTP) │
│ Proxy Server │
└──────────────────┘
┌─────────────────────────────────────────────────────────────────────────┐
│ 1. DLL 劫持 (DLL Hijacking) │
│ 程序加载 version.dll → 加载我们的 DLL → 转发真实 version.dll 调用 │
└─────────────────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 2. API Hook 安装 (Install Hooks) │
│ 使用 MinHook 拦截: connect, getaddrinfo, CreateProcessW 等 │
└─────────────────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 3. DNS 拦截 (DNS Interception) │
│ getaddrinfo("example.com") → 分配 FakeIP (198.18.x.x) → 记录映射 │
└─────────────────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 4. 连接重定向 (Connection Redirect) │
│ connect(198.18.x.x) → 查询映射还原域名 → 连接代理 → SOCKS5 握手 │
└─────────────────────────────────────────────────────────────────────────┘
▼
┌─────────────────────────────────────────────────────────────────────────┐
│ 5. 子进程传播 (Child Process Propagation) │
│ CreateProcessW → 挂起进程 → 注入 DLL → 恢复运行 │
└─────────────────────────────────────────────────────────────────────────┘
| API | 模块 | 用途 |
|---|---|---|
connect | ws2_32.dll | 拦截 TCP 连接 |
WSAConnect | ws2_32.dll | 拦截 WSA 方式连接 |
getaddrinfo | ws2_32.dll | 拦截 DNS 解析 (ANSI) |
GetAddrInfoW | ws2_32.dll | 拦截 DNS 解析 (Unicode) |
WSAConnectByNameA/W | ws2_32.dll | 拦截按名称连接 |
ConnectEx | ws2_32.dll | 拦截异步连接 |
CreateProcessW | kernel32.dll | 拦截进程创建,注入子进程 |
send/recv | ws2_32.dll | 流量监控(可选) |
在开始编译之前,请确保已安装以下工具:
💡 提示: 安装 Visual Studio 时,请确保勾选 "使用 C++ 的桌面开发" 工作负载。
| 依赖 | 说明 | 获取方式 |
|---|---|---|
| MinHook | API Hook 框架 | 已内置于项目 |
| nlohmann/json | JSON 解析库 | 编译脚本自动下载 |
项目提供了 PowerShell 编译脚本,支持一键编译:
# 默认编译 Release x64
.\build.ps1
# 编译 Debug 版本
.\build.ps1 -Config Debug
# 编译 32 位版本
.\build.ps1 -Arch x86
# 清理后重新编译
.\build.ps1 -Clean
# 输出详细编译日志
.\build.ps1 -Verbose
# 构建并运行 CTest(CI/Release 使用)
.\build.ps1 -RunTests
# 显式声明跳过测试(也是默认行为)
.\build.ps1 -SkipTests
# 查看帮助
.\build.ps1 -Help
如果你更喜欢手动编译,也可以使用以下命令:
# ========== x64 (64位) ==========
mkdir build-x64 && cd build-x64
# 配置 (使用 Visual Studio 2022)
cmake .. -G "Visual Studio 17 2022" -A x64
# 编译 Release 版本
cmake --build . --config Release
# 输出: version.dll
# ========== x86 (32位) ==========
mkdir build-x86 && cd build-x86
# 配置
cmake .. -G "Visual Studio 17 2022" -A Win32
# 编译
cmake --build . --config Release
# 输出: version.dll
原因: CMake 未安装或未添加到 PATH
解决方案:
原因: Visual Studio 未安装或 C++ 工具链缺失
解决方案:
原因: JSON 库未下载
解决方案:
使用编译脚本 build.ps1 会自动下载,或手动下载:
# 手动下载
curl -o include/nlohmann/json.hpp https://raw.githubusercontent.com/nlohmann/json/develop/single_include/nlohmann/json.hpp
原因: 链接错误,通常是 Winsock 库未链接
解决方案: 确保 CMakeLists.txt 中包含:
target_link_libraries(version PRIVATE ws2_32)
只需 3 步,即可让目标程序走代理!
编译完成后,你会在 output 目录得到:
ide/version.dll 与 ide/config.json - 桌面端部署目录cli/dbghelp.dll、cli/antigravity_proxy.dll 与 cli/config.json - CLI 部署目录config-web.html 与 使用说明.md - 配置工具和说明编辑 config.json:
{
"proxy": {
"host": "127.0.0.1",
"port": 7890,
"type": "socks5"
},
"fake_ip": {
"enabled": true,
"cidr": "198.18.0.0/15"
},
"timeout": {
"connect": 5000,
"send": 5000,
"recv": 5000
},
"child_injection": true,
"child_injection_mode": "filtered",
"target_processes": [
"agy.exe",
"language_server.exe",
"language_server_windows",
"Antigravity.exe",
"Antigravity IDE.exe",
"node.exe"
],
"proxy_rules": {
"allowed_ports": [80, 443],
"dns_mode": "direct",
"ipv6_mode": "proxy"
}
}
将 version.dll 和 config.json 复制到目标程序的同一目录:
目标程序目录/
├── 目标程序.exe
├── version.dll ← 放这里
└── config.json ← 放这里
启动目标程序,完成!🎉
| 配置项 | 类型 | 默认值 | 说明 |
|---|---|---|---|
proxy.host | string | "127.0.0.1" | 代理服务器地址 |
proxy.port | int | 7890 | 代理服务器端口 |
proxy.type | string | "socks5" | 代理类型: socks5 或 http(兼容 https,按 http 处理) |
fake_ip.enabled | bool | true | 是否启用 FakeIP 系统 |
fake_ip.cidr | string | "198.18.0.0/15" | FakeIP 地址范围 (基准测试保留网段) |
timeout.connect | int | 5000 | 连接超时 (毫秒) |
timeout.send | int | 5000 | 发送超时 (毫秒) |
timeout.recv | int | 5000 | 接收超时 (毫秒) |
child_injection | bool | true | 是否注入子进程 |
traffic_logging | bool | false | 是否记录流量日志 |
diagnostics.agent_ip_probe | bool | false | 是否探测代理出口 IP 并关联 location 日志 |
target_processes | array | [] | 目标进程列表 (空=全部) |
proxy_rules.allowed_ports | array | [80, 443] | 端口白名单 (空=全部) |
proxy_rules.dns_mode | string | "direct" | DNS策略: direct(直连) / proxy(走代理) |
proxy_rules.ipv6_mode | string | "proxy" | IPv6策略: proxy(走代理) / direct(直连) / block(阻止) |
proxy_rules.udp_mode | string | "auto" | UDP策略: auto(SOCKS5 自动代理) / block / direct / proxy |
proxy_rules.udp_fallback | string | "block" | UDP 代理失败或 auto 遇到非 SOCKS5 代理时: block / direct |
proxy_rules.routing.enabled | bool | true | 是否启用规则路由 |
proxy_rules.routing.priority_mode | string | "order" | 规则优先级: order(按顺序) / number(priority) |
proxy_rules.routing.default_action | string | "proxy" | 未命中时默认动作 |
proxy_rules.routing.use_default_private | bool | true | 自动加载 RFC1918/loopback 内网直连规则 |
proxy_rules.routing.rules | array | [] | 规则列表(支持 CIDR/域名通配符/端口/协议) |
路由规则由 proxy_rules.routing 管理,支持 CIDR/域名通配符/端口/协议分流,优先级可选 order(按顺序) 或 number(priority)。
{
"proxy_rules": {
"routing": {
"enabled": true,
"priority_mode": "order",
"default_action": "proxy",
"use_default_private": true,
"rules": [
{
"name": "lan-direct",
"action": "direct",
"ip_cidrs_v4": ["10.0.0.0/8","172.16.0.0/12","192.168.0.0/16"],
"ip_cidrs_v6": ["fc00::/7","fe80::/10","::1/128"],
"domains": [".local","*.corp.example.com"],
"protocols": ["tcp"]
}
]
}
}
}
可视化配置工具:resources/config-web/index.html(本地打开即可使用;或构建后使用 output/config-web.html,支持导入/编辑/导出 config.json)。
说明:AUTHORS.txt 为内嵌的 MinHook 依赖作者名单,并非本项目维护者列表。
提示:
* 将匹配所有域名。0.0.0.0/0 与 ::/0。proxy.host / proxy.port / proxy.type 的编辑。direct + domains + ports:在部分旧版本中,若启用 FakeIP,且 action=direct 的规则同时配置了 domains 与 ports,可能出现 DNS 阶段分配 FakeIP,随后 connect 阶段“直连虚拟地址”导致连接失败。若你仍在使用旧版本,建议升级;或临时规避:移除该规则的 ports 条件,或关闭 FakeIP。当日志出现 SOCKS5: 读取认证响应失败, WSA错误码=10060,且目标是 IPv6 地址(如 2001:4860:4860::8888:443),表示代理没有及时响应该 IPv6 连接。
当前版本会在 IPv6 socket 创建且尚未 bind 时自动关闭 IPV6_V6ONLY,使 127.0.0.1 这类 IPv4 代理可通过 v4-mapped IPv6 地址连接。若应用之后重新启用 v6-only,日志会输出具体 WSA 错误码。
可选处理方式:
proxy_rules.ipv6_mode 改为 block(阻止)或 direct(直连)。::1,再把 proxy.host 改为 ::1。优先级说明:当目标为纯 IPv6(非 v4-mapped)且 proxy_rules.ipv6_mode 为 direct/block 时,会在进入 routing 规则前直接直连/阻止;当 ipv6_mode=proxy 时才会继续进入 routing 匹配。
当目标程序使用 QUIC/HTTP3(UDP/443)时,默认 udp_mode=auto 会在 SOCKS5 下自动使用 UDP Associate。
推荐配置:
proxy_rules.udp_mode=autoproxy.type 设为 socks5(HTTP 代理没有标准 UDP 转发能力)proxy_rules.udp_fallback 设为 direct(⚠️ 可能导致 UDP 直连泄漏;默认 block 更安全)示例:
{
"proxy": { "host": "127.0.0.1", "port": 10808, "type": "socks5" },
"proxy_rules": {
"udp_mode": "auto",
"dns_mode": "direct",
"allowed_ports": [80, 443]
}
}
说明:
dns_mode="direct" 仍会放行 UDP/53(避免 DNS 超时);若你希望 DNS 也走代理,请改为 dns_mode="proxy"。auto + socks5 的有效策略为 proxy;auto + http 按 udp_fallback 决定 block/direct。udp_mode=block 会阻断大部分 UDP,但仍放行 loopback 与 UDP/53。proxy-YYYYMMDD.log)日志文件按以下优先级存放:
| 优先级 | 位置 | 说明 |
|---|---|---|
| 1️⃣ | <DLL所在目录>\logs\ | 与代理主体 DLL 同级的 logs 子目录 |
| 2️⃣ | %TEMP%\antigravity-proxy-logs\ | 系统临时目录(通常为 C:\Users\<用户名>\AppData\Local\Temp\antigravity-proxy-logs\) |
💡 提示:如果在 DLL 目录无法创建
logs文件夹(例如权限不足),日志会自动回退到系统 TEMP 目录。快速打开 TEMP 目录:按
Win+R,输入%TEMP%,回车即可。
⚠️ 重要提示:Antigravity-Proxy(version.dll 劫持方案)无法直接代理 WSL 内部的流量。
这是由技术架构决定的根本性限制,无法通过修改代码来解决:
| 技术层面 | 详细说明 |
|---|---|
| DLL 注入机制 | 本项目使用 Windows version.dll 劫持,只能 Hook Windows PE 进程 |
| Winsock API | 拦截的是 ws2_32.dll 中的 connect()、getaddrinfo() 等 Windows 专用 API |
| WSL 架构 | WSL2 运行真正的 Linux 内核,网络使用 Linux socket() 系统调用,与 Windows Winsock 完全独立 |
| 进程边界 | 即使注入 wsl.exe,也无法 Hook 其内部 Linux 子系统中 language_server_linux_x64 发出的流量 |
┌─────────────────────────────────────────────────────────────────┐
│ Windows 主机 │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ Antigravity-Proxy (version.dll) │ │
│ │ ├── Hook: connect(), getaddrinfo(), WSAConnect()... │ │
│ │ └── ✅ 可以拦截所有 Windows 进程的网络请求 │ │
│ └────────────────────────────────────────────────────────────┘ │
│ │ │
│ ❌ 无法穿透 │
│ ↓ │
│ ┌────────────────────────────────────────────────────────────┐ │
│ │ WSL2 (轻量级 Linux 虚拟机) │ │
│ │ ┌──────────────────────────────────────────────────────┐ │ │
│ │ │ language_server_linux_x64 │ │ │
│ │ │ └── 使用 Linux socket() 系统调用 → 绕过 Winsock │ │ │
│ │ └──────────────────────────────────────────────────────┘ │ │
│ └────────────────────────────────────────────────────────────┘ │
└─────────────────────────────────────────────────────────────────┘
antissh 是专门为在 WSL 中代理 Antigravity Agent 设计的工具。
原理:在 WSL 内部使用 graftcp 对 language_server_linux_x64 进行代理包装。
快速开始:
# 在 WSL 中执行
curl -O https://raw.githubusercontent.com/ccpopy/antissh/main/antissh.sh
chmod +x antissh.sh
bash ./antissh.sh
脚本会引导你:
socks5://127.0.0.1:10808)language_server_linux_x64优点:
注意:IDE 升级后可能需要重新运行脚本。
原理:让 WSL 共享 Windows 的网络栈,从而可以使用 127.0.0.1 访问 Windows 上的代理。
配置步骤:
.wslconfig 文件:# PowerShell 执行
notepad "$env:USERPROFILE\.wslconfig"
[wsl2]
networkingMode=mirrored
wsl --shutdown
~/.bashrc 或 ~/.zshrc):export ALL_PROXY=socks5://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export HTTP_PROXY=http://127.0.0.1:7890
要求:
wsl --version 检查)优点:
缺点:
原理:使用 Clash/Mihomo 的 TUN 模式创建虚拟网卡,在 IP 层拦截所有流量。
操作:在 Clash/Mihomo 中开启 TUN 模式即可。
优点:
缺点:
| 方案 | 适用场景 | 复杂度 | 推荐度 |
|---|---|---|---|
| antissh | 仅需在 WSL 中代理 Antigravity | 中等 | ⭐⭐⭐⭐⭐ |
| Mirrored 模式 | 系统满足版本要求,需简单代理 | 低 | ⭐⭐⭐⭐ |
| TUN 全局代理 | 需要所有流量代理 | 低 | ⭐⭐⭐ |
附加价值:本项目首先为 Antigravity 服务,但底层是通用的进程级强制代理方案,也可以用来强制代理其他不走系统代理的 Windows 程序,或基于此二次开发。
想让 Chrome、VS Code 或其他程序也走代理?只需修改配置文件!
{
"proxy": {
"host": "127.0.0.1",
"port": 7890,
"type": "socks5"
},
"child_injection": true,
"target_processes": []
}
然后将 version.dll 和 config.json 复制到 Chrome 安装目录:
C:\Program Files\Google\Chrome\Application\
├── chrome.exe
├── version.dll ← 放这里
└── config.json ← 放这里
C:\Users\你的用户名\AppData\Local\Programs\Microsoft VS Code\
├── Code.exe
├── version.dll ← 放这里
└── config.json ← 放这里
如果你只想代理程序的某些子进程,可以使用 target_processes 配置:
{
"target_processes": [
"node.exe",
"npm.cmd",
"language_server.exe"
]
}
如果你想基于此项目进行二次开发,以下是关键代码位置:
| 模块 | 文件 | 说明 |
|---|---|---|
| 配置加载 | src/core/Config.hpp | 修改配置项结构 |
| 网络 Hook | src/hooks/Hooks.cpp | 添加/修改 Hook 函数 |
| 代理协议 | src/network/Socks5.hpp | SOCKS5 握手实现 |
| 代理协议 | src/network/HttpConnect.hpp | HTTP CONNECT 实现 |
| FakeIP | src/network/FakeIP.hpp | 虚拟 IP 分配逻辑 |
| DLL 劫持 | src/proxy/VersionProxy.cpp | version.dll 代理转发 |
| 进程注入 | src/injection/ProcessInjector.hpp | 子进程注入逻辑 |
src/hooks/Hooks.cpp 中定义函数指针类型和 Detour 函数Hooks::Install() 中添加 MH_CreateHookApi() 调用Hooks::Uninstall() 中处理清理逻辑src/network/ 下创建新的协议实现 (参考 Socks5.hpp)src/hooks/Hooks.cpp 的 DoProxyHandshake() 中添加协议分支本项目基于 BSD-2-Clause License 开源。
MinHook 部分版权归 Tsuda Kageyu 所有。
|
煎饼果子(86) 独立开发者 / Independent Developer |
如果这个项目对你有帮助,欢迎:
![]() 添加微信交流 |
![]() 关注公众号 |
![]() 🔥 加入微信交流群 |
如果这个项目帮到了你,可以请作者喝杯咖啡 ☕
![]() 微信赞赏 |
![]() 支付宝打赏 |
本仓库的 pseudocode_dll/ 目录收录了对某论坛帖中发布的 DLL进行反编译得到的伪代码(Binary Ninja / IDA Hex-Rays 输出),用途仅为:
⚠️ 重要声明
pseudocode_dll/不参与本项目的构建与发布,只是学习与研究记录。- 本项目当前代码为我从零实现与持续维护的版本,并非“原 DLL 的源码开源”。
- 本仓库不分发原帖中的成品 DLL;如需获取原始 DLL,请前往原帖。
- 若原帖作者认为该伪代码公开不合适、希望移除相关内容,请在仓库提 Issue,我会第一时间配合调整(移动到单独分支/移除/重写说明均可)。
来源(原帖含 DLL):
https://linux.do/t/topic/1189424
本仓库伪代码文件:
pseudocode_dll/BinaryNinja.txt(Binary Ninja 反编译输出)pseudocode_dll/Hex-Rays.txt(IDA Hex-Rays 反编译输出)Made with ❤️ by 煎饼果子(86)
C++
79.4%
HTML
10.3%
C
5.3%
PowerShell
4.4%