eccd46f52b
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>
113 lines
2.6 KiB
Markdown
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
|
|
```
|