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>
This commit is contained in:
@@ -0,0 +1,112 @@
|
||||
# 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
|
||||
```
|
||||
Reference in New Issue
Block a user