- C 44.5%
- C++ 36.3%
- Ruby 9.5%
- Objective-C 5.1%
- Python 1.8%
- Other 2.7%
| Filename | Latest commit message | Latest commit date |
|---|---|---|
|
|
||
| .claude | ||
| .codex/skills | ||
| .git-hooks-config | ||
| .githooks | ||
| build | ||
| docs | ||
| LICENSES | ||
| notes | ||
| orig | ||
| src | ||
| tools | ||
| .gitattributes | ||
| .gitignore | ||
| AGENTS.md | ||
| CLAUDE.md | ||
| configure.py | ||
| Dockerfile | ||
| GOAL.md | ||
| Makefile | ||
| README.md | ||
| requirements.txt | ||
| THIRD_PARTY_NOTICES.md | ||
League of Legends Mac Client Decompilation
A byte-matching decompilation of the League of Legends Mac game client (Patch 4.17, Season 4, ~2013).
Project chat: Matrix room, or DM @riotzed:matrix.org.
What Is This
The goal is to reconstruct the first-party Riot game code from source so it recompiles to a byte-perfect match against the original Mach-O i386 binary. Every decompiled function is verified instruction-by-instruction against the original using objdiff.
The ~14 MB binary is roughly half Riot code and half statically-linked
third-party middleware — Scaleform/GFx (~31%), CryptoPP (~6%), Wwise audio (~4%),
plus FreeType, Lua, boost, and tinyxml. The project does not decompile that
middleware: it reuses those functions unmodified from the original binary via the
static-bake / hybrid-link path (see docs/hybrid-link.md). So the realistic
from-source target is the Riot code plus the incidental STL the compiler emits
from it — about 46% of the binary, not 100%.
What is decompiled from source:
- Riot game code + incidental STL — ~46% of the binary, the part with repo
sources under
src/Game/andsrc/UnityFiles/. This is the work.
What is reused unmodified (not decompiled):
- Third-party middleware — ~44% of the binary, baked in from the original.
- Compiler-generated glue and orig-internal helpers, likewise baked in.
The public progress headline is a percentage over a curated first-party subset,
not over the whole binary. The live progress page
has current values; for exactly what each number measures and the full
Riot-vs-third-party breakdown, see docs/metrics.md.
The binary ships with a full DWARF dSYM — function names, parameter types, struct layouts, source file paths, and line numbers. The project skeleton was generated directly from this debug info.
| Game Version | 4.17.0.244 (September 2014) |
| Compiler | Clang 3.3 (i686-apple-darwin10) |
Compilation and scoring use an exact content-locked Linux toolchain. Its
identity, non-reproducible historical build, and replacement gate are recorded
in docs/toolchain-provenance.md.
This public tree currently includes original game/debug artifacts, vendor
libraries, replay captures, an Apple SDK, and prebuilt tools. No permission to
redistribute the game/vendor artifacts is asserted, and the replay captures
contain third-party identifiers. See the factual inventory and unresolved
bring-your-own-artifact/history decisions in
docs/redistribution.md before mirroring or
redistributing the repository. Known tool notices and provenance gaps are in
THIRD_PARTY_NOTICES.md.
Building
Prerequisites: Python 3, pip install -r requirements.txt. On a fresh clone,
configure the repository guards before doing any work:
make setup-hooks # then fill the local wordlist and rerun once
The game executable, matching dSYM, and MacOSX10.6 SDK are content-locked
inputs. Verify user-supplied copies with make verify-artifacts; the complete
artifact-free linking and derivation procedure is in
docs/artifact-setup.md. The current tip still tracks
these inputs pending the documented migration/history decision.
make # Compile all source files
make report # Generate match report
make progress # Report + update progress page
make doctor # Diagnose a broken build environment
Or use the bundled Docker image (avoids host-toolchain setup; verified on Linux x86_64, expected to work on Intel macOS and WSL2, untested on Apple Silicon):
docker build -t lol-decomp .
docker run --rm --user "$(id -u):$(id -g)" \
-v "$PWD:/workspace" -w /workspace lol-decomp make
The --user flag makes build outputs owned by your host user instead of root. On SELinux hosts (Fedora/RHEL), append :Z to the volume mount (-v "$PWD:/workspace:Z"). On Windows, run from WSL or Git Bash.
Contributing
The repository does not yet have a license or inbound contribution agreement.
Contributions are paused until that policy is resolved. Do not submit patches,
third-party binaries, SDK files, captures, or game assets. The
progress page and docs/ remain available for
local research.
Acknowledgments
- objdiff by encounter — instruction-level diff tool
- decomp.dev — inspiration for the progress treemap