乐于分享
好东西不私藏

魔改Firefox火狐浏览器内核源码支持SOCKS5密码代理(文档给AI可一键修改完毕)

魔改Firefox火狐浏览器内核源码支持SOCKS5密码代理(文档给AI可一键修改完毕)
所有修改如意均使用自营中转gpt 5.5 xhigh完成:
AI网址,低价耐用,包纯度稳定:https://xjbtoken.site/

目标

本次修改让 Firefox 的“手动 SOCKS5 代理配置”可以复用现有 SOCKS5 username/password 认证能力。

Firefox 原本已经具备 SOCKS5 用户名/密码认证源码:

  • nsIProxyInfo 已有 username / password 字段。

  • nsIProtocolProxyService::newProxyInfoWithAuth() 已支持创建带认证信息的 SOCKS proxy。

  • netwerk/socket/nsSOCKSIOLayer.cpp 已实现 SOCKS5 RFC1929 username/password 握手。

原来缺少的是:手动代理 prefs 路径创建 nsIProxyInfo 时,始终传空 username/password。本次修改只是在手动 SOCKS5 代理解析时,从 --fpfile 读取账号密码并填入 nsIProxyInfo

修改文件

1. C:\firefox\firefox\netwerk\base\nsProtocolProxyService.cpp

主要改动:

  • 新增 --fpfile 读取支持。

  • 新增 SOCKS 认证配置解析函数。

  • 在手动 SOCKS5 代理创建 nsIProxyInfo 前注入 username/password。

  • 只对 type == kProxyType_SOCKS 生效,也就是 SOCKS5;不影响 SOCKS4、HTTP、HTTPS、PAC、system proxy。

2. C:\firefox\firefox\netwerk\base\nsProtocolProxyService.h

主要改动:

  • 新增 SOCKS 认证凭据结构。

  • 新增 fpfile 解析缓存字段。

  • 新增函数声明。

fpfile 支持格式

格式 1:指定 host/port 的一行格式

host:port:username:password

示例:

gate.xxx.info:1000:7091045-38eb762d-53050341-5m:f7bbdeeb-US

也支持多行,代码会按当前手动 SOCKS 代理的 host/port 匹配:

gate.xxx.info:1000:7091045-38eb762d-53050341-5m:f7bbdeeb-US
other.proxy.invalid:1000:wrong:wrong

限制:

  • 一行格式只支持 DNS host / IPv4 host。

  • username/password 不支持冒号 :

  • IPv6 或含冒号密码建议使用 key-value 格式扩展,不用一行格式。

格式 2:全局 SOCKS 认证

socksauth.username=globaluser
socksauth.password=globalpass

只要当前手动代理是 SOCKS5,且没有更具体的 host/port 匹配,就使用这组凭据。

格式 3:指定 host/port 的 key-value 格式

socksauth.host=gate.xxx.info
socksauth.port=1000
socksauth.username=xxx-38eb762d-53050341-5m
socksauth.password=xxx-US

host 匹配大小写不敏感。

使用方式

  1. 在 Firefox 中配置手动 SOCKS5 代理:

network.proxy.type = 1
network.proxy.socks = gate.xxx.info
network.proxy.socks_port = 1000
network.proxy.socks_version = 5
  1. 启动 Firefox 时传入 fpfile:

firefox.exe --fpfile=C:\path\to\fp.txt
  1. fpfile 内容示例:

gate.xxx.info:1000:7091045-38eb762d-53050341-5m:f7bbdeeb-US

关键代码

1. 新增 include

文件:netwerk/base/nsProtocolProxyService.cpp

C++

#include<cstdlib>
#include<fstream>
#include<string>

#include"base/command_line.h"
#include"base/string_util.h"

用途:

  • <fstream>:读取 --fpfile 指定的文件。

  • <string> / <cstdlib>:解析文本和端口。

  • base/command_line.h / base/string_util.h:读取 --fpfile 命令行参数,并做 UTF 转换。

2. 字符串和端口辅助函数

3. 新增结构和缓存字段

4. 读取和解析 fpfile

5. 从 --fpfile 获取当前代理凭据

6. 在手动 SOCKS5 代理创建处注入凭据

已验证场景

使用当前 objdir 的 xpcshell.exe 直接验证,不依赖 mach xpcshell-test,因为当前 mozconfig 使用了 --disable-tests

已验证:

  • host:port:user:pass 正向匹配,成功注入 username/password。

  • 无 --fpfile,不注入。

  • fpfile 存在但 host/port 不匹配,不注入。

  • socksauth.username/password 全局格式,成功注入。

  • socksauth.host/port/username/password scoped 格式,成功注入。

  • host 大小写不敏感。

  • fpfile 路径带空格,正常。

  • fpfile 不存在,不注入。

  • SOCKS4 不注入 username/password。

编译命令

因为只改了 C++,可以用:

Bash

./mach build binaries

已经编译通过。

注意事项

  • 本改动不新增 UI。

  • 本改动不新增 prefs。

  • 本改动不把密码保存到 profile。

  • 本改动依赖启动参数 --fpfile

  • SOCKS5 底层握手仍由原有 nsSOCKSIOLayer.cpp 负责。

  • password-only 不支持;username/password 必须都非空才注入。

  • 一行冒号格式不支持 IPv6 host 或包含冒号的 username/password。

  • 成品火狐自动化和指纹浏览器可使用:

    https://github.com/LoseNine/ruyipage

完整文档代码修改位于星球,持续更新高质量文章和工具
如意本人联系方式