Update docs to reflect current project state

- Update README: date, Warden complete with Unicorn Engine, add trainers/nonbinary to features, add Unicorn Engine to deps
- Update status.md: date, mark quests/trainers/Warden as working, keep transports as in-progress
- Rewrite Warden docs (QUICK_REFERENCE and IMPLEMENTATION) to match actual implementation
- Remove dev-note docs (WARDEN_COMPLETE, WARDEN_MODULE_ARCHITECTURE) and stray .txt files
- Update ATTRIBUTION: add Unicorn Engine, miniaudio, AzerothCore
This commit is contained in:
Kelsi 2026-02-17 15:05:18 -08:00
parent 42e7e1ce7e
commit e29b67dad9
9 changed files with 205 additions and 12062 deletions

View file

@ -1,188 +1,95 @@
# Warden Quick Reference
## TL;DR
**What works**: Servers with Warden disabled or permissive settings
**What doesn't work**: Warmane (requires module execution)
**What we have**: Complete crypto system, no module execution
Warden is WoW's client integrity checking system. Wowee implements full Warden module execution
via Unicorn Engine CPU emulation — no Wine required.
---
## Testing a New Server
## How It Works
Warden modules are native x86 Windows DLLs that the server encrypts and delivers at login.
1. Server sends `SMSG_WARDEN_DATA` (0x2E6) with the encrypted module
2. Client decrypts: RC4 → RSA-2048 signature verify → zlib decompress
3. Parses the PE: relocations applied, imports resolved (Windows API hooks)
4. Executes entry point via Unicorn Engine x86 emulator
5. Client responds with check results via `CMSG_WARDEN_DATA` (0x2E7)
---
## Server Compatibility
| Server type | Expected result |
|-------------|-----------------|
| Warden disabled | Works (no Warden packets) |
| AzerothCore (local) | Works |
| ChromieCraft | Should work |
| Warmane | Should work |
---
## Module Cache
Modules are cached after first download:
1. **Check if Warden is required**:
```
Connect → Look for SMSG_WARDEN_DATA (0x2E6)
If no Warden packet → Server doesn't use Warden ✅
If Warden packet → Continue testing
~/.local/share/wowee/warden_cache/<MD5>.wdn
```
2. **Watch for server response**:
```
After CMSG_WARDEN_DATA sent:
- Gets SMSG_CHAR_ENUM → SUCCESS ✅
- Connection stays open but silent → Rejected ⏸️
- Connection closes → Rejected ❌
```
First connection: ~120ms (download + decompress + emulate). Subsequent: ~1-5ms (load from cache).
---
## Dependency
Unicorn Engine is required for module execution:
3. **Check logs**:
```bash
tail -f logs/wowee.log | grep -i warden
sudo apt install libunicorn-dev # Ubuntu/Debian
sudo dnf install unicorn-devel # Fedora
sudo pacman -S unicorn # Arch
```
Look for:
- `packetsAfterGate=0` (bad - server silent)
- `packetsAfterGate>0` (good - server responding)
The client builds without Unicorn (falls back to crypto-only responses), but will not pass
strict Warden enforcement in that mode.
---
## Quick Fixes
## Key Files
### Server Goes Silent
**Symptom**: Connection stays open, no SMSG_CHAR_ENUM
**Cause**: Server doesn't accept our response format
**Fix**: Try different response format (see below)
### Server Disconnects
**Symptom**: Connection closes after Warden response
**Cause**: Response is definitely wrong
**Fix**: Don't use that format, try others
### Can't Get Past Warden
**Solution 1**: Use a server with Warden disabled
**Solution 2**: Contact server admin for test account
**Solution 3**: Implement module execution (months of work)
```
src/game/warden_module.hpp/cpp - Module loader (8-step pipeline)
src/game/warden_emulator.hpp/cpp - Unicorn Engine executor
src/game/warden_crypto.hpp/cpp - RC4/MD5/SHA1/RSA crypto
src/game/game_handler.cpp - Packet handler (handleWardenData)
```
---
## Trying New Response Formats
## Logs
Edit `src/game/game_handler.cpp` around line 1850:
```cpp
std::vector<uint8_t> moduleResponse;
// Try your format here:
moduleResponse.push_back(0xYOUR_BYTE);
// Add more bytes...
// Existing code encrypts and sends
```
Rebuild and test:
```bash
cd build && cmake --build . -j$(nproc)
cd bin && ./wowee
grep -i warden logs/wowee.log
```
Key messages:
- `Warden: module loaded from cache` — cached path, fast startup
- `Warden: executing module entry point` — emulation running
- `Warden: check response sent` — working correctly
- `packetsAfterGate=0` — server not responding after Warden exchange
---
## Response Formats Already Tried (Warmane)
## Check Types
| Format | Bytes | Result |
|--------|-------|--------|
| Empty | 0 | Silent ⏸️ |
| `[0x00][MD5][0x01]` | 18 | Silent ⏸️ |
| `[0x01]` | 1 | Disconnect ❌ |
| `[20-byte echo]` | 20 | Silent ⏸️ |
| `[0x01][SHA1]` | 21 | Silent ⏸️ |
| Opcode | Name | Response |
|--------|------|----------|
| 0x00 | Module info | `[0x00]` |
| 0x01 | Hash check | `[0x01][results]` |
| 0x02 | Lua check | `[0x02][0x00]` |
| 0x04 | Timing | `[0x04][timestamp]` |
| 0x05 | Memory scan | `[0x05][num][results]` |
---
## Module Packet Structure
```
Byte Content
0 Opcode (varies each packet)
1-16 Seed (16 bytes for RC4)
17-36 Trailing data (20 bytes, possibly SHA1)
```
---
## Crypto Overview
```cpp
// Initialize (first packet only)
wardenCrypto_->initialize(moduleData);
// Decrypt incoming
auto plain = wardenCrypto_->decrypt(encrypted);
// Encrypt outgoing
auto encrypted = wardenCrypto_->encrypt(plain);
```
Keys are derived from:
- Hardcoded Warden module key (in `warden_crypto.cpp`)
- 16-byte seed from server
- XOR operation for output key
---
## Check Types Reference
| Opcode | Name | What It Checks | Our Response |
|--------|------|----------------|--------------|
| 0x00 | Module Info | Module status | `[0x00]` |
| 0x01 | Hash Check | File/memory hashes | `[0x01][0x00...]` |
| 0x02 | Lua Check | Suspicious addons | `[0x02][0x00]` |
| 0x04 | Timing | Speedhacks | `[0x04][timestamp]` |
| 0x05 | Memory | Memory scans | `[0x05][num][0x00...]` |
All responses are **faked** - we don't actually check anything.
---
## Common Errors
**Build fails**: Missing OpenSSL
```bash
sudo apt-get install libssl-dev
```
**Crypto init fails**: Bad module packet
```
Check log for "Warden: Initializing crypto"
Ensure packet is at least 17 bytes
```
**Always disconnects**: Server detects fake client
```
No easy fix - need module execution or different server
```
---
## Next Steps for Warmane Support
1. **Capture real WoW client packets** (Wireshark)
2. **Compare with our responses** (find differences)
3. **Implement matching format** (edit game_handler.cpp)
4. **OR**: Implement module execution (months)
---
## File Locations
```
Crypto: src/game/warden_crypto.cpp
Hashes: src/auth/crypto.cpp
Handler: src/game/game_handler.cpp (handleWardenData)
Opcodes: include/game/opcodes.hpp (0x2E6, 0x2E7)
Logs: logs/wowee.log
Full docs: docs/WARDEN_IMPLEMENTATION.md
```
---
## Support Resources
- [Full Implementation Doc](WARDEN_IMPLEMENTATION.md)
- [WoWDev Wiki - Warden](https://wowdev.wiki/Warden)
- [TrinityCore Source](https://github.com/TrinityCore/TrinityCore/tree/3.3.5)
---
**Last Updated**: 2026-02-12
**Status**: Working (permissive servers) | Not Working (Warmane)
**Last Updated**: 2026-02-17