XarrPay 聚合支付系统 - 部署修复报告

XarrPay 聚合支付系统 - 部署修复报告

生成日期:2026-03-14


一、服务器信息

项目
服务器 IP114.134.187.189
SSH 用户名root
SSH 密码bcdpMYGF1913
操作系统Linux x86-64
管理面板宝塔面板 (BT Panel)
网站目录/www/wwwroot/XarrPay/
访问地址http://mode.byesmart.store:24017/
监听端口24017(绑定 0.0.0.0

二、数据库信息

项目
数据库类型MySQL
数据库地址127.0.0.1:3306
数据库名xarrpay
数据库用户XarrPay
数据库密码5852GnhTpaHzFzm7
连接字符串mysql:XarrPay:5852GnhTpaHzFzm7@tcp(127.0.0.1:3306)/xarrpay
SQL 导入文件/www/wwwroot/XarrPay/xarrpay_personal.sql(467行,已导入)

三、项目文件清单

文件路径说明
xarr-pay主程序二进制(已打补丁,当前运行中)
xarr-pay.original原始打包二进制备份
xarr-pay.packed原始打包二进制副本
xarr-pay.unpackedUPX 解包后的原始二进制(25,782,343 字节)
xarr-pay.crack仅含 IsLicense + checkAuth 补丁的版本(无时间炸弹修复)
xarr-pay.md5MD5 校验文件(程序启动时会验证)
config/config.yaml数据库及日志配置
config/install.txt安装状态标记文件
auth.txt加密授权数据(二进制)
license.txt许可文件(内容:CarckFuckTheAuthImNbJWLGO
public/前端静态文件(index.html, favicon.ico, static/)

四、Nginx 配置

反向代理(域名转发)

文件:/www/server/panel/vhost/nginx/go_run_sh.conf

mode.byesmart.store 的请求转发到 127.0.0.1:24017

伪授权服务器

文件:/www/server/panel/vhost/nginx/fake_auth.conf

server {
    listen 2418;
    server_name _;
    location / {
        default_type application/json;
        return 200 '{"code":0,"message":"success","data":{"auth_no":"LICENSED","status":1,"update":false,"version":"1.7.7","version_code":177}}';
    }
}

注:此配置用于返回伪授权响应,但实际授权绕过主要依赖二进制补丁。宝塔面板可能会清理此配置,需注意。


五、二进制补丁详情

程序原始授权机制:与 auth2.xarr.cn/api/app-auth 通过 RSA 加密通信验证授权。由于作者跑路,授权服务器已下线,因此通过二进制补丁绕过。

补丁 1:IsLicense(授权检查)

项目
虚拟地址 (VA)0xb48d40
文件偏移 (FO)0x748d40
函数大小0x185
补丁内容31 c0 31 db c3(xor eax,eax; xor ebx,ebx; ret → 返回 nil)
作用使授权检查始终返回"已授权"

补丁 2:checkAuth(授权验证)

项目
虚拟地址 (VA)0xb5c1c0
文件偏移 (FO)0x75c1c0
函数大小0x3f6
补丁内容c3(ret → 直接返回)
作用跳过与授权服务器的通信验证

补丁 3:RegRouters 时间炸弹

项目
虚拟地址 (VA)0xb386ed
文件偏移 (FO)0x7386ed
原始指令7e 6e(jle → 条件跳转)
补丁内容eb 6e(jmp → 无条件跳转)
时间炸弹值0x697fcc36(对应 2026-02-21)
作用绕过过期时间检查,确保路由始终注册

关键说明:时间炸弹是导致所有 404 错误的根本原因。RegRouters 函数在启动时比较当前 Unix 时间戳与硬编码值 0x697fcc36,如果当前时间超过该值,函数直接返回而不注册任何路由。

地址计算方式

文件偏移 = 虚拟地址 - 基地址(0x400000)
例:0xb48d40 - 0x400000 = 0x748d40

六、遇到的问题与解决方案

问题原因解决方案
数据库表不存在 (Error 1146)数据库为空导入 xarrpay_personal.sql
授权验证失败授权服务器 auth2.xarr.cn 已下线补丁 IsLicense + checkAuth
所有路由返回 404时间炸弹:程序过期后不注册路由补丁 RegRouters 中的条件跳转
Go 二进制不信任系统 CA静态链接,内置 CA 证书放弃 MITM 方案,改用二进制补丁
宝塔 WAF 拦截 HTTP 请求端口 80 的防火墙规则使用独立端口 2418
printf '\xeb' 写入错误字节bash 通过 paramiko 的转义问题改用 perl -e 直接写入精确字节
SFTP 传输 25MB 文件超时文件过大,网络不稳定在服务器端用 perl 原地修改
程序启动时校验 MD5内置自校验机制每次修改后重新生成 xarr-pay.md5
首页提示"请使用授权的域名访问"数据库缺少 bind_domain 配置options 表插入 bind_domain = mode.byesmart.store

七、日常运维命令

启动服务

cd /www/wwwroot/XarrPay
nohup ./xarr-pay > /tmp/xarr-pay.log 2>&1 &

停止服务

killall -9 xarr-pay

重启服务

killall -9 xarr-pay
sleep 1
cd /www/wwwroot/XarrPay && nohup ./xarr-pay > /tmp/xarr-pay.log 2>&1 &

查看日志

tail -f /tmp/xarr-pay.log

检查进程

ps aux | grep xarr-pay

更新 MD5 校验(修改二进制后必须执行)

cd /www/wwwroot/XarrPay
md5sum xarr-pay | awk '{print $1}' > xarr-pay.md5

八、重新打补丁指南

如果需要从原始二进制重新打补丁(例如恢复了备份),按以下步骤操作:

# 1. 从备份恢复解包后的二进制
cp /www/wwwroot/XarrPay/xarr-pay.unpacked /www/wwwroot/XarrPay/xarr-pay

# 2. 打补丁 - IsLicense (返回 nil)
perl -e 'open(F, "+<", "/www/wwwroot/XarrPay/xarr-pay") or die;
binmode F; seek(F, 0x748d40, 0);
print F chr(0x31).chr(0xc0).chr(0x31).chr(0xdb).chr(0xc3); close F;'

# 3. 打补丁 - checkAuth (直接返回)
perl -e 'open(F, "+<", "/www/wwwroot/XarrPay/xarr-pay") or die;
binmode F; seek(F, 0x75c1c0, 0);
print F chr(0xc3); close F;'

# 4. 打补丁 - RegRouters 时间炸弹 (无条件跳转)
perl -e 'open(F, "+<", "/www/wwwroot/XarrPay/xarr-pay") or die;
binmode F; seek(F, 0x7386ed, 0);
print F chr(0xeb).chr(0x6e); close F;'

# 5. 更新 MD5
cd /www/wwwroot/XarrPay
md5sum xarr-pay | awk '{print $1}' > xarr-pay.md5

# 6. 重启服务
killall -9 xarr-pay
sleep 1
nohup ./xarr-pay > /tmp/xarr-pay.log 2>&1 &

九、相关函数参考

函数名虚拟地址文件偏移说明
IsLicense0xb48d400x748d40授权状态检查
checkAuth0xb5c1c00x75c1c0与授权服务器通信
CtxCheckAuth0xb5b3a00x75b3a0中间件,调用 IsLicense
RegRouters0xb386c00x7386c0路由注册(含时间炸弹)
AppAuth0xb483c00x7483c0应用授权处理
IsInstall0xb595000x759500检查安装状态
全局变量虚拟地址说明
AuthInfo0x14fdd50授权信息结构体
ProgramMd50x153c480程序 MD5 校验值

十、注意事项

  1. 宝塔面板可能清理自定义 Nginx 配置fake_auth.conf 可能被删除,需要注意检查
  2. 程序自校验 MD5:每次修改二进制后必须更新 xarr-pay.md5
  3. Go 二进制为静态链接:不依赖系统动态库,但也不信任系统 CA 证书
  4. 原始二进制已备份xarr-pay.original(打包版)和 xarr-pay.unpacked(解包版)
  5. 服务器重启后需手动启动:建议配置宝塔面板的开机自启或 systemd 服务