Caution
This SDK is not focused on hacking, cheating, or botting. It is a tool for legitimate integration — launchers, stream overlays, Discord rich presence, UI automation, and similar use cases. Though clearly most methods benefit botting use cases. Always play fair. The author is not responsible for account suspensions or bans resulting from misuse of this software.
A lightweight DLL injector and SDK that exposes internal methods of World of Warcraft 3.3.5a through a clean JSON-RPC 2.0 interface over Windows Named Pipes. Communicate with WoW from any language — Python, JavaScript, C#, Rust — by sending JSON commands to \\.\pipe\WowGameCommand.
This project was born from the need to extract real-time information from WoW (current screen, character data, map state, etc.) for an upcoming launcher — though maybe with way more features than I actually need just for a RichPresence. WoW's Lua API is very restrictive: no HTTP requests, no real-time file I/O, no way to communicate outside the game. The idea was inspired by wow-discord-rpc, a brilliant and clever project that encodes data into pixels and reads them from the screen to feed Discord's Rich Presence — it's what inspired me to create this SDK. WoWControlSDK takes a more direct approach: a lightweight injected DLL with a clean RPC interface.
This is still an early, rough version. As time goes on and I have more free time, I'll keep adding new features, events, commands, and improvements — especially to the architecture, which grew organically over time and feels a bit awkward right now.
Work in progress. Browse the docs structure at docs/ for architecture, injection guide, and detailed RPC method references.
- Lua Execution — Run arbitrary Lua in WoW's VM (
lua.evaluatewith typed returns,lua.executefire-and-forget) - Lua Globals — Read/write global variables, create table namespaces
- Unit Queries — Get health, power, position, rotation, race, class, level, GUID, target, name, auras (ghost, dead, combat, casting, etc.) for
player,target,focus,mouseover,partyN,raidN - Group/Raid — Member list, combat summary, leader GUID, cached for performance
- World State — Is in world, is in combat, zone/map ID
- Local Player — XP, max XP, AFK, DND, underwater state, ghost detection
- Thread-Safe — Lua operations use raw
lua_pcallwitherrfunc=0(safe from pipe thread) - Authentication — Login to WoW with username/password, select realm, enter world, logout, quit
- EULA/TOS Acceptance — Automate acceptance of End User License Agreements and Terms of Service
- Realm List — Query and set custom realm lists
- Screen Detection — Detect current game screen (login, character select, loading, world, etc.)
- Character Management — List and refresh characters on the realm
- Event System — Subscribe to in-game events (screen changes, world state) received in real-time over the pipe
┌─────────────┐ JSON-RPC 2.0 ┌──────────────────┐
│ Your App │ ◄──── named pipe ──── │ WoWControlSDK │
│ (Python/JS/ │ \\.\pipe\ │ (injected DLL) │
│ C#/etc.) │ WowGameCommand │ │
└─────────────┘ └────────┬─────────┘
│
┌──────────┴──────────┐
│ World of Warcraft │
│ 3.3.5a client │
└─────────────────────┘
All game memory access is isolated in the core/ layer. The rpc/ layer handles JSON serialization only — no raw addresses, no memory reads.
| Dependency | Version | Purpose |
|---|---|---|
| Microsoft Detours | v4.0.1 | API hooking (DLL injection, function detours) |
| Windows SDK | 10.0+ | Named Pipes, process management |
| CMake | 3.20+ | Build system |
| Visual Studio | 2022 | C++17 compiler |
- Visual Studio 2022 with "Desktop development with C++" workload
- CMake 3.20+
git clone https://github.com/Zerik-Official/WoWControlSDK.git
cd WoWControlSDK
cmake -B build
cmake --build build --config ReleaseOutput:
bin/release/WoWControlSDK.dll— The injected SDKbin/release/WowInjector.exe— The injector tool
WowInjector.exe --wow "C:\World of Warcraft\Wow.exe" --dll "bin\release\WoWControlSDK.dll"Tip
The included injector is recommended — it freezes the Wow.exe process during injection so the DLL is fully initialized before the game starts. However, you can use any injector you prefer, such as Cheat Engine.
Parameters:
| Argument | Description |
|---|---|
--wow <path> |
Path to Wow.exe |
--dll <path> |
Path to WoWControlSDK.dll |
--pipe <name> |
Named pipe to wait for before unfreezing (default: WowGameCommand) |
--no-pipe |
Unfreeze after --wait ms instead of waiting for a pipe |
--wait <ms> |
Milliseconds to wait when --no-pipe is active (default: 500) |
--kill |
Kill existing WoW process before starting |
--wow-args <str> |
Extra arguments for WoW.exe |
--pipe-cmd <json> |
Send a JSON-RPC command after pipe is ready (repeatable) |
An interactive Python CLI is available at tests/wowsdk_cli.py with menus for Lua execution, unit queries, group inspection, and more. Use it as a reference or starting point for your own integration.
Dependencies:
pip install pywin32Usage:
python tests/wowsdk_cli.pySend JSON-RPC 2.0 requests to the named pipe \\.\pipe\WowGameCommand:
{"jsonrpc": "2.0", "id": 1, "method": "unit.get", "params": {"token": "player"}}Response:
{"id": 1, "jsonrpc": "2.0", "result": {"exists": true, "health": 25000, "maxHealth": 25000, "name": "PlayerName", "position": {"x": 1234.5, "y": 2345.6, "z": 300.1}, "rotation": 5.23, "dead": false, "ghost": false, ...}}From any language:
Python
import win32pipe, win32file, json
pipe = win32file.CreateFile(
r"\\.\pipe\WowGameCommand",
win32file.GENERIC_READ | win32file.GENERIC_WRITE,
0, None, win32file.OPEN_EXISTING, 0, None
)
def rpc(method, params={}):
req = json.dumps({"jsonrpc": "2.0", "id": 1, "method": method, "params": params})
win32file.WriteFile(pipe, (req + "\n").encode())
_, data = win32file.ReadFile(pipe, 65536)
return json.loads(data.decode())
print(rpc("unit.get", {"token": "player"}))C#
using System.IO.Pipes;
var pipe = new NamedPipeClientStream(".", "WowGameCommand", PipeDirection.InOut);
pipe.Connect();
var writer = new StreamWriter(pipe) { AutoFlush = true };
var reader = new StreamReader(pipe);
writer.WriteLine("{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"lua.evaluate\",\"params\":{\"code\":\"return UnitName(\\\"player\\\")\"}}");
var response = reader.ReadLine();
Console.WriteLine(response);There are many more methods available. These are the most commonly used ones.
| Method | Description |
|---|---|
lua.execute |
Execute Lua (fire-and-forget) |
lua.evaluate |
Execute Lua with typed return value |
lua.getGlobal / lua.setGlobal / lua.createNamespace |
Lua global operations |
unit.get / unit.state / unit.position |
Unit data queries |
unit.mapPosition |
Unit normalized map position (party/raid only) |
group.get / group.summary |
Group/raid info |
client.login / client.enterWorld / client.logout / client.quit |
Authentication and session control |
client.getScreen / client.getDebugState |
Screen and debug state detection |
client.getRealmlist / client.setRealmlist |
Realm list management |
client.getCharacters / client.refreshCharacters |
Character list |
client.acceptAll / client.acceptEULA / client.acceptTOS |
EULA/TOS automation |
client.ping |
Connection health check |
world.getState |
World/zone state information |
object.exists / object.getType / object.isUnit / object.isPlayer |
Object inspection |
events.subscribe / events.unsubscribe / events.list |
Event system — supports native Lua events (PLAYER_LOGIN, PLAYER_ENTERING_WORLD, etc.) |
dll.toggleConsole / dll.getInfo / dll.getLogs / dll.setLogConfig |
DLL management |
Warning
Only WoW 3.3.5a (build 12340) is supported. A clean, unmodified WoW client is recommended, though lightly modded clients may also work.
Found a bug? Have a suggestion? Open an issue on GitHub, or reach out on Discord.
The project is also indexed on DeepWiki — you can ask it questions about the codebase for quick answers. It updates every 7 days.
