ModGuard
A Fabric client mod + Paper server plugin duo that verifies player modlists on join, fingerprints hacked clients by multiple methods, and gives server admins full control over what runs on their server.
ModGuard uses four independent detection methods client-side. Even if one is bypassed, the others remain active.
*.mixins.json inside each mod JAR and collects the Minecraft classes being injected into. A movement hack always targets LocalPlayer.Class.forName() checks for known hacked client classes at runtime. The class names are compiled into bytecode — they survive metadata and JAR repacking..class files inside the JAR — not the whole JAR. The compiled bytecode hash is stable across cosmetic repacks that only change metadata.modguard-1.0.0.jar into .minecraft/mods/. Requires Fabric Loader 0.18.2 and Fabric API 0.140.2. Runs silently — no UI.modguard-paper-1.0.0.jar into plugins/. Config files are created automatically on first start. No dependencies./modguard toggle required is disabled.
All commands require the modguard.admin permission (default: op). Use /modguard with no arguments to see a usage summary in-game.
-t shows full detail including version and SHA-256 hash prefix. With -t shows a tidy list of name, mod ID, and author.| Parameter | Description |
|---|---|
| <player> | Online player name (tab-completable) |
| -t | Tidy mode: name | mod id | author |
banned-mods.yml. Use * to ban every mod in the player's list at once (excluding system mods).| Parameter | Description |
|---|---|
| <player> | Online player whose modlist to search |
| <modname|modid> | Mod display name (partial match) or exact mod ID |
| * | Ban all mods in the player's list |
banned-mods.yml. Supports partial matching. Use * to clear the entire ban list.banned-mods.yml with their ID, hash prefix, and reason.| Flag | Description |
|---|---|
| --all | Do all four types (default if no flags given) |
| --hash | Ban exact JAR SHA-256 hash |
| --id | Ban mod ID (all versions) |
| --channels | Add channel fingerprint to fingerprints.yml |
| --classpath | Report detected classpath flags (already auto-blocked) |
| --mod <name> | Filter to a specific mod only |
| --reason <text> | Custom ban reason |
| --name <text> | Custom fingerprint name |
| --action kick|flag|log | Action for channel fingerprint (default: kick) |
-- at the end is automatically treated as --mod. So capture Steve --all hackedclient only captures the hackedclient mod.
flags lists all players currently flagged by channel fingerprinting (action: flag). approve clears the flag and whitelists the player for the rest of the session — they won't be re-flagged until they relog.fingerprints.yml, including their action and channel patterns.:*.fingerprints.yml immediately.| Field | Description |
|---|---|
| action | Change to kick, flag, or log |
| reason | Update the kick/flag message |
| name | Rename the fingerprint |
| addchannel | Add a channel pattern (e.g. meteor:*) |
| removechannel | Remove a channel pattern |
| addmixin | Add a mixin target class to match on |
| removemixin | Remove a mixin target class |
| addephash | Add an entrypoint class file SHA-256 hash |
| removeephash | Remove an entrypoint hash |
| Toggle | Description |
|---|---|
| required | Whether players must have the ModGuard mod installed to join. When disabled, players without the mod are allowed in silently. |
| nametags | Whether verified players get a ✔ prefix on their display name. Toggling off immediately removes the prefix from all online verified players. |
config.yml, banned-mods.yml, and fingerprints.yml without restarting the server. Shows a summary of how many entries were loaded.Each entry bans by mod ID, exact SHA-256 hash, or both. A match on either field kicks the player. Managed via /modguard ban, pardon, and capture.
Channel fingerprints detect mods by what they do rather than what they claim to be. Works even when a mod has been repacked with a different ID, name, or JAR hash.
entrypoint_hashes is written to plugins/ModGuard/modlists.log. Copy the hash from there and add it with /modguard fpedit "<name>" addephash <hash>.
All files are written to plugins/ModGuard/.
flag or log. Records which fingerprint matched and the specific channels/targets that triggered it.- Method 2 — Mixin targets: client now reads all *.mixins.json files inside mod JARs and sends the full list of injected Minecraft classes
- Method 4 — Entrypoint hashes: SHA-256 of specific compiled .class files inside mod JARs, stable across cosmetic repacks
- fpedit: new fields addmixin, removemixin, addephash, removeephash
- capture: bare word at end auto-treated as --mod filter; fpName auto-uses mod filter name
- fpadd / fpremove / fpedit: quoted name support for fingerprints with spaces
- Channel filtering: significantly expanded safe channel prefix list; channels filtered by mod namespace when --mod is set
- Chat plugin detection: auto-detects LuckPerms, EssentialsX, CMI on startup
- toggle: runtime toggle for mod requirement and name tags
- verified prefix: ✔ symbol on verified players' display names and tab list
- ban *: wildcard to ban all mods from a player's list
- pardon *: wildcard to clear the entire ban list
- capture: single command to write hash, id, channel fingerprint, and classpath report at once
- fpadd / fpremove / fpedit: full in-game fingerprint list management
- Method 3 — Classpath probes: Class.forName() checks for known hacked client classes
- Method 1 — Channel fingerprints: fingerprints.yml with wildcard channel matching
- flags / approve: staff flagging workflow for suspicious but unconfirmed players
- ban / pardon / banlist: ID and hash ban management
- check -t: tidy modlist view with name, id, and author
- Initial release: modlist collection and verification on join