funman300 eccd46f52b feat: scaffold fifa-blaze Blaze protocol emulator (Milestone 1)
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>
2026-06-26 15:24:50 -07:00

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:

  1. Identify the redirector request/response tag layout
  2. Identify Util preAuth / postAuth / ping commands
  3. Identify Authentication login command
  4. 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
S
Description
FIFA 23 Blaze protocol server emulator
Readme 50 KiB
Languages
Rust 100%