Kelsidavis-WoWee/docs/WARDEN_QUICK_REFERENCE.md
Kelsi 4b48fcdab2 Enhanced Warden implementation with comprehensive documentation
Added MD5 hashing and extensive testing documentation for future attempts
at supporting strict Warden servers like Warmane.

Enhancements:
- Added MD5 hash support to Crypto class (OpenSSL-based)
- Tested 6 different module ACK response formats against Warmane
- Analyzed module packet structure (37 bytes: opcode + seed + trailing)
- Enhanced debug logging for plaintext and encrypted Warden data

Documentation:
- WARDEN_IMPLEMENTATION.md: Complete implementation guide with all attempts
- WARDEN_QUICK_REFERENCE.md: Quick troubleshooting and testing guide

Test Results (Warmane):
- Empty ACK (0 bytes): Server silent
- XOR/MD5 checksum (18 bytes): Server silent
- Single byte (1 byte): Server disconnects (rejected)
- Echo trailing (20 bytes): Server silent
- Result + SHA1 (21 bytes): Server silent

Conclusion:
- Current implementation works with permissive/disabled Warden servers
- Warmane requires module execution or undocumented response format
- Full documentation provided for future reverse engineering attempts

Next steps documented:
1. Capture packets from real WoW client (protocol analysis)
2. Implement module execution engine (months of work)
3. Test with local AzerothCore server
2026-02-12 02:22:04 -08:00

4.2 KiB

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


Testing a New Server

  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
  1. Watch for server response:
After CMSG_WARDEN_DATA sent:
  - Gets SMSG_CHAR_ENUM → SUCCESS ✅
  - Connection stays open but silent → Rejected ⏸️
  - Connection closes → Rejected ❌
  1. Check logs:
tail -f logs/wowee.log | grep -i warden

Look for:

  • packetsAfterGate=0 (bad - server silent)
  • packetsAfterGate>0 (good - server responding)

Quick Fixes

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)


Trying New Response Formats

Edit src/game/game_handler.cpp around line 1850:

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:

cd build && cmake --build . -j$(nproc)
cd bin && ./wowee

Response Formats Already Tried (Warmane)

Format Bytes Result
Empty 0 Silent ⏸️
[0x00][MD5][0x01] 18 Silent ⏸️
[0x01] 1 Disconnect
[20-byte echo] 20 Silent ⏸️
[0x01][SHA1] 21 Silent ⏸️

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

// 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

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


Last Updated: 2026-02-12 Status: Working (permissive servers) | Not Working (Warmane)