Two-crate workspace: blaze-proto (Fire2 framing via tokio_util codec, tdf=0.1 for TDF decode/stringify) and server (TLS listeners for redirector + Blaze, JSONL capture with TdfStringifier, pluggable FramingVariant enum). Both listeners bind on startup and write a capture JSONL for every packet. Component/command IDs are unknown — captures reveal them. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2.6 KiB
fifa-blaze
EA Blaze protocol server emulator for FIFA 23 offline FUT.
Status
Milestone 1 — capture stub.
Two TLS listeners start and log every Blaze packet. No FIFA 23 component/command IDs are known yet — the capture log is how we discover them.
Architecture
FIFA 23 (via openfut-hook DLL / /etc/hosts)
│
▼ gosredirector.ea.com → 127.0.0.1:42127
blaze-server redirector listener (TLS, Fire2 framing)
│ replies: "connect to 127.0.0.1:10041"
▼
blaze-server Blaze listener (TLS, Fire2 framing)
│ every packet → JSONL capture + pretty-print
└─ captures/<timestamp>.jsonl
Framing note
Two Blaze wire framings exist: Fire and Fire2. FIFA 23's exact variant is unknown — Fire2 is attempted first because it is used by all post-2012 EA titles (ME3, BF3, etc.). If captures show malformed frame sizes, switch the FramingVariant in main.rs to Raw to bypass framing and capture raw bytes for manual analysis.
Quick start
1. Generate a self-signed TLS cert (RSA-2048)
DirtySDK (FIFA's network library) rejects ECDSA — RSA-2048 is required.
mkdir certs
openssl req -x509 -newkey rsa:2048 \
-keyout certs/key.pem -out certs/cert.pem \
-days 3650 -nodes \
-subj "/CN=gosredirector.ea.com"
2. Configure
cp config.example.toml config.toml
# edit if needed
3. /etc/hosts redirect
127.0.0.1 gosredirector.ea.com
Or deploy openfut-hook DLL which redirects at the DNS level inside Proton.
4. Run
cd fifa-blaze
cargo run --release --bin blaze-server -- config.toml
5. Start FIFA 23 and go to FUT
The capture log at captures/<timestamp>.jsonl will contain every packet.
Inspect with jq:
jq '.' captures/capture-*.jsonl | less
# Find all unique component/command pairs:
jq -r '[.component, .command] | @tsv' captures/*.jsonl | sort -u
Capture log format
Each line is a JSON object:
{
"n": 1,
"ts": "2026-06-26T12:00:00.000Z",
"peer": "127.0.0.1:54321",
"dir": "IN",
"component": "0x0001",
"command": "0x0001",
"type": "REQUEST",
"seq": 1,
"error": 0,
"body_len": 42,
"raw_hex": "deadbeef...",
"tdf": "{\n \"VRSN\": 0,\n ...}"
}
Next steps (Milestone 2)
Once captures reveal component/command IDs:
- Identify the redirector request/response tag layout
- Identify Util
preAuth/postAuth/pingcommands - Identify Authentication
logincommand - Implement handlers and test with FIFA 23
Development
# Build
cargo build
# Run with verbose logging
RUST_LOG=debug cargo run --bin blaze-server -- config.toml