Files
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

113 lines
2.6 KiB
Markdown

# 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.
```bash
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
```bash
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
```bash
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:
```bash
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:
```json
{
"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
```bash
# Build
cargo build
# Run with verbose logging
RUST_LOG=debug cargo run --bin blaze-server -- config.toml
```