A 1:1 reimplementation of the "Grim 4.4" Minecraft utility client for Fabric 1.21.11.
Click GUI — default Blur background
Requirements: JDK 21 (any 21.x), Git. No IDE required.
git clone https://github.com/sequence3260/OpenGrim.git
cd OpenGrim
chmod +x gradlew
./gradlew buildMirrors: GitLab (
https://gitlab.com/sequence3260/OpenGrim) is the fallback if the GitHub repo goes down. The repository is published as a single snapshot — there is no git history to clone, only the current tree.
The analysis/ tree is ~9,100 files / ~390 MB and is not needed to compile the
mod. A partial clone (Git 2.25+) can check out only the Gradle project:
git clone --filter=blob:none --sparse https://github.com/sequence3260/OpenGrim.git
cd OpenGrim
git sparse-checkout set src gradle
chmod +x gradlew
./gradlew buildThe checkout is ~12 MB before building (root build files + src/ + gradle/).
Widen it later with git sparse-checkout add analysis, or restore a full
checkout with git sparse-checkout disable.
The mod jar lands in build/libs/opengrim-0.1.0.jar. To use it:
- Install Fabric Loader for Minecraft 1.21.11 and Fabric API (0.139.4 or newer).
- Copy the jar into
.minecraft/mods/. - Launch the game — Right Shift opens the Click GUI; modules toggle with left-click, settings expand with right-click; config saves on GUI close.
- 162 modules across 5 categories (Combat, Movement, Render, Utility, World) — combat helpers, movement utilities, ESP/render overlays, world tools
- Click GUI with full settings widgets (sliders, modes, colors, binds), HUD overlay, JSON config persistence, primary + alternate keybinds per module
- Event-driven architecture: render, packet send/receive, attack, mouse and camera hooks via a typed event bus + Fabric mixins
- 1:1 parity. Original code and assets are reused where required to match the original client's behavior and rendering.
Aggregate parity: 80.8% — the mean of all 162 per-module parity scores from
the full 2026-10-17 audit, with 24 rows re-scored on 2026-10-21, the
2026-10-24 HUD/commands/combat wave and the 2026-10-25 review fixes (median
81%, range 45–100%; 45 modules at 90% or higher). Each module is scored over its
recovered surface (decompile-visible logic + recovered constants); behavior
that lives in the original's native/VM layer is excluded from the denominator
and itemized per module. Per-module scores, gap classifications and the
divergence log: analysis/docs/PARITY.md.
Static analysis only — the original client was never executed as a game, and no game code was copied:
- Decompilation — all 1,111 obfuscated classes of the original payload were decompiled (Vineflower + CFR fallback) and remapped to readable Yarn mappings (
1.21.11+build.6). - Constant-pool break — the original encrypts every string/number literal behind native code. A sandboxed JVM driver (network-isolated, under Wine, decryptor path only) recovered 23,147 literals — real setting names, ranges, defaults and suffixes.
- Native handler mapping — a JVMTI agent logged all 6,610 native method bindings across 446 classes (which class → which native function), and all 6,603 handlers were decompiled (0 failures).
- Malware triage — every binary layer (main DLL, exit-hook, stage2, launcher) was scanned: no network, persistence, keylogging or injection indicators found.
Stats: 1,111 classes decompiled · 23,147 constants recovered · 6,610 native handlers mapped across 446 classes (6,603 decompiled, 0 failures) · 162 modules reimplemented (72 ported / 90 partial — full audit 2026-10-17; re-scores and 2026-10-25 review fixes; aggregate parity 80.8%) · 6,610/6,615 native declarations accounted for.
| Doc | Contents |
|---|---|
analysis/docs/PARITY.md |
per-module parity ledger (162 rows, status + evidence) |
analysis/specs/ |
behavior spec per module + framework contract |
analysis/ghidra/triage.md |
native binary triage (exports, protection layers, clean verdict) |
analysis/docs/PROGRESS.md |
full work log |
analysis/docs/HANDOFF.md |
environment + RE methodology (historical; current state in PROGRESS.md) |
- 14 modules diverge from the original where behavior lives in unrecoverable native code; they are implemented from the recovered settings surface + observed structure. Every divergence is itemized — with dates and original file+line evidence — in the parity ledger (
analysis/docs/PARITY.md, "Divergences" section). - Some original setting types (color pickers with presets, block/entity list editors) are simplified to the closest supported widget.
- The original's rendering shaders (chams effects, china hat) are approximated with vanilla-style overlays.
- The original's license/auth/telemetry machinery is intentionally absent — the rebuild is fully offline.
- The original's config format is a proprietary binary codec; this client uses plain JSON instead (not backwards compatible with original configs).
This repository is self-contained — everything needed to understand and continue the work lives in the tree, not in git history (the repo is published as a single snapshot):
| Path | Contents |
|---|---|
src/ |
The mod source (Fabric 1.21.11, Java 21) |
analysis/decompiled/ |
Full decompilation of the original client (Vineflower/CFR, Yarn-mapped, case-safe) |
analysis/jars/ |
Recovered jar material from every binary layer of the original |
analysis/ghidra/ |
Native triage, decrypted payload dumps, decompiled native handlers, Ghidra continuations |
analysis/traces/ |
Runtime trace artifacts (raw bulk logs excluded) |
analysis/specs/ |
Behavior spec per module + framework contract |
analysis/docs/ |
Parity ledger, work log, handoff/methodology notes |
analysis/gui-src/, analysis/artifacts/ |
Original GUI reference decompile + reference screenshots |
analysis/tools/ |
Analysis, decryption and dump tooling used during the project |
External assets (not in git — over the 100 MiB forge limit): the full research bundle open-grim-publish.tar.zst adds the three decrypted payload dumps (jna-decrypted-v2.dll, jna-decrypted-sweep.dll, jna-decrypted-invoke.dll — only their small manifest.json sidecars are tracked in analysis/ghidra/dumps/) and the original encrypted native payload (binaries/native/jna1.21.11, verify against analysis/grim-hashes.txt). Download: https://archive.org/details/open-grim-publish.
Aggregate parity is 80.8% (analysis/docs/PARITY.md). Static analysis is exhausted — everything below it lives behind the original's native/VM layer, so the remaining work is dynamic:
- Runtime dumps of the native layer — the highest-value next step. The JVMTI harness and tracer in
analysis/tools/(sandbox setup inanalysis/docs/HANDOFF.md) can be attached to the original at runtime to dump native-handler arguments, returns and state. Reconciling those dumps against the handler maps inanalysis/ghidra/recovers behavior static decompilation cannot reach — including the 14 natively-divergent modules itemized in PARITY.md's Divergences section. - Per-module runtime traces — extend
analysis/traces/(the 2026-10-17 runs) with full per-module capture to recover constants and flows the static constant-pool break missed (23,147 literals were recovered statically). - Finish the 89 partial modules — per-module status, gap classification and evidence are in PARITY.md; the porting workflow is in
.opencode/skills/port-module/SKILL.md. - 1:1 rendering effects — chams/ChinaHat-style shaders are approximated; runtime capture of the original's shader parameters would enable exact ports.
- Re-run the parity audit — methodology in
analysis/docs/HANDOFF.md; update the PARITY.md rows and the aggregate at the top of this README. - Hygiene — verify a clean
./gradlew buildon a fresh machine, add tests and CI (none yet), confirm the original assets are used with the owner's authorization.